查找使用easy_install / pip安装的所有软件包?

时间:2011-07-06 18:00:03

标签: python pip easy-install pypi

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

18 个答案:

答案 0 :(得分:350)

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

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

答案 1 :(得分:237)

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

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

答案 2 :(得分:131)

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

pip show [options] <package>

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

答案 3 :(得分:23)

如果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 man 愤怒如何检查文件的所有权。如果没有包拥有该文件,则No package是其返回的一部分:error: No package owns $FILENAME。棘手的解决方法:我查询了__init__.py因为pacman -Qo在目录方面有点无知:(

为了对其他发行版执行此操作,您必须找出pip安装内容的位置(仅sudo pip install内容),如何查询文件的所有权(Debian / Ubuntu方法为{{ 1}})什么是&#34;没有包拥有该路径&#34; return(Debian / Ubuntu是dpkg -S)。 Debian / Ubuntu用户,请注意:如果您给它一个符号链接,no path found matching pattern将失败。首先使用dpkg -S解决此问题。像这样:

realpath

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

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

答案 4 :(得分:16)

开始于:

$ 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    

答案 5 :(得分:6)

以下内容有点慢,但它提供了pip知道的格式良好的软件包列表。也就是说,并非所有这些都是“by”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)
$

答案 6 :(得分:5)

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

答案 7 :(得分: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

答案 8 :(得分:3)

添加@Paul Woolcock的答案,

$ pip freeze > requirements.txt

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

$ pip install -r requirements.txt

在其他环境中安装需求。

答案 9 :(得分:3)

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

最近的评论表明,这个功能在文档或现有答案中都不明显(虽然有些人暗示过),所以我想我应该发帖。我宁愿这样做作为评论,但我没有声望点。

答案 10 :(得分: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:'

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

答案 13 :(得分:1)

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

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

答案 14 :(得分:1)

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

答案 15 :(得分:0)

如果您使用 Anaconda python发行版,您可以使用filter_input()命令查看通过哪种方法安装的内容:

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

最后,您可以使用以下内容获取这些值并使用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 使用-y标记,以避免必须确认删除。

答案 16 :(得分:0)

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

答案 17 :(得分:0)

点列表[选项] 您可以看到完整的参考书https://openradar.appspot.com/33893852