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]
The pip show
command will show what packages are required for the specified package (note that the specified package must already be installed):
$ pip show specloud
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
pip show
was introduced in pip version 1.4rc5
As I recently said on a hn thread, I'll recommend the following:
Have a commented requirements.txt
file with your main dependencies:
## this is needed for whatever reason
package1
Install your dependencies: pip install -r requirements.txt
. Now you get the full list of your dependencies with 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
This allows you to keep your file structure with comments, nicely separating your dependencies from the dependencies of your dependencies. This way you'll have a much nicer time the day you need to remove one of them :)
Note the following:
- You can have a clean
requirements.raw
with version control to rebuild your fullrequirements.txt
. - Beware of git urls being replaced by egg names in the process.
- The dependencies of your dependencies are still alphabetically sorted so you don't directly know which one was required by which package but at this point you don't really need it.
- Use
pip install --no-install <package_name>
to list specific requirements. - Use virtualenv if you don't.
You may also use a one line command which pipes the packages in requirements to pip show.
cut -d'=' -f1 requirements.txt | xargs pip show
First of all pip freeze
displays all currently installed packages Python, not necessarily using PIP.
Secondly Python packages do contain the information about dependent packages as well as required versions. You can see the dependencies of particular pkg using the methods described here. When you're upgrading a package the installer script like PIP will handle the upgrade of dependencies for you.
To solve updating of packages i recommend using PIP requirements files. You can define what packages and versions you need, and install them at once using pip install.
I wrote a quick script to solve this problem. The following script will display the parent (dependant) package(s) for any given package. This way you can be sure it is safe to upgrade or install any particular package. It can be used as follows: 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)))
(workaround, not true answer)
Had the same problem, with lxml not installing and me wanting to know who needed lxml. Not who lxml needed. Ended up bypassing the issue by.
noting where my site packages were being put.
go there and recursive grep for the import (the last grep's --invert-match serves to remove lxml's own files from consideration).
Yes, not an answer as to how to use pip to do it, but I didn't get any success out of the suggestions here, for whatever reason.
site-packages me$ egrep -i --include=*.py -r -n lxml . | grep import | grep --invert-match /lxml/
'IT story' 카테고리의 다른 글
JavaScript를 사용하여 HTML 요소에 속성을 추가 / 업데이트하는 방법은 무엇입니까? (0) | 2020.07.13 |
---|---|
Github : 리포지토리의 다운로드 수를 볼 수 있습니까? (0) | 2020.07.13 |
TortoiseSVN 저장된 비밀번호 추출 (0) | 2020.07.13 |
자동 속성 디버깅 (0) | 2020.07.13 |
Windows에서 node.js 모듈의 기본 글로벌 설치 디렉토리를 변경 하시겠습니까? (0) | 2020.07.13 |