2013-05-31 28 views
10

迪爾結構:Python:如何從dir中的所有模塊導入?

main.py 
my_modules/ 
    module1.py 
    module2.py 

module1.py:

class fooBar(): 
    .... 
class pew_pew_FooBarr() 
    .... 
... 

如何從模塊*添加所有類主沒有前綴(即使用它們類似foo = foobar的(),不是foo = my_modules.module1.fooBar())。

一個明顯的決定是在main.py是這樣寫的:

from my_modules.module1 import * 
from my_modules.module2 import * 
from my_modules.module3 import * 
... 

但我不希望當我創建新moduleN改變main.py。有沒有解決方案?

我知道導入這樣的類並不是一個好主意,但我仍然對此很好奇。

UPD:這個問題不同於這個Loading all modules in a folder in Python,因爲我的問題是加載沒有名稱空間的模塊。

+1

你是指動態模塊導入蟒蛇http://stackoverflow.com/questions/301134/dynamic-module-import-in-python? – rahul

+0

我認爲動態模塊導入是非常複雜的解決方案。 – ov7a

回答

27

my_modules文件夾中,添加__init__.py文件以使其成爲合適的包。在該文件中,可以將這些模塊中的每個模塊的全局注入__init__.py文件的全局範圍中,這使得它們在導入模塊時可用(在將全局名稱添加到__all__變量之後):

__all__ = [] 

import pkgutil 
import inspect 

for loader, name, is_pkg in pkgutil.walk_packages(__path__): 
    module = loader.find_module(name).load_module(name) 

    for name, value in inspect.getmembers(module): 
     if name.startswith('__'): 
      continue 

     globals()[name] = value 
     __all__.append(name) 

現在,而不是做:

from my_modules.class1 import Stuff 

你可以這樣做:

from my_modules import Stuff 

或者導入一切都變成了水珠人的範圍,這似乎是你想要做什麼:

from my_modules import * 

這種方法的問題是類覆蓋另一個,所以如果兩個模塊提供Foo,你只能使用一個,這是最後導入。

+0

太棒了!這對我有效。 – ov7a

+0

上述代碼可以放在__init__.py文件中,還是應該放在其他位置以便自動導入模塊。 – nish

+0

正是我想要的。但是,從3.3開始,不再使用'find_module'。 – VPfB

相關問題