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