web-dev-qa-db-fra.com

Liste tous les modules qui font partie d'un package python?

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 ().

91
static_rtti

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
133
u0b34a0f6ae

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.

44
unutbu

Cela fonctionne pour moi:

import types

for key, obj in nltk.__dict__.iteritems():
    if type(obj) is types.ModuleType: 
        print key
2
DarinP