2013-05-31 11 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

あなたはPythonでダイナミックモジュールのインポートを意味しますか?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 * 

このアプローチの問題は、クラスでは、互いを上書きので、2つのモジュールがFooを提供する場合、あなただけだったものを使用することができます最後に輸入された。

+0

素晴らしい!それは私のために働いた。 – ov7a

+0

上記のコードを__init__.pyファイルに入れたり、自動的にモジュールをインポートするように別の場所に移動する必要があります。 – nish

+0

まさに私が欲しかったもの。しかし、 'find_module'は3.3以降で廃止されました。 – VPfB

関連する問題