Gibt es eine einfache Möglichkeit, die Namen aller Module in einem Paket aufzulisten, ohne __all__
zu verwenden?Gibt es eine Standardmethode, Namen von Python-Modulen in einem Paket aufzulisten?
Zum Beispiel gegeben dieses Paket:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Ich frage mich, ob es eine Standard- oder integrierte Möglichkeit ist, so etwas zu tun:
>>> package_contents("testpkg")
['modulea', 'moduleb']
Der manuelle Ansatz wäre, Durchlaufen der Modulsuchpfade, um das Verzeichnis des Pakets zu finden. Man könnte dann alle Dateien in diesem Verzeichnis auflisten, die py/pyc/pyo-Dateien mit eindeutigen Namen herausfiltern, die Erweiterungen entfernen und diese Liste zurückgeben. Aber das scheint eine Menge Arbeit für etwas zu sein, was der Modulimport-Mechanismus bereits intern tut. Ist diese Funktionalität überall verfügbar?
Ich würde "und __init__.py" zum finalen "if" hinzufügen, da __init__.py nicht wirklich Teil des Pakets ist. Und .pyo ist eine andere gültige Erweiterung. Abgesehen davon ist die Verwendung von imp.find_module eine wirklich gute Idee; Ich denke, das ist die richtige Antwort. – DNS
Ich stimme nicht zu - Sie können __init__ direkt importieren, also warum Spezialfall es? Es ist sicher nicht speziell genug, um die Regeln zu brechen. ;-) – cdleary
Sie sollten wahrscheinlich 'imp.get_suffixes()' anstelle Ihrer handschriftlichen Liste verwenden. – itsadok