Gibt es eine einfache Möglichkeit, alle Module zu finden, die Teil eines Python-Pakets sind? Ich habe diese alte Diskussion gefunden , die nicht wirklich schlüssig ist, aber ich hätte gerne eine eindeutige Antwort, bevor ich meine eigene Lösung basierend auf os.listdir () herausbringe.
python
module
packages
introspection
python-import
static_rtti
quelle
quelle
Antworten:
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).Wie importiere ich sie auch? Sie können einfach
__import__
wie gewohnt verwenden:quelle
importer
zurückgegebenpkgutil.iter_modules
? Kann ich damit ein Modul importieren, anstatt dieses scheinbar "hackisch" zu verwenden__import__(modname, fromlist="dummy")
?m = importer.find_module(modname).load_module(modname)
und dannm
ist das Modul, also zum Beispiel:m.myfunc()
_path_
). Auf jeder Seite sollten sich zwei befinden, also insgesamt vier (dh__path__
).Das richtige Werkzeug für diesen Job ist pkgutil.walk_packages.
So listen Sie alle Module auf Ihrem System auf:
Beachten Sie, dass walk_packages alle Unterpakete importiert, jedoch keine Submodule.
Wenn Sie alle Submodule eines bestimmten Pakets auflisten möchten, können Sie Folgendes verwenden:
iter_modules listet nur die Module auf, die eine Ebene tief sind. walk_packages ruft alle Submodule ab. Im Fall von scipy wird beispielsweise walk_packages zurückgegeben
während iter_modules nur zurückgibt
In der Dokumentation zu pkgutil ( http://docs.python.org/library/pkgutil.html ) sind nicht alle in /usr/lib/python2.6/pkgutil.py definierten interessanten Funktionen aufgeführt.
Vielleicht bedeutet dies, dass die Funktionen nicht Teil der "öffentlichen" Schnittstelle sind und Änderungen unterliegen.
Zumindest ab Python 2.6 (und möglicherweise früheren Versionen?) Liefert pkgutil jedoch eine walk_packages-Methode, die alle verfügbaren Module rekursiv durchläuft.
quelle
walk_packages
ist jetzt in der Dokumentation: docs.python.org/library/pkgutil.html#pkgutil.walk_packages_
) vor und nachpath
- das ist verwendenpackage.__path__
stattpackage._path_
. Es ist möglicherweise einfacher, den Code auszuschneiden und einzufügen, als ihn erneut einzugeben.package
auf ein Paket zeigt, nicht auf ein Modul. Module sind Dateien, während Pakete Verzeichnisse sind. Alle Pakete haben das__path__
Attribut (... es sei denn, jemand hat das Attribut aus irgendeinem Grund gelöscht.)Das funktioniert bei mir:
quelle
Ich suchte nach einer Möglichkeit, alle Submodule, die ich bearbeite, live in meinem Paket neu zu laden. Es ist eine Kombination der obigen Antworten / Kommentare, daher habe ich beschlossen, sie hier als Antwort und nicht als Kommentar zu veröffentlichen.
quelle
Hier ist eine Möglichkeit, die mir aus dem Kopf geht:
Es könnte sicherlich aufgeräumt und verbessert werden.
EDIT: Hier ist eine etwas schönere Version:
HINWEIS: Hier werden auch Module gefunden, die sich möglicherweise nicht unbedingt in einem Unterverzeichnis des Pakets befinden, wenn sie in die
__init__.py
Datei des Pakets gezogen werden. Dies hängt also davon ab, was Sie unter "Teil" eines Pakets verstehen.quelle