2013-05-31 23 views
10

Dir yapısı:Python: tüm modüllerdeki direkler nasıl aktarılır?

main.py 
my_modules/ 
    module1.py 
    module2.py 

module1.py: Ben önekleri olmadan ana kadar modül * dan tüm sınıfları ekleyebilir nasıl

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

(yani foo gibi bunları kullanmak için = filanca(), foo değil = my_modules.module1.fooBar()).

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

Ama yeni moduleN oluştururken main.py değiştirmek istemiyorsanız:

Bariz bir karar böyle main.py şey yazmaktır. Bunun için çözüm var mı?

Bunun gibi sınıfları içe aktarmanın iyi bir fikir olmadığını biliyorum, ama yine de bunu merak ediyorum.

YAKINLAŞTIRMA: Bu sorun, bu bir Loading all modules in a folder in Python'dan farklıdır çünkü benim sorunum, modüllerin ad alanları olmadan yüklenmesidir.

+1

Bunu mu demek istediniz: Dinamik Modül ithalat python http://stackoverflow.com/questions/301134/dynamic-module-import-in-python? – rahul

+0

Dinamik modül ithalatı bunun için oldukça karmaşık bir çözümdür. – ov7a

cevap

27

my_modules klasöründe, uygun bir paket yapmak için __init__.py dosyasını ekleyin. Bu dosyada, modüllerin içe aktarıldığı gibi (__all__ değişkenine global adını ekledikten sonra) __init__.py dosyasının global kapsamındaki bu modüllerin her birinin globalsını enjekte edebilirsiniz: yerine yapmanın Şimdi

__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 

Sen tıpkı yapabilirsiniz:

from my_modules import Stuff 

Ya topak haline şeyi ithal etmek görünüyor al kapsamı, sen ne yapmak istediğinizi olmak:

from my_modules import * 

Bu yaklaşımdaki sorun sınıfları birbiri üzerine, böylece iki modül Foo sağlarsanız, yalnızca oldu birini kullanmak mümkün olacak olan son içe aktarıldı.

+0

Harika! Bu benim için çalıştı. – ov7a

+0

Yukarıdaki kod, __init__.py dosyasında gidebilir veya otomatik olarak modülleri içe aktarmak için başka bir yere gidebilir. – nish

+0

Tam olarak ne istediğimi. Ancak, 'find_module' 3.3'den beri kullanımdan kaldırılmıştır. – VPfB

İlgili konular