Python-如何导入给定名称的模块为字符串?

我正在编写一个以命令作为参数的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给出了应从名称给定的模块中导入的对象或子模块的名称。

来源: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_module For Python 2和Python 3。

如果你愿意,也可以使用exec。

或者使用“导入”可以通过执行以下操作导入模块列表:

>>> moduleNames = ['sys', 'os', 're', 'unittest'] 

>>> moduleNames

['sys', 'os', 're', 'unittest']

>>> modules = map(__import__, moduleNames)

以上是 Python-如何导入给定名称的模块为字符串? 的全部内容, 来源链接: utcz.com/qa/423423.html

回到顶部