web-dev-qa-db-de.com

Listen Sie alle Module auf, die Teil eines python -Pakets sind.

Gibt es eine einfache Möglichkeit, alle Module zu finden, die Teil eines python) - Pakets sind? Ich habe diese alte Diskussion gefunden, was nicht wirklich schlüssig ist, aber ich würde gerne eine definitive Antwort haben, bevor ich meine eigene Lösung basierend auf os.listdir () einführe.

91
static_rtti

Ja, Sie möchten etwas basierend auf pkgutil oder ähnlichem - auf diese Weise können Sie alle Pakete gleich behandeln, unabhängig davon, ob sie sich in Eiern oder Reißverschlüssen befinden oder nicht (wobei os.listdir nicht hilft).

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)

Wie importiere ich sie auch? Sie können einfach __import__ wie normal:

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

Das richtige Werkzeug für diesen Job ist pkgutil.walk_packages.

So listen Sie alle Module auf Ihrem System auf:

import pkgutil
for importer, modname, ispkg in pkgutil.walk_packages(path=None, onerror=lambda x: None):
    print(modname)

Beachten Sie, dass walk_packages alle Unterpakete, jedoch keine Submodule importiert.

Wenn Sie alle Submodule eines bestimmten Pakets auflisten möchten, können Sie Folgendes verwenden:

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 listet nur die Module auf, die eine Ebene tief sind. walk_packages holt alle Submodule. Im Fall von scipy beispielsweise wird walk_packages zurückgegeben

scipy.stats.stats

während iter_modules nur zurückgibt

scipy.stats

In der Dokumentation zu pkgutil ( http://docs.python.org/library/pkgutil.html ) sind nicht alle interessanten Funktionen aufgeführt, die in /usr/lib/python2.6/pkgutil.py definiert sind.

Möglicherweise bedeutet dies, dass die Funktionen nicht Teil der "öffentlichen" Schnittstelle sind und Änderungen unterliegen.

Allerdings enthält pkgutil ab Python 2.6 (und möglicherweise frühere Versionen?)) Eine walk_packages-Methode, die alle verfügbaren Module rekursiv durchläuft.

44
unutbu

Das funktioniert bei mir:

import types

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