2010-03-29 5 views
1

J'ai un paquet avec quelques modules, chaque module a une classe (ou quelques classes) définie dedans. Je dois obtenir la liste de tous les modules dans le paquet. Existe-t-il une API pour cela en python?python: liste les modules dans le paquet

Voici la structure du fichier:

\pkg\ 
\pkg\__init__.py 
\pkg\module1.py -> defines Class1 
\pkg\module2.py -> defines Class2 
\pkg\module3.py -> defines Class3 and Class31 

à l'intérieur module1 je dois obtenir la liste des modules au sein pkg, puis importer toutes les classes définies dans ces modules

Mise à jour 1: Ok, après avoir considéré les réponses et les commentaires ci-dessous, j'ai pensé que ce n'est pas facile de répondre à mes besoins. Afin d'avoir le code que j'ai proposé ci-dessous fonctionnant, tous les modules devraient être explicitement importés au préalable.

Alors maintenant le nouveau concept: Comment obtenir la liste des modules dans un package sans charger les modules? Utilisation de l'API python, c'est-à-dire - sans répertorier tous les fichiers dans le dossier du package?

Merci ak

Répondre

0

ok, cela était en fait assez simple:

import pkg 

sub_modules = (         
    pkg.__dict__.get(a) for a in dir(pkg) 
    if isinstance(        
     pkg.__dict__.get(a), types.ModuleType 
    )           
)    

for m in sub_modules:          
    for c in (            
     m.__dict__.get(a) for a in dir(m)     
     if isinstance(m.__dict__.get(a), type(Base)) 
    ):   
     """ c is what I needed """ 
+3

Prenez note que les modules du paquet ne sont pas ajoutés au dictionnaire du paquet à moins qu'ils soient importés. –

+0

ah, donc ce qui suit est également nécessaire, non? à partir de pkg import * –

+0

Non, car '*' apparaît dans le dict du paquet. Importez les modules explicitement, ou faites-les importer par le paquet. –

1

Une approche ad hoc est la liste des fichiers dans le répertoire, importer chaque fichier dynamiquement avec __import__ et ensuite la liste des classes du module résultant.

Questions connexes