【问题标题】:How can I see all packages that depend on a certain package with PIP?如何使用 PIP 查看依赖于某个包的所有包?
【发布时间】:2014-01-05 06:41:21
【问题描述】:

我想查看依赖于带有 PIP 的某个包的包列表。也就是说,给定django,我希望看到django-cmsdjango-filer,因为我已经安装了这些包并且它们都具有django 作为依赖项。

【问题讨论】:

  • PIP 已安装:pip 1.4.1

标签: python package pip


【解决方案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 提供对未安装包的依赖。

【讨论】:

  • 你错了。我想看看给定包需要什么,而不是给定包需要什么。
  • @DonQuestion 但这仅显示当前安装的软件包,对吗?有没有办法搜索整个 PyPi 列表?
  • 这不起作用,但返回错误:用法:pip show [options] ...没有这样的选项:--------------- ---
  • 把这个留给我悲伤的自己,同时跳过警告以在已弃用的 python 版本上运行它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
【解决方案2】:

从版本 10 开始,pip show 还包含一个“Required-by”条目。所以就

pip show <package_name>

现在已经足够了。或者可能

pip show <package_name> | grep ^Required-by

如果您只想为脚本或其他内容获取那一行。

【讨论】:

    【解决方案3】:

    我知道这里已经有一个公认的答案,但实际上,在我看来,你想要的是使用pipdeptree

    pip install pipdeptree
    pipdeptree --help
    
    pipdeptree -r -p django
    

    【讨论】:

    • 应该被接受的答案!原因:1.适用于python生态系统,对于python开发人员来说比@Don_Question的答案更舒服。 2. 非常简单的命令 3. 提及专为解决 OP 问题而设计的 CLI 工具
    • 你说得有道理!但是 pipdeptree 比这个问题要年轻得多。如果你需要一个一次性的解决方案,你真的不想安装一个包,当你可以在 shellscript 的“一个”行中做到这一点时! ;-)
    • 只是想明确指出,这个(好的)答案与接受的答案有一个限制:它不会告诉您未安装的软件包。 (我来这里是为了寻找额外的功能来解决一个无法安装在我的 M1 Mac 上的包。)
    【解决方案4】:

    基于 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
    

    【讨论】:

      【解决方案5】:

      这个,对于早于 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

      【讨论】:

      • 我一直在寻找更直接的东西,只需要一些 shell 命令的东西。
      • @linkyndy 看看我的回答! :-)
      猜你喜欢
      • 2019-10-14
      • 2015-10-19
      • 2016-12-04
      • 2016-05-18
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多