如何动态导入模块?

时间:2017-02-22 20:21:10

标签: python import module dynamic-import

我正在尝试在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

我希望我错过了一些简单的事情。感谢任何建议。

3 个答案:

答案 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__方法。

    < / LI>
  • 您也可以查看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&lt; 3.6

,则将换算的字符串插值换掉