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


当前回答

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

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

其他回答

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

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

如果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'

如果你使用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标志,以避免在删除时必须给出确认。

在保罗·伍尔考克的回答中,

pip freeze > requirements.txt

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

pip install -r requirements.txt

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

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

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