pip와 함께 설치된 Python 패키지의 종속성 관계 식별


151

pip freeze를 수행하면 명시 적으로 설치하지 않은 많은 Python 패키지가 표시됩니다.

$ pip freeze
Cheetah==2.4.3
GnuPGInterface==0.3.2
Landscape-Client==11.01
M2Crypto==0.20.1
PAM==0.4.2
PIL==1.1.7
PyYAML==3.09
Twisted-Core==10.2.0
Twisted-Web==10.2.0
(etc.)

pip가 이러한 특정 종속 패키지를 설치 한 이유를 확인할 수있는 방법이 있습니까? 즉, 이러한 패키지가있는 상위 패키지를 종속성으로 확인하려면 어떻게해야합니까?

예를 들어, Twisted를 사용하고 실수로 패키지를 제거하거나 업그레이드하지 않는 것에 대해 더 알기 전까지는 패키지에 의존하고 싶지 않습니다.

답변:


180

종속성을 트리 구조로 표시하는 pipdeptree 를 시도 할 수 있습니다 . 예 :

$ pipdeptree
Lookupy==0.1
wsgiref==0.1.2
argparse==1.2.1
psycopg2==2.5.2
Flask-Script==0.6.6
  - Flask [installed: 0.10.1]
    - Werkzeug [required: >=0.7, installed: 0.9.4]
    - Jinja2 [required: >=2.4, installed: 2.7.2]
      - MarkupSafe [installed: 0.18]
    - itsdangerous [required: >=0.21, installed: 0.23]
alembic==0.6.2
  - SQLAlchemy [required: >=0.7.3, installed: 0.9.1]
  - Mako [installed: 0.9.1]
    - MarkupSafe [required: >=0.9.2, installed: 0.18]
ipython==2.0.0
slugify==0.0.1
redis==2.9.1

그것을 실행하려면 :

pip install pipdeptree


편집 : 의견에 @Esteban이 언급했듯이 Werkzeug가 설치된 것을 찾기 -r위해 트리를 역으로 또는 단일 패키지로 나열 -p <package_name>할 수도 있습니다.

$ pipdeptree -r -p Werkzeug
Werkzeug==0.11.15
  - Flask==0.12 [requires: Werkzeug>=0.7]

6
나는 당신이 실행해야 할 @mark의 질문에 완전히 대답 할 것이라고 믿는다. pipdeptree -r "종속 트리를 역순으로 보여준다. 즉, 하위 의존성은 그 아래에 필요한 패키지 목록과 함께 나열되어있다."
Esteban

로컬로 설치된 패키지뿐만 아니라 모든 PyPi 패키지의 리버스 트리를 어떻게 볼 수 있습니까?
Tijme

2
pipdeptree중대하다. 불행히도에 의해 설치된 패키지에 대한 계정 종속성을 고려 나타나지 않습니다 CONDA : 예에서 CONDA ENV 곳 matplotlibnumpy주사위를 사용하여 설치되었지만 scipy, CONDA를 사용하여 설치 scipy더 depencies 또한 부양 가족 (가없는 것처럼 pipdeptree에서 쇼를 pip show scipy아무 쇼를 요구 사항).
djvg

나는 그것을하지만 CONDA의이 힘 작업을 시도하지했습니다 @Dennis github.com/rvalieris/conda-tree을
djsutho

1
가상 환경에서이를 사용하려면 python -m pipdeptree실행 파일이 virtualenv에 설치되어 있어도 시스템 종속성 만 나열해야합니다.
Zim December

81

pip show명령은 지정된 패키지에 필요한 패키지를 보여줍니다 (지정된 패키지가 이미 설치되어 있어야합니다).

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

pip show pip 버전 1.4rc5에서 도입되었습니다


1
pip show1.4rc5 버전에서 도입되었으며, (현재 작성중인) 1.4.1
drevicko

10
부모님 대신 특정 패키지의 자녀 (종속성)를 보여주기 때문에 이것은 내 질문에 정확하게 대답하지 않습니다. 그러나이 명령을 사용하여 각 패키지의 종속성을 확인하기 위해 함께 무언가를 던질 수 있습니다. 예를 들어 PyYAML이 필요한 설치된 패키지를 확인할 수 있습니다.
Mark Chackerian

4
이전 주석에 따라이 쉘 명령은 설치된 각 패키지에 대한 모든 종속성을 덤프합니다. $ pip freeze | grep -v "\ -e"| sed s /\=\=.*// | awk 'system ( "pip show"$ 1) "
Mark Chackerian

이전 의견에서 업데이트 된 스크립트 버전은 pip freeze | grep -v "\-e" | sed s/\=\=.*// | awk 'system("pip show " $1)' | grep -E '^(Name:|Requires:)' | sed s/Name:/\\\nName:/ -pipdeptree가 더 나은 솔루션 인 것 같습니다.
Mark Chackerian

14

최근에 hn thread 에서 말했듯 이 다음을 권장합니다.

requirements.txt주요 종속성 이있는 주석이 달린 파일이 있습니다.

## this is needed for whatever reason
package1

종속성을 설치하십시오 pip install -r requirements.txt.. 이제 다음을 사용하여 종속성의 전체 목록을 얻습니다 pip freeze -r requirements.txt.

