Список зависимостей пакета python без их загрузки?
Скажем, что для пакета Python A требуются B, C и D;
есть ли способ перечислить A → B C D без их загрузки?
Requires
в метаданных (yolk -M A
) часто являются неполными, grr.
Можно скачать A.tar/A.egg, затем просмотреть A/setup.py,
но некоторые из них довольно гори.
(Я бы подумал, что получение по крайней мере зависимостей первого уровня может быть механизировано;
даже 98% -ное решение было бы лучше, чем загрузка с помощью лавинного доступа.)
Связанный с этим вопрос:
pip-upgrade-package-without-upgrading-dependencies
Ответы
Ответ 1
Snakefood
sfood -fuq package.py | sfood-target-files
отобразит зависимости.
`-f` tells sfood to follow dependencies recursively
`-u` tells sfood to ignore unused imports
`-q` tells sfood to be quiet about debugging information
Чтобы отфильтровать модули из стандартной библиотеки, вы можете использовать
sfood -fuq package.py | sfood-filter-stdlib | sfood-target-files
Как вы уже отметили, если есть другие каталоги, которые вы хотели бы проигнорировать, вы также можете использовать флаг sfood -I
.
Ответ 2
modulefinder из стандартного lib
Новое в версии 2.3.
Этот модуль предоставляет ModuleFinder класс, который может быть использован для определения набор модулей, импортируемых script. modulefinder.py также может быть запускается как script, указывая имя файла Python script в качестве аргумента, после чего отчет импортированного модули будут напечатаны.
Я не уверен, соответствует ли это вашим требованиям о том, чтобы не загружать модули. Отсюда:
modulefinder использует проверку байтового кода найти зависимости и, следовательно, без каких-либо побочных эффектов, которые могут быть вызванных импортом модулей, являющихся изучены.
Другие подсказки об использовании pylint или Gui2exe здесь
Ответ 3
Если по пакету вы имеете в виду пакет, установленный на пипсе (а не каталог с __init__.py), тогда вы можете использовать пакет Python под названием pip. Например:
def get_all_package_dependencies():
"""Return dictionary of installed packages to list of package dependencies."""
return {
dist.key: [r.key for r in dist.requires()]
for dist in pip.get_installed_distributions()
}