Список зависимостей пакета 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()
    }