Как найти зависимости пакета Python
Как вы можете программно получить список зависимостей пакетов Python?
Стандартные setup.py
имеют эти документы, но я не могу найти простой способ получить к нему доступ либо из Python, либо из командной строки.
В идеале я ищу что-то вроде:
$ pip install somepackage --only-list-deps
kombu>=3.0.8
billiard>=3.3.0.13
boto>=2.26
или
>>> import package_deps
>>> package = package_deps.find('somepackage')
>>> print package.dependencies
['kombu>=3.0.8', 'billiard>=3.3.0.13', 'boto>=2.26']
Обратите внимание: я не говорю об импорте пакета и поиске всех ссылочных модулей. Хотя это может найти большинство зависимых пакетов, он не сможет найти требуемый минимальный номер версии. Это сохраняется только в файле setup.py.
Ответы
Ответ 1
В дополнение к команде pip show [package name]
есть pipdeptree
.
Просто сделай
$ pip install pipdeptree
затем запустите
$ pipdeptree
и он покажет вам ваши зависимости в форме дерева, например,
flake8==2.5.0
- mccabe [required: >=0.2.1,<0.4, installed: 0.3.1]
- pep8 [required: !=1.6.0,>=1.5.7,!=1.6.1,!=1.6.2, installed: 1.5.7]
- pyflakes [required: >=0.8.1,<1.1, installed: 1.0.0]
ipdb==0.8
- ipython [required: >=0.10, installed: 1.1.0]
Проект расположен в https://github.com/naiquevin/pipdeptree, где вы также найдете информацию об использовании.
Ответ 2
Попробуйте использовать команду show
в pip
, например:
$ pip show tornado
---
Name: tornado
Version: 4.1
Location: *****
Requires: certifi, backports.ssl-match-hostname
Обновить (получить отпечатки с указанной версией):
from pip._vendor import pkg_resources
_package_name = 'somepackage'
_package = pkg_resources.working_set.by_key[_package_name]
print([str(r) for r in _package.requires()]) # retrieve deps from setup.py
Output: ['kombu>=3.0.8',
'billiard>=3.3.0.13',
'boto>=2.26']
Ответ 3
Алекс отвечает хорошо (+1). В python:
pip._vendor.pkg_resources.working_set.by_key['twisted'].requires()
должен возвращать что-то вроде
[Requirement.parse('zope.interface>=3.6.0')]
где twisted - это имя пакета, которое вы можете найти в словаре:
pip._vendor.pkg_resources.WorkingSet().entry_keys
чтобы перечислить их все:
dict = pip._vendor.pkg_resources.WorkingSet().entry_keys
for key in dict:
for name in dict[key]:
req =pip._vendor.pkg_resources.working_set.by_key[name].requires()
print('pkg {} from {} requires {}'.format(name,
key,
req))
должен содержать следующие списки:
pkg pyobjc-framework-syncservices from /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC requires [Requirement.parse('pyobjc-core>=2.5.1'), Requirement.parse('pyobjc-framework-Cocoa>=2.5.1'), Requirement.parse('pyobjc-framework-CoreData>=2.5.1')]
Ответ 4
Попробуйте это в соответствии с этой статьей в python:
import pip
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
Он будет выглядеть так:
['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24',
'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3',
'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1',
'werkzeug==0.9.4']
Ответ 5
Довольно много ответов здесь показывают, что pip импортируется для использования в программах. Документация для pip настоятельно рекомендует против такого использования pip.
Вместо того, чтобы обращаться к pkg_resources
через импорт pip, вы можете просто импортировать pkg_resources
напрямую и использовать ту же логику (которая на самом деле является одним из предлагаемых решений в документах pip, связанных для тех, кто хочет видеть метаинформацию пакета программно).
import pkg_resources
_package_name = 'yourpackagename'
def get_dependencies_with_semver_string():
package = pkg_resources.working_set.by_key[_package_name]
return [str(r) for r in package.requires()]
Если у вас возникли проблемы с точным определением имени вашего пакета, экземпляр WorkingSet
возвращаемый pkg_resources.working_set
реализует __iter__
поэтому вы можете распечатать все из них и, надеюсь, найти свое там :)
т.е.
import pkg_resources
def print_all_in_working_set():
ws = pkg_resources.working_set
for package_name in ws:
print(ws)
Это работает как с python 2, так и с 3 (хотя вам нужно настроить операторы печати для python2)
Ответ 6
Все вышеперечисленные решения верны, но несколько неэффективны.
Если вы используете Mac, лучше всего использовать команду pip list
.