Czy istnieje prosty sposób na wyświetlenie nazw wszystkich modułów w pakiecie bez używania __all__
?
Na przykład, biorąc pod uwagę ten pakiet:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Zastanawiam się, czy istnieje standardowy lub wbudowany sposób zrobienia czegoś takiego:
>>> package_contents("testpkg")
['modulea', 'moduleb']
Podejście ręczne polegałoby na iteracji ścieżek wyszukiwania modułów w celu znalezienia katalogu pakietu. Następnie można by wyświetlić listę wszystkich plików w tym katalogu, odfiltrować pliki py / pyc / pyo o unikatowych nazwach, usunąć rozszerzenia i zwrócić tę listę. Ale wydaje się, że to sporo pracy w związku z czymś, co mechanizm importu modułów już wykonuje wewnętrznie. Czy ta funkcjonalność jest gdzieś ujawniona?
imp.get_suffixes()
zamiast odręcznej listy.xml.sax
Używając python2.3 i nowszych wersji , możesz również użyć
pkgutil
modułu:EDYCJA: Zauważ, że parametr nie jest listą modułów, ale listą ścieżek, więc możesz zrobić coś takiego:
źródło
pkgutil
jest w wersji python2.3 i nowszych . Ponadto, chociażpkgutil.iter_modules()
nie będzie działać rekurencyjnie, istniejepkgutil.walk_packages()
również, który będzie powtarzał się. Jednak dzięki za wskazanie tego pakietu.iter_modules
nie działa w przypadku importu absolutnegoa.b.testpkg
? Daje mi[]
pkgutil.walk_packages()
powtarza się, daje mi to samo wyjście, copkgutil.iter_modules()
, więc myślę, że odpowiedź jest niekompletna.źródło
help()
drukuje rzeczy, nie zwraca ciągu.help()
działa. W każdym razie, wbudowanypydoc
moduł może pomóc wypluć Łańcuchhelp()
Dzielenie na strony:import pydoc; pydoc.render_doc('mypackage')
.Nie wiem, czy coś przeoczyłem, czy też odpowiedzi są nieaktualne, ale;Jak stwierdził użytkownik 815423426, działa to tylko w przypadku obiektów na żywo, a wymienione moduły to tylko moduły, które zostały wcześniej zaimportowane.
Listowanie modułów w pakiecie wydaje się naprawdę łatwe przy użyciu inspect :
źródło
imported = import importlib; importlib.import_module('myproj.mymod.mysubmod')
.__import__
importuje moduł najwyższego poziomu, zobacz dokumentację .import inspect, mypackage
i wtedyinspect.getmembers(my_package, inspect.ismodule)
dostaję pustą listę, choć na pewno mają różne moduły w nim.import my_package.foo
a nie tylkoimport mypackage
, w takim przypadku wracafoo
. Ale to mija się z celemTo jest wersja rekurencyjna, która działa z Pythonem 3.6 i nowszymi wersjami:
źródło
os.scandir
jako menedżera kontekstu zamiast bezpośredniego iterowania po wpisach wyników?close
zostanie wywołany, gdy skończysz z nim, aby upewnić się, że wszystkie wstrzymane zasoby zostaną zwolnione.re
zamiast tego wyświetla listę wszystkich pakietów, ale dodaje jere.
do wszystkichNa podstawie przykładu Cdleary, oto rekurencyjna ścieżka do listy wersji dla wszystkich modułów podrzędnych:
źródło
Powinno to zawierać listę modułów:
źródło
Jeśli chcesz zobaczyć informacje o swoim pakiecie poza kodem Pythona (z wiersza poleceń), możesz użyć do tego pydoc.
Będziesz miał ten sam rezultat, co pydoc, ale wewnątrz tłumacza korzystającego z pomocy
źródło
źródło
logging
pakiecie Pythona, aby zobaczyć, o co mi chodzi. Rejestrowanie zawiera dwa moduły: handlers i config. Twój kod zwróci listę 66 elementów, która nie zawiera tych dwóch nazw.print dir (moduł)
źródło