如何导入给定名称的模块?我正在编写一个Python应用程序,它以命令作为参数,例如:$ python myapp.py command1我希望应用程序是可扩展的,也就是说,能够添加实现新命令的新模块,而不必更改主应用程序源代码。这棵树看起来像:myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py因此,我希望应用程序在运行时找到可用的命令模块,并执行适当的命令模块。Python定义了进口函数,该函数接受模块名称的字符串:_import_(名称,globals=无,局部变量=无,from list=(),level=0)函数导入模块名,可能使用给定的全局和局部变量来确定如何在包上下文中解释该名称。FROM列表给出了应该根据名称从模块导入的对象或子模块的名称。资料来源:https:/docs.python.org/3/Library/function s.html#进口所以目前我有这样的事情:command = sys.argv[1]try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])except ImportError:
# Display error messagecommand_module.run()这很好,我只是想知道是否有一种更惯用的方法来完成我们使用这段代码所做的工作。请注意,我特别不想进入使用鸡蛋或扩展点。这不是一个开源项目,我不希望有“插件”。重点是简化主应用程序代码,并消除每次添加新命令模块时修改它的需要。
4 回答
子衿沉夜
TA贡献1828条经验 获得超3个赞
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
注: IMP因为Python3.4支持 进口库
imp.load_source(name, path)imp.load_compiled(name, path)
import impimport osdef load_from_file(filepath): class_inst = None expected_class = 'MyClass' mod_name,file_ext = os.path.splitext(os.path.split(filepath)[-1]) if file_ext.lower() == '.py': py_mod = imp.load_source(mod_name, filepath) elif file_ext.lower() == '.pyc': py_mod = imp.load_compiled(mod_name, filepath) if hasattr(py_mod, expected_class): class_inst = getattr(py_mod, expected_class)() return class_inst
添加回答
举报
0/150
提交
取消