Existe-t-il un moyen simple de trouver tous les modules qui font partie d'un package python? J'ai trouvé cette vieille discussion , qui n'est pas vraiment concluante, mais j'aimerais avoir une réponse définitive avant de déployer ma propre solution basée sur os.listdir ().
python
module
packages
introspection
python-import
static_rtti
la source
la source
Réponses:
Oui, vous voulez quelque chose basé sur
pkgutil
ou similaire - de cette façon, vous pouvez traiter tous les paquets de la même manière, qu'ils soient dans des œufs ou des zips ou quelque chose de similaire (où os.listdir n'aidera pas).Comment les importer aussi? Vous pouvez simplement utiliser
__import__
comme d'habitude:la source
importer
retournépkgutil.iter_modules
? Puis-je l'utiliser pour importer un module au lieu d'utiliser ce "hackish" apparent__import__(modname, fromlist="dummy")
?m = importer.find_module(modname).load_module(modname)
et puism
est le module, donc par exemple:m.myfunc()
_path_
). Il devrait y en avoir deux de chaque côté, pour un total de quatre (c'est-à-dire__path__
).Le bon outil pour ce travail est pkgutil.walk_packages.
Pour lister tous les modules de votre système:
Sachez que walk_packages importe tous les sous-packages, mais pas les sous-modules.
Si vous souhaitez lister tous les sous-modules d'un certain package, vous pouvez utiliser quelque chose comme ceci:
iter_modules ne répertorie que les modules qui ont une profondeur d'un niveau. walk_packages récupère tous les sous-modules. Dans le cas de scipy, par exemple, walk_packages renvoie
tandis que iter_modules ne renvoie que
La documentation sur pkgutil ( http://docs.python.org/library/pkgutil.html ) ne répertorie pas toutes les fonctions intéressantes définies dans /usr/lib/python2.6/pkgutil.py.
Cela signifie peut-être que les fonctions ne font pas partie de l'interface "publique" et sont susceptibles de changer.
Cependant, au moins à partir de Python 2.6 (et peut-être des versions antérieures?) Pkgutil est livré avec une méthode walk_packages qui parcourt de manière récursive tous les modules disponibles.
la source
walk_packages
est maintenant dans la documentation: docs.python.org/library/pkgutil.html#pkgutil.walk_packages_
) avant et aprèspath
- c'est-à-dire, utilisezpackage.__path__
plutôt quepackage._path_
. Il peut être plus facile d'essayer de couper et coller le code plutôt que de le retaper.package
pointe vers un package, pas un module. Les modules sont des fichiers tandis que les packages sont des répertoires. Tous les packages ont l'__path__
attribut (... sauf si quelqu'un a supprimé l'attribut pour une raison quelconque.)Cela fonctionne pour moi:
la source
Je cherchais un moyen de recharger tous les sous-modules que j'édite en direct dans mon package. C'est une combinaison des réponses / commentaires ci-dessus, j'ai donc décidé de l'afficher ici comme une réponse plutôt qu'un commentaire.
la source
Voici une façon, du haut de ma tête:
Il pourrait certainement être nettoyé et amélioré.
EDIT: Voici une version légèrement plus agréable:
REMARQUE: Cela trouvera également des modules qui ne se trouvent pas nécessairement dans un sous-répertoire du package, s'ils sont extraits dans son
__init__.py
fichier, donc cela dépend de ce que vous entendez par «partie» d'un package.la source