## this is needed for whatever reason
package1==1.2.3

## The following requirements were added by pip --freeze:
package1-dependency1==1.2.3
package1-dependency1==1.2.3

이를 통해 주석으로 파일 구조를 유지할 수 있으며 종속성의 종속성과 종속성을 멋지게 분리 할 수 ​​있습니다. 이렇게하면 하루 중 하나를 제거 해야하는 시간이 훨씬 더 좋습니다. :)

다음에 유의하십시오.

  • 당신은 청소 할 수 있습니다 requirements.raw전체를 재건 버전 제어를 requirements.txt.
  • 이 과정에서 자식 URL로 대체되는 자식 URL에주의하십시오.
  • 종속성의 종속성은 여전히 ​​알파벳순으로 정렬되어 있으므로 어떤 패키지에 어떤 패키지가 필요한지 직접 알지 못하지만이 시점에서는 실제로 필요하지 않습니다.
  • pip install --no-install <package_name>특정 요구 사항을 나열하는 데 사용 합니다.
  • 그렇지 않은 경우 virtualenv를 사용하십시오 .

1
왜 이것이 pip freeze -r requirements.txt널리 사용되지 않는지 이해하지 못합니다 . 종속성 및 하위 종속성을 유지 관리하는 데 매우 유용합니다.
Penkey Suresh

1
사소한 참고 : pip install더 이상 지원하지 않습니다 --no-install.
ryan

7

요구 사항의 패키지를 pip show로 파이프하는 한 줄 명령을 사용할 수도 있습니다.

cut -d'=' -f1 requirements.txt | xargs pip show

1
requirements.txt 형식이보다 복잡하므로 일반적으로 할 수 없습니다 <package_name>==<package_version>.
Piotr Dobrogost

3

우선 pip freezePIP를 사용하지 않아도 현재 설치된 모든 패키지 Python을 표시합니다.

두 번째로 파이썬 패키지에는 종속 패키지와 필수 버전에 대한 정보가 들어 있습니다 . 여기에 설명 된 방법을 사용하여 특정 pkg의 종속성을 볼 수 있습니다 . 패키지를 업그레이드 할 때 PIP와 같은 설치 프로그램 스크립트가 종속성 업그레이드를 처리합니다.

패키지 업데이 트를 해결하려면 PIP 요구 사항 파일을 사용하는 것이 좋습니다 . 필요한 패키지와 버전을 정의하고 pip install을 사용하여 한 번에 설치할 수 있습니다.


3

pipupgrade를 사용하십시오 !

$ pip install pipupgrade
$ pipupgrade --format tree --all --check

pipupgrade 는 종속성 그래프를 표시하고 의미 업데이트 버전에 따라 가능한 업데이트를 위해 각 패키지를 강조 표시합니다. 또한 충돌하는 하위 종속성을 예쁜 방식으로 표시합니다. pipupgrade또한 여러 Python 환경에 존재하는 패키지를 업그레이드합니다. Python2.7 +, Python3.4 + 및 pip9 +, pip10 +, pip18 +, pip19 +와 호환됩니다.

여기에 이미지 설명을 입력하십시오


1

(해결 방법, 실제 답변이 아님)

lxml이 설치되지 않고 lxml이 필요한 사람을 알고 싶어하는 것과 동일한 문제가 있습니다. lxml이 필요한 사람이 아닙니다 . 에 의해 문제를 우회했습니다.

  1. 내 사이트 패키지를 어디에 넣었는지 주목하십시오.

  2. 가져 오기를 위해 재귀 grep으로 이동하십시오 (마지막 grep의 --invert-match는 lxml의 자체 파일을 고려하지 못하게합니다).

예, pip를 사용하여 수행하는 방법에 대한 대답은 아니지만 어떤 이유로 든 여기 제안에서 성공하지 못했습니다.

 site-packages me$ egrep -i --include=*.py  -r -n lxml . | grep import | grep --invert-match /lxml/

1

이 문제를 해결하기 위해 빠른 스크립트를 작성했습니다. 다음 스크립트는 주어진 패키지의 상위 (종속) 패키지를 표시합니다. 이렇게하면 특정 패키지를 업그레이드하거나 설치하는 것이 안전하다는 것을 확신 할 수 있습니다. 다음과 같이 사용할 수 있습니다.dependants.py PACKAGENAME

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""Find dependants of a Python package"""

import logging
import pip
import pkg_resources
import sys

__program__ = 'dependants.py'


def get_dependants(target_name):
    for package in pip._internal.utils.misc.get_installed_distributions():
        for requirement_package in package.requires():
            requirement_name = requirement_package.project_name
            if requirement_name == target_name:
                yield package.project_name


# configure logging
logging.basicConfig(format='%(levelname)s: %(message)s',
                    level=logging.INFO)

try:
    target_name = sys.argv[1]
except IndexError:
    logging.error('missing package name')
    sys.exit(1)

try:
    pkg_resources.get_distribution(target_name)
except pkg_resources.DistributionNotFound:
    logging.error("'%s' is not a valid package", target_name)
    sys.exit(1)

print(list(get_dependants(target_name)))

get_installed_distributions()방법은 더 이상 사용할 수 없으므로 더 이상 작동 하지 않습니다. github.com/pypa/pip/issues/5243
Phil Gyford 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.