10

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

我错过了什么?

4

2 回答 2

12

import指令不适用于可变内容(作为字符串)(请参阅此处的扩展说明),但适用于文件名。如果要动态导入,可以使用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__方法。

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

于 2017-02-22T20:54:51.117 回答
-1

你可以实现你所提议的东西但它会涉及一些非 Python 的代码。我不建议这样做:

dynamic_imports = dict()
for filename in tree:
    name = filename.replace('.py', '')
    dynamic_imports[name] = __import__(name)
于 2017-02-22T20:55:48.387 回答