Есть ли простой способ перечислить имена всех модулей в пакете без использования __all__
?
Например, с учетом этого пакета:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Мне интересно, есть ли стандартный или встроенный способ сделать что-то вроде этого:
>>> package_contents("testpkg")
['modulea', 'moduleb']
Ручной подход заключался бы в переборе путей поиска модулей, чтобы найти каталог пакета. Затем можно было бы перечислить все файлы в этом каталоге, отфильтровать файлы py / pyc / pyo с уникальными именами, удалить расширения и вернуть этот список. Но это похоже на изрядную работу для того, что механизм импорта модулей уже выполняет внутри. Эта функция доступна где-нибудь?
imp.get_suffixes()
вместо рукописного списка.xml.sax
Используя python2.3 и выше , вы также можете использовать
pkgutil
модуль:РЕДАКТИРОВАТЬ: обратите внимание, что параметр - это не список модулей, а список путей, поэтому вы можете сделать что-то вроде этого:
источник
pkgutil
есть в python2.3 и выше . Кроме того, хотяpkgutil.iter_modules()
не будет работать рекурсивно, естьpkgutil.walk_packages()
также, который будет рекурсивно. Тем не менее, спасибо за указатель на этот пакет.iter_modules
не работает на абсолютный импорт лайкa.b.testpkg
? Это дает мне[]
pkgutil.walk_packages()
рекурсии, это дает мне тот же результат, что иpkgutil.iter_modules()
, поэтому я думаю, что ответ неполный.источник
help()
печатает, строку не возвращает.help()
работает. Во всяком случае, встроенныйpydoc
модуль может помочь выплюнуть строку , чтоhelp()
Разбивать:import pydoc; pydoc.render_doc('mypackage')
.Не знаю, упускаю ли я что-то из виду или ответы устарели, но;Как заявил user815423426, это работает только для живых объектов, а перечисленные модули - это только модули, которые были импортированы ранее.
Листинг модулей в пакете кажется очень простым с помощью inspect :
источник
imported = import importlib; importlib.import_module('myproj.mymod.mysubmod')
.__import__
импортирует модуль верхнего уровня, см. документацию .import inspect, mypackage
и тогдаinspect.getmembers(my_package, inspect.ismodule)
я получаю пустой список, хотя я , конечно , есть различные модули в нем.import my_package.foo
а не толькоimport mypackage
, и в этом случае он возвращаетсяfoo
. Но это побеждает цельЭто рекурсивная версия, которая работает с Python 3.6 и выше:
источник
os.scandir
в качестве диспетчера контекста вместо прямого перебора записей результатов?close
будет вызываться, когда вы закончите с ним, чтобы гарантировать, что все удерживаемые ресурсы будут освобождены.re
вместо этого он перечисляет все пакеты, но добавляет ихre.
ко всемОсновываясь на примере cdleary, вот рекурсивный путь к списку версий для всех подмодулей:
источник
Здесь должны быть перечислены модули:
источник
Если вы хотите просмотреть информацию о своем пакете вне кода Python (из командной строки), вы можете использовать для этого pydoc.
Вы получите тот же результат, что и pydoc, но внутри интерпретатора с помощью справки
источник
источник
logging
пакете Python, чтобы понять, что я имею в виду. Ведение журнала содержит два модуля: обработчики и config. Ваш код вернет список из 66 элементов, в который не входят эти два имени.каталог печати (модуль)
источник