当我执行pip冻结时,我看到了大量未明确安装的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,我不想依赖包,直到我知道更多关于不小心卸载或升级它。
答案 0 :(得分:124)
您可以尝试将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
反向列出树,或者列出包含-p <package_name>
的单个包,以便找到您可以安装的Werkzeug运行:
$ pipdeptree -r -p Werkzeug
Werkzeug==0.11.15
- Flask==0.12 [requires: Werkzeug>=0.7]
答案 1 :(得分:64)
pip show
命令将显示指定包所需的包(请注意,必须已安装指定的包):
$ pip show specloud
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
pip show
是在pip版本1.4rc5中引入的
答案 2 :(得分:12)
正如我最近在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
。pip install --no-install <package_name>
列出具体要求。答案 3 :(得分:5)
您也可以使用一行命令将需求中的包管理为pip show。
cut -d'=' -f1 requirements.txt | xargs pip show
答案 4 :(得分:3)
首先,pip freeze
显示所有当前安装的Python包,不一定使用PIP。
其次,Python包确实包含有关依赖包的信息以及required versions。您可以使用方法described here查看特定pkg的依赖关系。当您升级软件包时,像PIP这样的安装程序脚本将为您处理依赖项的升级。
要解决我推荐使用PIP requirements files更新软件包的问题。您可以定义所需的软件包和版本,并使用pip install一次安装它们。
答案 5 :(得分: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)))
答案 6 :(得分:0)
(解决方法,不是真正的答案)
有同样的问题,lxml没有安装,我想知道谁需要lxml。 不是lxml需要的人。结束了绕过这个问题。
注意我的网站包的放置位置。
去那里并使用递归grep进行导入(最后一次grep的--invert-match用于删除lxml自己的文件)。
是的,不是关于如何使用pip来做到这一点的答案,但无论出于何种原因,我都没有从这里的建议中获得任何成功。
site-packages me$ egrep -i --include=*.py -r -n lxml . | grep import | grep --invert-match /lxml/