【问题标题】:Find all packages installed with easy_install/pip?查找所有使用 easy_install/pip 安装的软件包?
【发布时间】:2011-09-29 20:41:26
【问题描述】:

有没有办法找到所有使用 easy_install 或 pip 安装的 Python PyPI 包?我的意思是,不包括使用分发工具安装/安装的所有内容(在本例中为 Debian 上的 apt-get)。

【问题讨论】:

标签: python pip easy-install pypi


【解决方案1】:

pip freeze 将输出已安装软件包及其版本的列表。它还允许您将这些包写入一个文件,以便以后用于设置新环境。

https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze

【讨论】:

【解决方案2】:

从 pip 1.3 版开始,您现在可以使用 pip list

它有一些有用的选项,包括显示过时软件包的能力。这是文档:https://pip.pypa.io/en/latest/reference/pip_list/

【讨论】:

  • 在 Gentoo 上,这会列出 所有 包,即使是通过 pip 以外的其他方式安装的包。这是否真的按照问题的要求排除了其他系统上未安装的 pip 模块?
  • 请注意,这与pip freeze略有不同
  • pip list --user 只显示用户安装的包,不包括系统范围的包。
  • @JacobHume --user 标志使 pip install 东西到用户安装目录。它不会列出使用sudo pip install packagexyz 安装的东西。
【解决方案3】:

如果有人想知道,您可以使用“pip show”命令。

pip show [options] <package>

这将列出给定包的安装目录。

