2016-02-28 202 views
3

我有以下項目結構:動態導入Python模塊

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: []

怎麼辦導入模塊動態?

謝謝!

回答

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) 
+0

謝謝您的幫助! –