source

pip과 함께 설치된 python 패키지에 대한 종속성 관계 식별

bestscript 2022. 12. 3. 12:47

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이 지적한 바와 같이 트리를 반대로 나열할 수도 있습니다.-r또는 1개의 패키지로-p <package_name>따라서 설치된 Werkzeug를 검색하려면 다음과 같이 하십시오.

$ 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 showpip 버전 1.4rc5에서 도입되었습니다.

최근 hn 스레드에 대해 말씀드렸듯이 다음 사항을 권장합니다.

코멘트를 받다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.
  • 이 과정에서 git URL이 에그 이름으로 대체되지 않도록 주의하십시오.
  • 의존관계는 여전히 알파벳 순으로 정렬되어 있기 때문에 어떤 패키지가 어떤 패키지에 필요한지 직접 알 수 없지만 현시점에서는 실제로 필요하지 않습니다.
  • 사용하다pip install --no-install <package_name>를 참조해 주세요.
  • 그렇지 않으면 virtualenv를 사용합니다.

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

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

일단은pip freeze는 PIP를 사용하지 않고 현재 설치되어 있는 모든 패키지 Python을 표시합니다.

둘째, Python 패키지에는 필요한 버전뿐만 아니라 종속 패키지에 대한 정보도 포함되어 있습니다.여기서 설명하는 방법을 사용하여 특정 pkg의 종속성을 확인할 수 있습니다.패키지를 업그레이드할 때 PIP와 같은 설치 스크립트가 종속성 업그레이드를 처리합니다.

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

다음 명령어는 설치된 모든 패키지의 요건을 표시합니다.

pip3 freeze | awk '{print $1}' | cut -d '=' -f1 | xargs pip3 show

(회피책, 정답이 아닙니다)

lxml이 설치되지 않아 누가 lxml을 필요로 하는지 알고 싶어 하는 것과 같은 문제가 있었습니다.lxml이 필요한 사람이 아닙니다.결국 이 문제를 회피하게 되었다.

  1. 내 사이트 패키지가 어디에 놓여져 있는지 확인합니다.

  2. go to recursive grep for import(마지막 grep의 --grep-match는 lxml 자신의 파일을 고려 대상에서 삭제하는 역할을 합니다).

네, pip을 사용하는 방법에 대한 답변은 없지만, 어떤 이유로든 여기서 제시한 제안에서 아무런 성과를 거두지 못했습니다.

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

나는 이 문제를 해결하기 위해 빠른 대본을 썼다.다음 스크립트는 지정된 패키지의 부모(의존자) 패키지를 표시합니다.이렇게 하면 특정 패키지를 업그레이드하거나 설치하는 것이 안전하다는 것을 확인할 수 있습니다.할 수 .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)))

언급URL : https://stackoverflow.com/questions/9232568/identifying-the-dependency-relationship-for-python-packages-installed-with-pip