Есть ли простой способ найти все модули, входящие в пакет python? Я нашел это старое обсуждение , которое не является окончательным, но мне хотелось бы получить определенный ответ, прежде чем я разверну свое собственное решение на основе os.listdir ().
python
module
packages
introspection
python-import
static_rtti
источник
источник
Ответы:
Да, вам нужно что-то на основе
pkgutil
или похожее - таким образом вы можете обрабатывать все пакеты одинаково, независимо от того, находятся ли они в яйцах или zip-файлах (где os.listdir не поможет).Как их тоже импортировать? Вы можете использовать
__import__
как обычно:источник
importer
возвращаетpkgutil.iter_modules
? Могу ли я использовать его для импорта модуля вместо того, чтобы использовать этот кажущийся «хакерский»__import__(modname, fromlist="dummy")
?m = importer.find_module(modname).load_module(modname)
а затемm
модуль, например:m.myfunc()
_path_
). Их должно быть по два с каждой стороны, всего четыре (т.е.__path__
).Правильный инструмент для этой работы - pkgutil.walk_packages.
Чтобы перечислить все модули в вашей системе:
Имейте в виду, что walk_packages импортирует все подпакеты, но не подмодули.
Если вы хотите перечислить все подмодули определенного пакета, вы можете использовать что-то вроде этого:
iter_modules перечисляет только модули одноуровневой глубины. walk_packages получает все подмодули. В случае scipy, например, walk_packages возвращает
в то время как iter_modules только возвращает
Документация по pkgutil ( http://docs.python.org/library/pkgutil.html ) не перечислены все интересные функции, определенные в /usr/lib/python2.6/pkgutil.py.
Возможно, это означает, что функции не являются частью «общедоступного» интерфейса и могут быть изменены.
Однако, по крайней мере, начиная с Python 2.6 (и, возможно, более ранних версий?) Pkgutil поставляется с методом walk_packages, который рекурсивно просматривает все доступные модули.
источник
walk_packages
теперь в документации: docs.python.org/library/pkgutil.html#pkgutil.walk_packages_
до и после должно быть два символа подчеркивания ( ),path
то есть использоватьpackage.__path__
вместоpackage._path_
. Возможно, будет проще попробовать вырезать и вставить код, чем набирать его заново.package
указывает на пакет, а не на модуль. Модули - это файлы, а пакеты - это каталоги. У всех пакетов есть__path__
атрибут (... если только кто-то по какой-то причине не удалил атрибут.)Это работает для меня:
источник
Я искал способ перезагрузить все подмодули, которые я редактирую прямо в своем пакете. Это комбинация ответов / комментариев выше, поэтому я решил опубликовать ее здесь как ответ, а не комментарий.
источник
Вот один способ, из моей головы:
Его, безусловно, можно очистить и улучшить.
РЕДАКТИРОВАТЬ: Вот немного лучшая версия:
ПРИМЕЧАНИЕ. При этом также будут найдены модули, которые не обязательно могут быть расположены в подкаталоге пакета, если они включены в его
__init__.py
файл, поэтому это зависит от того, что вы подразумеваете под «частью» пакета.источник