动态导入Python模块

3
我有以下项目结构:
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)

给我: []

如何动态导入模块?

谢谢!

1个回答

4
你的代码存在两个问题。
首先,当你写 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)

谢谢你的帮助! - Dmitry Zagorulkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接