Existe-t-il un moyen simple de trouver tous les modules qui font partie d'un package python? J'ai trouvé cette ancienne discussion , ce qui n'est pas vraiment concluant, mais je aimerais avoir une réponse définitive avant de déployer ma propre solution basée sur os.listdir ().
Oui, vous voulez quelque chose basé sur pkgutil
ou similaire - de cette façon, vous pouvez traiter tous les packages de la même manière, qu'ils soient dans des œufs ou des zips ou plus (où os.listdir n'aidera pas).
import pkgutil
# this is the package we are inspecting -- for example 'email' from stdlib
import email
package = email
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__):
print "Found submodule %s (is a package: %s)" % (modname, ispkg)
Comment les importer aussi? Vous pouvez simplement utiliser __import__
comme d'habitude:
import pkgutil
# this is the package we are inspecting -- for example 'email' from stdlib
import email
package = email
prefix = package.__+ "."
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix):
print "Found submodule %s (is a package: %s)" % (modname, ispkg)
module = __import__(modname, fromlist="dummy")
print "Imported", module
Le bon outil pour ce travail est pkgutil.walk_packages.
Pour répertorier tous les modules de votre système:
import pkgutil
for importer, modname, ispkg in pkgutil.walk_packages(path=None, onerror=lambda x: None):
print(modname)
Sachez que walk_packages importe tous les sous-packages, mais pas les sous-modules.
Si vous souhaitez répertorier tous les sous-modules d'un certain package, vous pouvez utiliser quelque chose comme ceci:
import pkgutil
import scipy
package=scipy
for importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__,
prefix=package.__name__+'.',
onerror=lambda x: None):
print(modname)
iter_modules répertorie uniquement les modules qui sont à un niveau. walk_packages récupère tous les sous-modules. Dans le cas de scipy, par exemple, walk_packages renvoie
scipy.stats.stats
tandis que iter_modules ne renvoie que
scipy.stats
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 d'être modifiées.
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 récursivement tous les modules disponibles.
Cela fonctionne pour moi:
import types
for key, obj in nltk.__dict__.iteritems():
if type(obj) is types.ModuleType:
print key