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

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를 사용하고 실수로 패키지를 제거하거나 업그레이드하지 않는 것에 대해 더 알기 전까지는 패키지에 의존하고 싶지 않습니다.



답변

종속성을 트리 구조로 표시하는 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]


답변

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

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

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


답변

최근에 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를 사용하십시오 .

답변

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

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


답변

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

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

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


답변

pipupgrade를 사용하십시오 !

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

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

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


답변

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

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/