422

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

4

18 回答 18

401

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

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

于 2011-07-06T18:02:35.300 回答
268

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

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

于 2013-05-26T12:16:59.963 回答
139

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

pip show [options] <package>

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

于 2014-10-24T01:03:49.577 回答
28

从...开始:

$ pip list

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

$ pip show <package-name>

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

点击这里了解更多关于点子秀的信息,点击这里了解更多关于点子列表的信息。

例子:

$ 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    
于 2017-06-05T17:10:23.190 回答
26

如果 Debian 在默认目标方面表现得像最近的 Ubuntu 版本pip install,那很容易:它安装到/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 的管理器检查文件所有权的方式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'
于 2013-02-22T12:57:37.360 回答
8

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
于 2014-01-21T03:39:17.263 回答
8

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

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

于 2017-03-25T03:40:54.520 回答
6

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

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

它慢的原因是它列出了整个 pypi repo 的内容。我提交了一张票,建议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)
$
于 2012-10-24T22:05:49.910 回答
6

添加到@Paul Woolcock 的答案,

pip freeze > requirements.txt

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

pip install -r requirements.txt

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

于 2017-01-03T06:07:19.333 回答
4

请注意,如果您的计算机上安装了多个版本的 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

于 2016-09-24T21:41:07.217 回答
3

正如@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

于 2019-04-12T15:59:09.237 回答
2

这是 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:'
于 2014-03-24T15:14:34.793 回答
1

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

于 2011-07-06T18:02:55.947 回答
1

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

于 2013-11-20T14:10:24.867 回答
1

pip list [options] 你可以在这里看到完整的参考

于 2019-12-30T23:27:14.103 回答
1

如果你使用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

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

于 2018-05-19T01:19:24.567 回答
1

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

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]
于 2018-10-15T16:26:41.467 回答
0

至少对于 Ubuntu(也许还有其他人)可以这样做(受此线程上一篇文章的启发)

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
于 2018-04-05T10:41:46.203 回答