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

Jür*_*ard 381 python pip easy-install pypi

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

小智 367

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

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

  • 从版本1.3开始,'pip list'已被添加.请参阅下面的答案以及此处的文档:http://www.pip-installer.org/en/latest/usage.html#pip-list (87认同)
  • `pip freeze`和`pip list`列出了一切.它们不排除"pip"未安装的软件包. (14认同)
  • 列出并冻结输出不同的格式(截至撰写时).冻结输出可用于重建环境:http://docs.python-guide.org/en/latest/dev/virtualenvs/#other-notes (7认同)
  • 新的 (?) `pip list -l` 或 `pip list --local` 是最佳答案,请参阅 @MJB 的 http://stackoverflow.com/a/43012269/491884 (3认同)

key*_*its 246

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

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

  • 在Gentoo上,这列出了*all*这些包,甚至包括通过pip之外的其他方式安装的包.这是否真的排除了问题所要求的其他系统上的非pip安装模块? (3认同)
  • `pip list --user` 仅显示用户安装的软件包,不包括系统范围的软件包。 (2认同)

Dan*_*kes 135

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

pip show [options] <package>
Run Code Online (Sandbox Code Playgroud)

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


Cap*_*iel 24

如果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'
Run Code Online (Sandbox Code Playgroud)

这里的关键是/usr/lib/python2.7/site-packages,是pip安装目录,YMMV.pacman -Qo是Arch的pac kage man 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'
Run Code Online (Sandbox Code Playgroud)

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

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
Run Code Online (Sandbox Code Playgroud)

  • +1非常感谢Arch one-liner,这正是我想要的.顺便说一句,奇怪的事实是:我的Arch安装本地化为意大利语,但grep正确地'grepped'表示'Nessun pacchetto'(意大利语为'No package')的行,即使我为'No package'而烦恼.怎么会? (2认同)

ng1*_*g10 17

从...开始:

$ pip list
Run Code Online (Sandbox Code Playgroud)

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

$ pip show <package-name>
Run Code Online (Sandbox Code Playgroud)

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

点击这里对PIP显示更多的信息,这里的PIP列表的详细信息.

例:

$ 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    
Run Code Online (Sandbox Code Playgroud)


小智 8

较新版本的 pip 能够通过pip list -lpip freeze -l( --list)执行 OP 想要的操作。
在 Debian(至少)上,手册页没有明确说明这一点,我只发现它 - 在该功能必须存在的假设下 - 带有pip list --help.

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


Mar*_*kHu 6

下面的内容有点慢,但它提供了一个格式良好的软件包列表pip.也就是说,并非所有这些都是"by"pip安装的,但所有这些都应该能够通过pip进行升级.

$ pip search . | egrep -B1 'INSTALLED|LATEST'
Run Code Online (Sandbox Code Playgroud)

它很慢的原因是它列出了整个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)
$
Run Code Online (Sandbox Code Playgroud)


Mar*_*rty 6

添加到@Paul Woolcock 的回答中,

pip freeze > requirements.txt
Run Code Online (Sandbox Code Playgroud)

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

pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

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


yeg*_*gle 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
Run Code Online (Sandbox Code Playgroud)

  • 这将不再起作用。请参阅 https://github.com/pypa/pip/issues/5243 相反,您应该使用: import pkg_resources [print(d.project_name) for d in pkg_resources.working_set] (2认同)