Gibt es eine einfache Möglichkeit, die Namen aller Module in einem Paket aufzulisten, ohne sie zu verwenden __all__
?
Zum Beispiel angesichts dieses Pakets:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Ich frage mich, ob es einen Standard oder eine integrierte Methode gibt, um so etwas zu tun:
>>> package_contents("testpkg")
['modulea', 'moduleb']
Der manuelle Ansatz besteht darin, die Modulsuchpfade zu durchlaufen, um das Verzeichnis des Pakets zu finden. Man könnte dann alle Dateien in diesem Verzeichnis auflisten, die eindeutig benannten py / pyc / pyo-Dateien herausfiltern, die Erweiterungen entfernen und diese Liste zurückgeben. Dies scheint jedoch eine Menge Arbeit für etwas zu sein, das der Modulimportmechanismus bereits intern erledigt. Ist diese Funktionalität irgendwo verfügbar?
imp.get_suffixes()
anstelle Ihrer handgeschriebenen Liste verwenden.xml.sax
Mit Python2.3 und höher können Sie auch das
pkgutil
Modul verwenden:BEARBEITEN: Beachten Sie, dass der Parameter keine Liste von Modulen, sondern eine Liste von Pfaden ist. Daher möchten Sie möglicherweise Folgendes tun:
quelle
pkgutil
gibt es in python2.3 und höher tatsächlich . Auch währendpkgutil.iter_modules()
nicht rekursiv arbeiten, gibt es einepkgutil.walk_packages()
als auch, was wird Rekursion. Vielen Dank für den Hinweis auf dieses Paket.iter_modules
funktioniert das nicht für den absoluten Importa.b.testpkg
? Es gibt mir[]
pkgutil.walk_packages()
wiederkehrt, es gibt mir die gleiche Ausgabe wiepkgutil.iter_modules()
, daher denke ich, dass die Antwort unvollständig ist.quelle
help()
druckt Sachen, es wird keine Zeichenfolge zurückgegeben.help()
funktioniert. Auf jeden Fall kann das eingebautepydoc
Modul dabei helfen, die Zeichenfolge auszuspucken, diehelp()
paginiert :import pydoc; pydoc.render_doc('mypackage')
.Ich weiß nicht, ob ich etwas übersehen habe oder ob die Antworten nur veraltet sind, aber;Wie von user815423426 angegeben, funktioniert dies nur für Live-Objekte und die aufgelisteten Module sind nur Module, die zuvor importiert wurden.
Das Auflisten von Modulen in einem Paket scheint mit inspect wirklich einfach zu sein :
quelle
imported = import importlib; importlib.import_module('myproj.mymod.mysubmod')
.__import__
importiert das Modul der obersten Ebene, siehe Dokumentation .import inspect, mypackage
und danninspect.getmembers(my_package, inspect.ismodule)
bekomme ich eine leere Liste, obwohl ich sicherlich verschiedene Module darin habe.import my_package.foo
und nicht nurimport mypackage
, in welchem Fall es dann zurückkehrtfoo
. Aber das macht den ZweckDies ist eine rekursive Version, die mit Python 3.6 und höher funktioniert:
quelle
os.scandir
als Kontextmanager, anstatt die Ergebniseinträge direkt zu durchlaufen?close
es aufgerufen wird, wenn Sie damit fertig sind, um sicherzustellen, dass alle gehaltenen Ressourcen freigegeben werden.re
stattdessen werden alle Pakete aufgelistet, aberre.
zu allenBasierend auf dem Beispiel von cdleary finden Sie hier einen rekursiven Versionslistenpfad für alle Submodule:
quelle
Dies sollte die Module auflisten:
quelle
Wenn Sie Informationen zu Ihrem Paket außerhalb des Python-Codes (über eine Eingabeaufforderung) anzeigen möchten, können Sie pydoc verwenden.
Sie haben das gleiche Ergebnis wie pydoc, jedoch innerhalb des Dolmetschers mithilfe der Hilfe
quelle
quelle
logging
Paket aus, um zu sehen, was ich meine. Die Protokollierung enthält zwei Module: Handler und Konfiguration. Ihr Code gibt eine Liste mit 66 Elementen zurück, die diese beiden Namen nicht enthält.Druckverzeichnis (Modul)
quelle