我正在编写一个将命令作为参数的 Python 应用程序,例如:
$ python myapp.py command1
我希望应用程序是可扩展的,也就是说,能够添加实现新命令的新模块,而无需更改主应用程序源。这棵树看起来像:
myapp/ __init__.py commands/ __init__.py command1.py command2.py foo.py bar.py
所以我希望应用程序在运行时找到可用的命令模块并执行适当的命令模块。
Python 定义了一个 import 函数,它接受一个字符串作为模块名称:
import(name, globals=None, locals=None, fromlist=(), level=0) 该函数导入模块名称,可能使用给定的全局变量和局部变量来确定如何在包上下文中解释名称。fromlist 给出了应该从 name 给出的模块导入的对象或子模块的名称。 来源:https : **//docs.python.org/3/library/functions.html#import**
import(name, globals=None, locals=None, fromlist=(), level=0)
该函数导入模块名称,可能使用给定的全局变量和局部变量来确定如何在包上下文中解释名称。fromlist 给出了应该从 name 给出的模块导入的对象或子模块的名称。
来源:https : **//docs.python.org/3/library/functions.html#import**
所以目前我有类似的东西:
command = sys.argv[1] try: command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"]) except ImportError: # Display error message command_module.run()
这工作得很好,我只是想知道是否可能有一种更惯用的方式来完成我们使用这段代码所做的事情。
请注意,我特别不想使用鸡蛋或扩展点。这不是一个开源项目,我不希望有“插件”。重点是简化主应用程序代码,并且无需在每次添加新命令模块时对其进行修改。
对于早于 2.7/3.1 的 Python,这几乎就是您的操作方式。
对于较新的版本,请参阅importlib.import_modulePython 2和Python 3。
importlib.import_module
exec如果您愿意,也可以使用。
exec
或者使用__import__您可以通过执行以下操作导入模块列表:
__import__
>>> moduleNames = ['sys', 'os', 're', 'unittest'] >>> moduleNames ['sys', 'os', 're', 'unittest'] >>> modules = map(__import__, moduleNames)
直接从Dive Into Python撕下来。