Czy istnieje prosty sposób na znalezienie wszystkich modułów, które są częścią pakietu Pythona? Znalazłem tę starą dyskusję , która nie jest do końca rozstrzygająca, ale chciałbym uzyskać ostateczną odpowiedź, zanim wdrożę własne rozwiązanie oparte na os.listdir ().
python
module
packages
introspection
python-import
static_rtti
źródło
źródło
Odpowiedzi:
Tak, chcesz czegoś opartego
pkgutil
lub podobnego - w ten sposób możesz traktować wszystkie pakiety jednakowo, niezależnie od tego, czy są w jajkach, czy w suwakach (gdzie os.listdir nie pomoże).Jak je też zaimportować? Możesz po prostu użyć
__import__
normalnie:źródło
importer
zwracanepkgutil.iter_modules
? Czy mogę go użyć do zaimportowania modułu zamiast używać tego pozornie „hakerskiego”__import__(modname, fromlist="dummy")
?m = importer.find_module(modname).load_module(modname)
a potemm
jest moduł, a więc na przykład:m.myfunc()
_path_
.). Powinny być dwa po obu stronach, w sumie cztery (tj__path__
.).Odpowiednim narzędziem do tego zadania jest pkgutil.walk_packages.
Aby wyświetlić wszystkie moduły w systemie:
Należy pamiętać, że walk_packages importuje wszystkie podpakiety, ale nie moduły podrzędne.
Jeśli chcesz wyświetlić wszystkie podmoduły określonego pakietu, możesz użyć czegoś takiego:
iter_modules wyświetla tylko te moduły, które są głębokie na jeden poziom. walk_packages pobiera wszystkie moduły podrzędne. Na przykład w przypadku scipy zwraca walk_packages
podczas gdy iter_modules tylko zwraca
Dokumentacja pkgutil ( http://docs.python.org/library/pkgutil.html ) nie zawiera wszystkich interesujących funkcji zdefiniowanych w /usr/lib/python2.6/pkgutil.py.
Być może oznacza to, że funkcje nie są częścią „publicznego” interfejsu i mogą ulec zmianie.
Jednak przynajmniej od Pythona 2.6 (i być może wcześniejszych wersji?) Pkgutil zawiera metodę walk_packages, która rekurencyjnie przechodzi przez wszystkie dostępne moduły.
źródło
walk_packages
jest teraz w dokumentacji: docs.python.org/library/pkgutil.html#pkgutil.walk_packages_
) przed i popath
- to znaczy użyjpackage.__path__
zamiastpackage._path_
. Może być łatwiej spróbować wyciąć i wkleić kod, zamiast wpisywać go ponownie.package
wskazuje na pakiet, a nie moduł. Moduły to pliki, a pakiety to katalogi. Wszystkie pakiety mają__path__
atrybut (... chyba że ktoś usunął atrybut z jakiegoś powodu.)To działa dla mnie:
źródło
Szukałem sposobu na przeładowanie wszystkich podmodułów, które edytuję na żywo w moim pakiecie. Jest to połączenie powyższych odpowiedzi / komentarzy, więc zdecydowałem się zamieścić to tutaj jako odpowiedź, a nie komentarz.
źródło
Oto jeden sposób, z góry mojej głowy:
Z pewnością można to oczyścić i ulepszyć.
EDYCJA: Oto nieco ładniejsza wersja:
UWAGA: Spowoduje to również znalezienie modułów, które niekoniecznie muszą znajdować się w podkatalogu pakietu, jeśli są wciągnięte w jego
__init__.py
plik, więc zależy to od tego, co rozumiesz przez „część” pakietu.źródło