2013-05-31 17 views
10

Dir:Python: come importare da tutti i moduli in dir? Struttura

main.py 
my_modules/ 
    module1.py 
    module2.py 

module1.py:

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

Come posso aggiungere tutte le classi dal modulo * a principale senza prefissi (cioè per usarli come foo = foobar(), non pippo = my_modules.module1.fooBar()).

Una decisione ovvia è quella di scrivere in qualcosa di simile main.py:

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

Ma io non voglio cambiare main.py quando creo nuovi modulen. C'è una soluzione per questo?

So che non è una buona idea importare classi come questa, ma ne sono ancora curioso.

UPD: Questa domanda differisce da questa Loading all modules in a folder in Python, perché il mio problema è caricare moduli senza spazi dei nomi.

+1

Intendi l'importazione di Dynamic Module in python http://stackoverflow.com/questions/301134/dynamic-module-import-in-python? – rahul

+0

L'importazione dinamica dei moduli è una soluzione abbastanza complessa per questo, penso. – ov7a

risposta

27

Nella cartella my_modules, aggiungere un file __init__.py per renderlo un pacchetto adeguato. In tale file, è possibile iniettare i globali di ciascuno di questi moduli nell'ambito globale del file __init__.py, che li rende disponibili quando il modulo viene importato (dopo aver aggiunto anche il nome della variabile globale alla variabile __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) 

Ora, invece di fare:

from my_modules.class1 import Stuff 

Devi solo può fare:

from my_modules import Stuff 

o per importare tutto in glob al campo di applicazione, che sembra essere ciò che si vuole fare:

from my_modules import * 

Il problema di questo approccio è classi sovrascrivono l'un l'altro, quindi se due moduli forniscono Foo, sarete solo in grado di utilizzare quello che era importato per ultimo

+0

Ottimo! Questo ha funzionato per me. – ov7a

+0

il codice precedente può essere inserito nel file __init__.py o dovrebbe andare da qualche altra parte in modo da importare automaticamente i moduli. – nish

+0

Esattamente quello che volevo. Tuttavia, 'find_module' è deprecato dal 3.3. – VPfB

Problemi correlati