Python 패키지의 종속성을 찾는 방법


106

프로그래밍 방식으로 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에만 저장됩니다.


여기에 꽤 많은 답변이 프로그램에서 사용하기 위해 pip를 가져 오는 것을 보여줍니다. pip에 대한 문서 는 이러한 pip 사용에 대해 강력히 권장합니다. 이러한 솔루션 중 하나가 중요한 용도로 사용되는 경우 명심해야 할 사항입니다.
Jordan Mackie

답변:


97

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에 있으며 여기에서 사용 정보도 찾을 수 있습니다.


7
pipdeptree지정된 패키지 의 종속성 뿐만 아니라 설치된 모든 패키지 의 종속성을 표시합니다 . 출력을 필터링 할 수는 있지만 이미 설치된 패키지에 따라 다릅니다. --json
sschuberth

당신이 당신에없는 패키지를 설치 한 이유 보류 싶어 할 때 사실,하지만 대답은 여전히 유용합니다 requirements.txt:)
beruic

3
또한이 -p옵션 을 사용하여 종속성을 탐색하려는 몇 가지 패키지 만 선택할 수 있습니다 .
Zaccharie Ramzi

2
pipdeptree을 (를) 최적화 할 때 매우 유용했습니다 requirements.txt. $ pipdeptree | grep -P '^\w+' 이렇게하면 최상위 패키지 만 출력됩니다. 여기에
Lead Developer

64

show에서 명령 을 사용하십시오 pip. 예를 들면 다음과 같습니다.

$ pip show tornado
---
Name: tornado
Version: 4.1
Location: *****
Requires: certifi, backports.ssl-match-hostname

업데이트 (지정된 버전으로 deps 검색) :

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']

1
이것은 종속성이 아니라 패키지 버전을 알려줍니다 . 그들은 단지 나열됩니다.
jonrsharpe 2015

Requires섹션 참조
Alex Lisovoy 2015

3
예,하지만 표시되지 않습니다 "최소 버전 번호가 필요합니다" : 영업의 요구에 따라,
jonrsharpe

1
어떻게 든 나에게 $ pip3 show beautifulsoup4비어 있음 Requires: 을 보여줍니다 -beautifulsoup4 는 아무것도 의존하지 않습니까?
xealits

4
@PythonJin, 네, 분명히 그것은 표준 패키지 만 사용합니다. 음, 다 beautifulsoup4.
xealits 2016

6

여기에 꽤 많은 답변이 프로그램에서 사용하기 위해 pip를 가져 오는 것을 보여줍니다. pip에 대한 문서는 이러한 pip 사용에 대해 강력히 권장합니다 .

pkg_resourcespip 가져 오기를 통해 액세스하는 대신 실제로 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에 대한 print 문을 조정해야합니다).


3

(이는 레거시 답변이며 최신 PIP 버전에서는 피해야하며 이전 PIP 버전에 대한 참조를 위해 여기에 남겨 두어야합니다) Alex의 대답은 좋습니다 (+1). 파이썬에서 :

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')]

최근 버전에서 변경된 사항이 있습니까? _vendor속성이 핍 버전에 존재하지 않는 것 19.1.1(편집 : 좋아,로 이동 한 것으로 보인다 pkg_resources최신 파이썬 버전 패키지!)
Prahlad Yeri

예, 상황이 변경되었으며 아래 권장 사항을 위해이를 업데이트하거나 제거하는 방법을 살펴 보겠습니다.
cgseller

Alex의 대답은 내 관점에서 부분적으로 더 낫습니다 ( pip show음 나머지가 아니라 부분이 좋습니다). pip show, pipdeptree를 사용 하거나 setuptools '를 pkg_resources직접 사용하여 Jordan Mackie의 답변을 참조하십시오 .
sinoroc

2

https://libraries.io/ 사용 하십시오 . pip를 사용하여 설치하기 전에 종속성을 탐색하는 것이 좋습니다.

예 : google-cloud-storage를 입력하고 검색하면 라이브러리 페이지 ( https://libraries.io/rubygems/google-cloud-storage ) 를 찾을 수 있습니다 . 'Releases'(기본값은 최신)에서 종속성을 탐색하려는 버전을 선택하고 'Dependencies'에서 종속성 목록과 지원되는 버전을 찾을 수 있습니다.


1

기사 에 따라 파이썬으로 시도하십시오 .

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']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.