如何導入給定名稱的模塊?我正在編寫一個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
提交
取消
