python - 动态导入python模块

标签 python python-2.6

我有以下项目结构:

python/
..core/
..envs/
  ..default/
  ....__init__
  ....default.py
  ..dev1/
  ....__init__
  ....dev1.py
dynamic_inventory.py

dev1 我有以下内容:

from ..default.default import BaseInventory

在动态库存中:

import inspect
from envs.dev1 import dev1
print inspect.getmembers(dev1, inspect.isclass)

它给了我正确的代码:

> [('BaseInventory', <class 'envs.default.default.BaseInventory'>),
> ('BatchProcessor', <class 'envs.dev1.dev1.BatchProcessor'>), ...

但动态地:

import inspect

sys.path.append("python/envs")
m = __import__("dev1")
print inspect.getmembers(m, inspect.isclass)

给我:[]

如何动态导入模块?

谢谢!

最佳答案

您的代码有两个问题。

首先,当您编写 from envs.dev1 import dev1 时,您是从 envs.dev1 包中导入 dev1。但是使用 __import__("dev1"),您将其作为独立模块导入。

其次:使用 sys.path.append("python/envs"); __import__("dev1") 您正在导入 python/envs/dev1/__init__.py,因为 python/envs 目录包含 dev1 目录。但是你想要 python/envs/dev1/dev1.py 文件。这就是您得到一个空列表的原因:您的 __init__.py 没有定义任何类。

将所有内容放在一起:

import inspect

# no sys.path manipulation
dev1 = __import__('envs.dev1.dev1', fromlist=['dev1'])
print inspect.getmembers(dev1, inspect.isclass)

关于python - 动态导入python模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35682178/

相关文章:

python - 在两个列表中循环

python - 使用 TypedChoiceField 的 FormSet 不会每 ~2000 个请求强制转换为 int

python - python中正则表达式必须以字母开头并以数字结尾

python - Scipy.optimize.l_bfgs_b : why does it compute several time the same function value?

python - 为什么Python既有格式函数又有格式方法

python - 如何使用前缀选项解析 python 2.6 中的参数作为-f file.xml

python - 如何在 PyQt4 GUI 上显示希腊字符?

python - 找不到名为 zlib 的模块

python - 如何统一获取类和函数的字符串表示?

python - 在 Python 3 CGI 中使用 matplotlib