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