如何动态导入模块?

Dan*_*n G 9 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
Run Code Online (Sandbox Code Playgroud)

然后执行:

mod1.what_time('now') 
Run Code Online (Sandbox Code Playgroud)

它有效。

我并不总是会知道目录中有哪些模块可用。我想import如下:

tree = []
tree = os.listdir('modules')

sys.path.append('/Users/dxg/import_test/modules')

for i in tree:
  import i
Run Code Online (Sandbox Code Playgroud)

但是我收到错误:

sys.path.append('/Users/dxg/import_test/modules')
import mod1
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Uri*_*iel 10

import指令不适用于变量内容(作为字符串)(请参阅此处的扩展说明),但适用于文件名。如果要动态导入,可以使用该importlib.import_module方法:

import importlib
tree = os.listdir('modules')

...

for i in tree:
    importlib.import_module(i)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 您不能从不包含模块的目录Lib或类似的当前目录导入(将目录添加到路径无济于事,请参阅上一个链接了解原因)。最简单的解决方案是将此目录(模块)作为一个包(只需在其中放置一个空__init__.py文件),然后调用importlib.import_module('..' + i, 'modules.subpkg')或使用该__import__方法。

  • 您也可以查看此问题。它讨论了类似的情况。