我有以下项目结构:

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)

gives me: []
如何动态导入模块?
谢谢!

最佳答案

你的代码有两个问题。
首先,当您编写from envs.dev1 import dev1时,您正在从dev1包导入envs.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)

10-08 11:59