动态导入 python 模块

Dynamically import python module

我有以下项目结构:

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

dev1 我有以下内容:

from ..default.default import BaseInventory

在dynamic_inventory中:

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)

gives me: []

如何动态导入模块?

谢谢!

您的代码有两个问题。

首先,当您编写 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 没有定义任何 class.

将所有内容放在一起:

import inspect

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