【发布时间】:2014-01-05 06:41:21
【问题描述】:
我想查看依赖于带有 PIP 的某个包的包列表。也就是说,给定django,我希望看到django-cms、django-filer,因为我已经安装了这些包并且它们都具有django 作为依赖项。
【问题讨论】:
-
PIP 已安装:
pip 1.4.1
我想查看依赖于带有 PIP 的某个包的包列表。也就是说,给定django,我希望看到django-cms、django-filer,因为我已经安装了这些包并且它们都具有django 作为依赖项。
【问题讨论】:
pip 1.4.1
更新(2021 年):
由于pip version 10 你可以这样做:
pkg=httplib2
pip show $pkg | grep ^Required-by
或用于 bash
pkg=httplib2
grep ^Required-by <(pip show $pkg)
所以你可以创建一个别名,如:
alias pyreq='pip show $pkg | grep ^Required-by'
并通过以下方式查询:
pkg=httplib2 pyreq
应该给出(对于 ubuntu):
Required-by: lazr.restfulclient, launchpadlib
原文:
很简单:
pip show <insert_package_name_here>| grep ^Requires
或者反过来:(对不起,我弄错了!)
for NAME in $(pip freeze | cut -d= -f1); do REQ=$(pip show $NAME| grep Requires); if [[ "$REQ" =~ "$REQUIRES" ]]; then echo $REQ;echo "Package: $NAME"; echo "---" ; fi; done
在此之前将您的搜索字符串设置为:
REQUIRES=django
基本上你必须遍历整个列表并查询每一个。这可能需要一些时间。
编辑: 它也只适用于已安装的包,我没有看到 pip 提供对未安装包的依赖。
【讨论】:
for NAME in $(python -W ignore -m pip freeze | cut -d= -f1); do REQ=$(python -W ignore -m pip show $NAME| grep Requires); if [[ "$REQ" =~ "$REQUIRES" ]]; then echo $REQ;echo "Package: $NAME"; echo "---" ; fi; done
从版本 10 开始,pip show 还包含一个“Required-by”条目。所以就
pip show <package_name>
现在已经足够了。或者可能
pip show <package_name> | grep ^Required-by
如果您只想为脚本或其他内容获取那一行。
【讨论】:
我知道这里已经有一个公认的答案,但实际上,在我看来,你想要的是使用pipdeptree:
pip install pipdeptree
pipdeptree --help
pipdeptree -r -p django
【讨论】:
基于 requirements.txt 的一个班轮。在这个例子中,我正在寻找 funcsigs 反向依赖,并找到了 mock。只需将funcsigs 更改为其他内容即可。
cat requirements.txt | grep -v git | sed 's/==.*//' | xargs -I % echo 'pip show % 2>/dev/null | grep Requires | grep -q funcsigs && echo %' | sh
【讨论】:
这个,对于早于 1.3.1 的 pip 将列出所有包及其依赖项,您可以使用任何脚本语言解析其输出,用于 Requires ... django 包含:
pip freeze | cut -f 1 -d'=' | xargs -L1 pip show
比如下面的sn-p:
import os
import re
package = 'numpy'
regex = re.compile('.*{}($|,).*'.format(package))
def chunks(l, n): return [l[i:i+n] for i in range(0, len(l), n)]
cmd = "pip freeze | cut -f 1 -d'=' | xargs -L1 pip show"
packages = os.popen(cmd).read()
pkg_infos = chunks(packages.splitlines(), 5)
print '\n'.join(x[1][6:] for x in filter(lambda x: regex.match(x[-1]), pkg_infos))
在我的系统上输出pandas。
【讨论】: