我正在编写一个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)
该函数导入模块
name
,可能使用给定的
globals
和
locals
以确定如何在包上下文中解释该名称。这个
fromlist
给出应从以下模块导入的对象或子模块的名称:
名称
.
来源:
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()
这工作得很好,我只是想知道是否有更习惯的方法来完成我们用这段代码所做的事情。
请注意,我特别不想使用鸡蛋或扩展点。这不是一个开源项目,我不希望有“插件”。重点是简化主应用程序代码,并消除每次添加新命令模块时对其进行修改的需要。
另请参见:
How do I import a module given the full path?