2013-05-31 12 views
10

ReżPython: jak zaimportować ze wszystkich modułów w katalogu? Struktura

main.py 
my_modules/ 
    module1.py 
    module2.py 

module1.py:

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

Jak mogę dodać wszystkich klas z modułu * do głównej bez przedrostków (tj z nich korzystać jak foo = fooBar(), a nie foo = moje_modules.module1.fooBar()).

Oczywistym decyzja jest napisać w main.py coś takiego:

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

Ale nie chcę zmienić main.py gdy tworzę nowy moduleN. Czy istnieje rozwiązanie?

Wiem, że importowanie takich klas nie jest dobrym pomysłem, ale wciąż jestem ciekawy.

UPD: To pytanie różni się od tego Loading all modules in a folder in Python, ponieważ moim problemem jest ładowanie modułów bez przestrzeni nazw.

+1

Czy masz na myśli import modułu dynamicznego w pythonie http://stackoverflow.com/questions/301134/dynamic-module-import-in-python? – rahul

+0

Import modułu dynamicznego jest dla mnie dość złożonym rozwiązaniem. – ov7a

Odpowiedz

27

W folderze my_modules dodaj plik __init__.py, aby utworzyć odpowiedni pakiet. W tym pliku można wprowadzić globale każdego z tych modułów w zasięgu globalnym pliku __init__.py, co powoduje, że są one dostępne podczas importowania modułu (po dodaniu nazwy globalnej do zmiennej __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) 

teraz, zamiast robić:

from my_modules.class1 import Stuff 

można po prostu zrobić:

from my_modules import Stuff 

albo zaimportować wszystko do glob Zakres inni, co wydaje się być to, co chcesz zrobić:

from my_modules import * 

Problem z tego podejścia jest zastąpienie klasy nawzajem, więc jeśli dwa moduły zapewniają Foo, będziesz mógł korzystać tylko ten, który zaimportowany ostatni.

+0

Świetnie! To działało dla mnie. – ov7a

+0

czy powyższy kod może być w pliku __init__.py, czy powinien zostać przeniesiony gdzie indziej, aby automatycznie importować moduły? – nish

+0

Dokładnie to, co chciałem. Jednak "find_module" jest przestarzałe od wersji 3.3. – VPfB

Powiązane problemy