2013-03-29 5 views
21

Python 패키지의 종속성 트리를 분석하고 싶습니다. 이 데이터를 어떻게 얻을 수 있습니까? 이미Python 패키지 종속성 트리

  1. setup.py을 알고

    상황이 종종 패키지 종속성을 나열하는 requires 필드가 포함

  2. PyPi는
  3. PyPi이 API를

물건을 가지고 파이썬 패키지의 온라인 저장소입니다 모르겠다.

  1. requires 필드에 PyPi의 프로젝트 (약 10 %)가 명시 적으로 종속성을 나열하지만, ​​pip/easy_install은 여전히 ​​올바른 패키지를 다운로드 할 수 있습니다. 내가 뭘 놓치고 있니? 예를 들어, 통계 계산을위한 인기있는 라이브러리 인 pandasrequires을 나열하지 않지만 numpy, pytz 등을 계속 설치합니다. 자동으로 종속성의 전체 목록을 수집하는 더 좋은 방법이 있습니까?
  2. 어딘가에 기존 데이터베이스가 있습니까? 기존 작업을 반복합니까?
  3. 쉽게 접근, 유사, 데이터베이스 대신, New and changed setup keywords를 참조 install_requires 필드 보고해야
+0

귀하의 질문은 실제로는 너무 광범위합니다. 게시물에 너무 많은 질문을 넣지 말고 실용적이고 답변 할 수 있도록하십시오. 귀하의 요점 3. 구체적인 대답보다는 토론 및 쇼핑 목록을 초청합니다. –

답변

18

유통 시스템 (R, Clojure의, 등 ...?)와 다른 언어를 위해 존재합니까.

requires은 종속성 설치에 의존하는 필드가 너무 모호한 것으로 간주됩니다. 또한 setup.py에 필요한 종속성 필드 및 실행중인 테스트에 대해서는 setup_requirestest_requires 개의 필드가 있습니다.

물론 의존성 그래프는 이전에 분석되었습니다. 이 blog article by Olivier Girardot에서이 환상적인 이미지를 제공 :

PyPI dependencies
이미지가 그래프의 대화 형 버전으로 연결되어 있습니다.

+1

칭찬을위한 thx : p –

+4

음, * 아주 아름다운 그래프입니다! –

+1

그 그래프는 믿을 수 없습니다. – Will

2

pip과 같은 도구를 사용하여 각 패키지의 모든 요구 사항을 나열 할 수 있습니다.

명령은 다음과 같습니다 당신은 당신의 스크립트에서 PIP의 일부를 재사용 할 수

pip install --no-install package_name 

. 구문 분석을 담당하는 부분은 모듈 pip.req입니다. 여기

+2

파이썬 안에서'pip'를 사용하는 것을 좋아합니다. 패키지를 이미 설치 한 경우 명령 줄 인터페이스가 실패합니다. 파이썬 코드를 직접 사용하여 특정 패키지의 종속성을 찾는 방법은 무엇입니까? – MRocklin

+1

'--no-install'은 더 이상 사용되지 않습니다. –

0

는 프로그래밍 파이썬에게 pip 패키지를 사용하여 할 수있는 방법은 다음과 같습니다

from pip._vendor import pkg_resources # Ensure pip conf index-url pointed to real PyPi Index 

# Get dependencies from pip 
package_name = 'Django' 
try: 
    package_resources = pkg_resources.working_set.by_key[package_name.lower()] # Throws KeyError if not found 
    dependencies = package_resources._dep_map.keys() + ([str(r) for r in package_resources.requires()]) 
    dependencies = list(set(dependencies)) 
except KeyError: 
    dependencies = [] 

을 그리고 여기 당신이 PyPi의 API에서 의존성을 얻을 수있는 방법입니다 :

import requests 
import json 
package_name = 'Django' 
# Package info url 
PYPI_API_URL = 'https://pypi.python.org/pypi/{package_name}/json' 
package_details_url = PYPI_API_URL.format(package_name=package_name) 
response = requests.get(package_details_url) 
data = json.loads(response.content) 
if response.status_code == 200: 
    dependencies = data['info'].get('requires_dist') 
    dependencies2 = data['info'].get('requires') 
    dependencies3 = data['info'].get('setup_requires') 
    dependencies4 = data['info'].get('test_requires') 
    dependencies5 = data['info'].get('install_requires') 
    if dependencies2: 
     dependencies.extend(dependencies2) 
    if dependencies3: 
     dependencies.extend(dependencies3) 
    if dependencies4: 
     dependencies.extend(dependencies4) 
    if dependencies5: 
     dependencies.extend(dependencies5) 
    dependencies = list(set(dependencies)) 

당신은 호출하는 재귀를 사용할 수 있습니다 의존성의 의존성은 전체 트리를 얻는다. 건배!