有没有办法找到使用easy_install或pip安装的所有Python PyPI包?我的意思是,不包括发行版工具(在Debian上的apt-get)安装的所有东西。


当前回答

下面的代码有点慢,但是它给出了pip所知道的一个格式良好的包列表。也就是说,并不是所有的都是“由”pip安装的,但是它们都应该能够由pip升级。

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

它慢的原因是它列出了整个pypi回购的内容。我提交了一张罚单,建议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)
$

其他回答

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

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

获取site-packages/(以及dist-packages/如果存在的话)中的所有文件/文件夹名,并使用包管理器剥离通过package安装的文件/文件夹名。

至少对于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

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

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

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