关于python:查找所有用easy-install/pip安装的包?

 2019-04-28 

Find all packages installed with easy_install/pip?

有没有办法找到所有用easy-install或pip安装的python pypi包?我的意思是,不包括已经安装/已经安装了分发工具的所有内容(在本例中,倾向于使用Debian)。


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

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


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

它有一些有用的选项,包括显示过时包的功能。文档如下:https://pip.pypa.io/en/latest/reference/pip_list/


如果有人想知道你可以使用"pip show"命令。

1
pip show [options] <package>

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


如果debian的行为类似于最近的Ubuntu版本中的pip install默认目标,那么它非常容易安装到/usr/local/lib/而不是/usr/lib默认目标(apt)。查看https://askubuntu.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747

我是一个archlinux用户,在使用pip进行试验时,我遇到了同样的问题。以下是我如何在拱门中解决的。

1
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管理员检查文件所有权的方法。当没有包拥有文件时,No package是返回文件的一部分:error: No package owns $FILENAME。棘手的解决方法:我在查询__init__.py,因为pacman -Qo在目录方面有点无知:(

为了在其他发行版上实现这一点,您必须了解pip安装东西的位置(只是sudo pip install某物)、如何查询文件的所有权(debian/ubuntu方法是dpkg -S)以及"no package owners that path"返回(debian/ubuntu是no path found matching pattern)是什么。Debian/Ubuntu用户,注意:如果给它一个符号链接,dpkg -S将失败。先用realpath解决。这样地:

1
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):

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


开始:

1
$ pip list

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

1
$ pip show <package-name>

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

单击此处以获取有关PIP显示的更多信息,单击此处以获取有关PIP列表的更多信息。

例子:

1
2
3
4
5
6
7
8
9
10
$ 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知道的格式良好的包列表。也就是说,不是所有的软件都是由PIP安装的,但是所有的软件都应该能够通过PIP升级。

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

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

示例输出:(将搜索限制为一个子集,而不是针对所有子集的".")。

1
2
3
4
5
6
7
8
9
$ 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.get_installed_distributions()将给出已安装软件包的列表。

1
2
3
4
5
6
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


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

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

1
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


加上@paul woolcock的答案,

1
$ pip freeze > requirements.txt

将在当前可以运行的位置创建一个包含活动环境中所有已安装包的需求文件

1
$ pip install -r requirements.txt

在另一个环境中安装需求。


新版本的PIP能够通过pip list-l或pip freeze-l。在Debian(至少)上,手册页并没有说明这一点,我只是在假设该特性必须存在的前提下发现了它——使用pip list——帮助。

最近有评论认为这个特性在文档或现有答案中都不明显(尽管有人暗示过),所以我认为我应该发布。我宁愿这样做作为一个评论,但我没有信誉点。


下面是Fedora或其他RPM发行版的一个内衬(基于@barraponto tips):

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

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

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


pip freeze列出所有已安装的软件包,即使不是通过pip/easy_安装。在CentOS/RedHat上找到通过RPM安装的软件包。


对于那些没有安装PIP的用户,我在GitHub上找到了这个快速脚本(与Python2.7.13一起使用):

1
2
3
4
import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]

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


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

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

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

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

我在江户十一〔七〕号


至少对于Ubuntu(可能还有其他人)来说是这样的(灵感来源于这篇文章的前一篇文章):

1
2
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


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

1
2
3
4
5
6
7
8
9
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本身):

1
2
3
4
5
6
7
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):

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

最后,您可以获取这些值,并使用以下命令PIP卸载所有这些值:

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

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