我正在尝试在Python中动态导入模块。现在,我有一个名为'modules'的目录,里面有两个文件;它们是mod1.py和mod2.py.它们是返回时间的简单测试函数(即mod1.what_time('now')
返回当前时间)。
从我的主应用程序中,我可以导入如下:
sys.path.append('/Users/dxg/import_test/modules')
import mod1
然后执行:
mod1.what_time('now')
它有效。
我并不总是知道目录中有哪些模块可用。我想import
如下:
tree = []
tree = os.listdir('modules')
sys.path.append('/Users/dxg/import_test/modules')
for i in tree:
import i
然而我收到错误:
ImportError: No module named i
我希望我错过了一些简单的事情。感谢任何建议。
答案 0 :(得分:3)
import
指令不适用于变量内容(作为字符串)(请参阅扩展说明here),但使用文件名。如果要动态导入,可以使用importlib.import_module
方法:
import importlib
tree = os.listdir('modules')
...
for i in tree:
importlib.import_module(i)
注意:
您无法从Lib
下未包含模块的目录或当前目录中导入(将目录添加到路径中获取帮助,请参阅上一个链接了解原因)。最简单的解决方案是将此目录(模块)作为一个包(只需在其中删除一个空的__init__.py
文件),然后调用importlib.import_module('..' + i, 'modules.subpkg')
或使用__import__
方法。
您也可以查看this question。它讨论了类似的情况。
答案 1 :(得分:0)
你可以实现之类的你提出的建议,但它会涉及一些非pythonic代码。我不建议这样做:
dynamic_imports = dict()
for filename in tree:
name = filename.replace('.py', '')
dynamic_imports[name] = __import__(name)
答案 2 :(得分:-1)
超级简单的方法:
exec(f'from {module} import *')
如果您使用的是Python< 3.6
,则将换算的字符串插值换掉