有没有办法找到使用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)
$

其他回答

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

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

pip3 list 

对我有用,我在那里运行Python3.4。简单地使用pip列表返回错误“pip”程序当前未安装。您可以通过输入:sudo apt-get install python-pip来安装它。

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

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

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

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

注意,pip卸载时使用了-y标志,以避免在删除时必须给出确认。

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

如果Debian在pip安装默认目标方面表现得像最近的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。qo是Arch的package管理器检查文件所有权的方法。当没有包拥有该文件时,没有包是它给出的返回的一部分:棘手的解决方法:我正在查询__init__.py,因为pacman -Qo在涉及到目录时有点无知:(

为了在其他发行版上做到这一点,你必须找出pip在哪里安装东西(只需sudo pip install一些东西),如何查询文件的所有权(Debian/Ubuntu的方法是dpkg -S),以及“没有包拥有该路径”的返回是什么(Debian/Ubuntu是没有路径找到匹配模式)。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'