【讨论】:

    【解决方案4】:

    开始于:

    $ pip list
    

    列出所有包。找到所需的包后,请使用:

    $ pip show <package-name>
    

    这将显示有关此软件包的详细信息,包括其文件夹。如果您已经知道包名,则可以跳过第一部分

    点击here了解更多点子秀信息,点击here了解更多点子列表信息。

    例子:

    $ pip show jupyter
    Name: jupyter
    Version: 1.0.0
    Summary: Jupyter metapackage. Install all the Jupyter components in one go.
    Home-page: http://jupyter.org
    Author: Jupyter Development Team
    Author-email: jupyter@googlegroups.org
    License: BSD
    Location: /usr/local/lib/python2.7/site-packages
    Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel    
    

    【讨论】:

    • 最佳答案恕我直言。如果我知道包名,真的很简单快捷。 pip list 甚至没有必要,冻结可能需要很长时间,我必须过滤掉我不关心的东西。很简单:pip show my_packge
    【解决方案5】:

    如果 Debian 在 pip install 默认目标方面表现得像最近的 Ubuntu 版本,那很容易:它安装到 /usr/local/lib/ 而不是 /usr/libapt 默认目标)。检查https://askubuntu.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

    我是 ArchLinux 用户,在尝试 pip 时遇到了同样的问题。这是我在 Arch 中解决它的方法。

    find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'
    

    这里的关键是/usr/lib/python2.7/site-packages,也就是pip安装到的目录,YMMV。 pacman -Qo 是 Arch 的 pac kage ma​​n ager 检查文件所有权的方式。 No package 是当没有包拥有该文件时它给出的回报的一部分:error: No package owns $FILENAME。棘手的解决方法:我正在查询__init__.py,因为pacman -Qo 在涉及目录时有点无知:(

    为了为其他发行版做这件事,你必须找出pip 安装东西的位置(只是sudo pip install 的东西),如何查询文件的所有权(Debian/Ubuntu 方法是dpkg -S)以及什么是“没有包拥有该路径”返回(Debian/Ubuntu 是 no path found matching pattern)。 Debian/Ubuntu 用户,请注意:dpkg -S 如果给它一个符号链接,它将失败。只需先使用realpath 解决它。像这样:

    find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'
    

    Fedora 用户可以尝试(感谢@eddygeek):

    find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
    

    【讨论】:

    • +1 非常感谢 Arch one-liner,这正是我想要的。顺便说一句,奇怪的事实:我的 Arch 安装本地化为意大利语,但 grep 正确地“grepped”了说“Nessun pacchetto”(意大利语为“No package”)的行,即使我 grep 为“No package”。怎么会?
    • @barraponto @NadirSampaoli grep 在我的情况下什么也没做。因为 grep 尝试在 stdout 中进行 grep,但 dpkg 将错误写入 stderr,所以我必须添加重定向 2&gt;&amp;1。对于国际输出,在xargs dpkg -s 前面添加LANG= sed 也是一个不错的工具;)只保留路径的包名。所以我最终得到:find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | LANG= xargs dpkg -S 2&gt;&amp;1 | grep 'no path found' | sed "s/.*\/\([^\/]*\)\/__init__\.py.*/\1/"
    • 嗨,我错误地投了反对票,才意识到这一点,现在我的投票被锁定了。有人可以投票来抵消我的反对票吗?谢谢
    【解决方案6】:

    pip.get_installed_distributions() 将给出已安装包的列表

    import pip
    from os.path import join
    
    for package in pip.get_installed_distributions():
        print(package.location) # you can exclude packages that's in /usr/XXX
        print(join(package.location, package._get_metadata("top_level.txt"))) # root directory of this package
    

    【讨论】:

    • 这将不再起作用。请参阅github.com/pypa/pip/issues/5243 相反,您应该使用: import pkg_resources [print(d.project_name) for d in pkg_resources.working_set]
    【解决方案7】:

    较新版本的 pip 能够通过 pip list -lpip freeze -l (--list) 执行 OP 想要的操作。
    在 Debian 上(至少),手册页并没有说明这一点,我只是在假设该功能必须存在的情况下才发现它的 pip list --help

    最近有一些 cmets 表明此功能在文档或现有答案中都不明显(尽管有人暗示),所以我认为我应该发布。我更愿意这样做作为评论,但我没有声誉积分。

    【讨论】:

    • 原来我们拥有pip freeze --local 8 年了。 pip list --local 也可用...但请注意,OP 问题不是关于虚拟环境(--local 支持),而是关于从 sudo pip install 包中辨别发行包。
    【解决方案8】:

    下面的内容有点慢,但它提供了pip 知道的格式良好的包列表。也就是说,并不是所有的都是“通过”pip安装的,但应该都是可以通过pip升级的。

    $ pip search . | egrep -B1 'INSTALLED|LATEST'
    

    它慢的原因是它列出了整个 pypi repo 的内容。我提交了一个ticket 建议pip list 提供类似的功能但更有效。

    示例输出:(将搜索限制为子集,而不是全部的“.”。)

    $ pip search selenium | egrep -B1 'INSTALLED|LATEST'
    
    selenium                  - Python bindings for Selenium
      INSTALLED: 2.24.0
      LATEST:    2.25.0
    --
    robotframework-selenium2library - Web testing library for Robot Framework
      INSTALLED: 1.0.1 (latest)
    $
    

    【讨论】:

    【解决方案9】:

    补充@Paul Woolcock 的回答,

    pip freeze > requirements.txt
    

    将在当前位置的活动环境中创建一个需求文件,其中包含所有已安装软件包以及已安装的版本号。跑步

    pip install -r requirements.txt
    

    将安装需求文件中指定的包。

    【讨论】:

      【解决方案10】:

      请注意,如果您的计算机上安装了多个 Python 版本,则可能有几个版本的 pip 与每个版本相关联。

      根据您的关联,您可能需要对使用的 pip 命令非常谨慎:

      pip3 list 
      

      为我工作,我正在运行 Python3.4。简单地使用pip list 返回错误The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip

      【讨论】:

      • pip 用于 python2.7,pip3 用于 python3.x
      【解决方案11】:

      正如@almenon 指出的那样,这不再有效,并且它不是在代码中获取包信息的受支持方式。以下引发异常:

      import pip
      installed_packages = dict([(package.project_name, package.version) 
                                 for package in pip.get_installed_distributions()])
      

      为此,您可以导入pkg_resources。这是一个例子:

      import pkg_resources
      installed_packages = dict([(package.project_name, package.version)
                                 for package in pkg_resources.working_set])
      

      我在v3.6.5

      【讨论】:

        【解决方案12】:

        这里是 Fedora 或其他 rpm 发行版的单行代码(基于 @barraponto 提示):

        find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
        

        将此附加到上一个命令以获得更清晰的输出:

         | sed -r 's:.*/(\w+)/__.*:\1:'
        

        【讨论】:

          【解决方案13】:

          获取site-packages/(和dist-packages/,如果存在)中的所有文件/文件夹名称,并使用您的包管理器删除通过包安装的那些。

          【讨论】:

            【解决方案14】:

            pip freeze 列出所有已安装的软件包,即使不是通过 pip/easy_install。 在 CentOs/Redhat 上可以找到通过 rpm 安装的软件包。

            【讨论】:

              【解决方案15】:

              如果你使用Anaconda python发行版,可以使用conda list命令查看是通过什么方法安装的:

              user@pc:~ $ conda list
              # packages in environment at /anaconda3:
              #
              # Name                    Version                   Build  Channel
              _ipyw_jlab_nb_ext_conf    0.1.0            py36h2fc01ae_0
              alabaster                 0.7.10           py36h174008c_0
              amqp                      2.2.2                     <pip>
              anaconda                  5.1.0                    py36_2
              anaconda-client           1.6.9                    py36_0
              

              获取pip(可能包括pip本身)安装的条目:

              user@pc:~ $ conda list | grep \<pip
              amqp                      2.2.2                     <pip>
              astroid                   1.6.2                     <pip>
              billiard                  3.5.0.3                   <pip>
              blinker                   1.4                       <pip>
              ez-setup                  0.9                       <pip>
              feedgenerator             1.9                       <pip>
              

              当然,您可能只想选择第一列,您可以使用它(如果需要,不包括pip):

              user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
              amqp        
              astroid
              billiard
              blinker
              ez-setup
              feedgenerator 
              

              最后,您可以使用以下方法获取这些值并 pip 卸载所有这些值:

              user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y
              

              注意pip uninstall 使用-y 标志以避免必须确认删除。

              【讨论】:

                【解决方案16】:

                对于那些没有安装 pip 的人,我在github 上找到了这个快速脚本(适用于 Python 2.7.13):

                import pkg_resources
                distros = pkg_resources.AvailableDistributions()
                for key in distros:
                  print distros[key]
                

                【讨论】:

                  【解决方案17】:

                  点列表[选项] 可以看完整参考here

                  【讨论】:

                  【解决方案18】:

                  至少对于 Ubuntu(也许还有其他人)可以这样工作(受此线程中以前的 post 启发):

                  printf "Installed with pip:";
                  pip list 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2016-12-04
                    • 1970-01-01
                    • 2014-12-04
                    • 2022-10-06
                    • 2014-02-07
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多