web-dev-qa-db-ja.com

Python:dir内のすべてのモジュールからインポートする方法は?

方向構造:

main.py
my_modules/
   module1.py
   module2.py

module1.py:

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

Module *からmainにプレフィックスなしですべてのクラスを追加するにはどうすればよいですか(つまり、foo = my_modules.module1.fooBar()ではなくfoo = fooBar()のように使用します)。

明らかな決定は、main.pyに次のようなものを書き込むことです。

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

しかし、新しいmoduleNを作成するときにmain.pyを変更したくありません。そのための解決策はありますか?

このようなクラスをインポートするのは良い考えではないことは知っていますが、それでも興味があります。

UPD:この質問はこれとは異なります Pythonのフォルダーにすべてのモジュールをロードする 私の問題は名前空間なしでモジュールをロードすることです。

11
ov7a

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を提供する場合、最後にインポートされたもののみを使用できます。

30
Blender