找到使用easy_install/pip安装的所有包?

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

483312 次浏览

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

< a href = " https://pip.pypa。io / en /稳定/引用/ pip_freeze / # pip-freeze noreferrer“rel = > https://pip.pypa.io/en/stable/reference/pip_freeze/ pip-freeze < / >

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

下面的代码有点慢,但它给出了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)
$

如果Debian在pip install默认目标方面表现得像最近的Ubuntu版本,那么它非常简单:它安装到/usr/local/lib/而不是/usr/lib (apt默认目标)。检查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 男人。 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'

在pip的1.3版本中,你现在可以使用pip list

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

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

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

下面是fedora或其他rpm发行版的一行代码(基于@barraponto tips):

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:'

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

pip show [options] <package>

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

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

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

pip install -r requirements.txt

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

pip的新版本能够通过pip list -lpip freeze -l (--list)完成OP想要做的事情 在Debian上(至少),手册页并没有明确说明这一点,我只是在这个特性必须存在的假设下发现了它——pip list --help.

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

开始:

$ pip list

列出所有软件包。一旦你找到你想要的包,使用:

$ pip show <package-name>

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

点击在这里查看pip show的更多信息,点击在这里查看pip list的更多信息。

例子:

$ 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

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

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

最后,你可以获取这些值,并使用以下命令卸载它们:

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

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

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

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

正如@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 list[选项] 你可以看到完整的引用在这里