当我执行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,并且我不想依赖于一个包,直到我更了解如何避免意外卸载或升级它。


当前回答

下面的命令将显示所有已安装包的要求:

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

其他回答

首先,pip冻结显示当前安装的所有Python包,不一定使用pip。

其次,Python包确实包含有关依赖包以及所需版本的信息。您可以使用这里描述的方法查看特定pkg的依赖关系。当你升级一个包时,像PIP这样的安装程序脚本将为你处理依赖项的升级。

为了解决包的更新问题,我建议使用PIP需求文件。您可以定义所需的软件包和版本,并使用pip install立即安装它们。

我写了一个快速脚本来解决这个问题。下面的脚本将显示任何给定包的父(依赖的)包。通过这种方式,您可以确保升级或安装任何特定包都是安全的。可以使用如下方式:dependencies .py PACKAGENAME .py

#!/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)))

(变通,不是正确答案)

有同样的问题,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/

下面的命令将显示所有已安装包的要求:

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

你有两个选择。

第一个将输出所有顶级包,不包括子包。请注意,这也将排除示例请求,即使您希望显式地安装它

pip3 list --not-required --format freeze --exclude pip --exclude setuptools

第二个选项是根据现有的requirements.txt文件打印包。

pip3 freeze -r requirements.txt

这将生成一个格式为:

existing-package==1.0.0
## The following requirements were added by pip freeze:
dependency-package==1.0.0

你可以使用sed删除所有额外添加的包:

pip3 freeze -r requirements.txt | sed -n '/## The following requirements were added by pip freeze:/q;p'