Answers:
pip freeze
将输出已安装软件包及其版本的列表。它还允许您将那些程序包写入文件,以便以后用于设置新环境。
https://pip.pypa.io/zh_CN/stable/reference/pip_freeze/#pip-freeze
pip freeze
并pip list
列出所有内容。他们不排除尚未安装的软件包pip
。
pip freeze
在脚本中是可靠的,但是pip list
与管道一起使用时会生成意外错误。
如果Debian在pip install
默认目标上的行为类似于最近的Ubuntu版本,那就太简单了:它安装到(/usr/local/lib/
而不是/usr/lib
(apt
默认目标))。检查/ubuntu/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卡格男人几岁检查该文件的所有权。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'
dpkg
将错误写入stderr,所以我必须添加一个redirect 2>&1
。对于国际输出,请LANG=
在xargs dpkg -s
。并且sed
还是不错的工具;)仅保留路径的包名称。所以我最终得到:find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | LANG= xargs dpkg -S 2>&1 | grep 'no path found' | sed "s/.*\/\([^\/]*\)\/__init__\.py.*/\1/"
从...开始:
$ pip list
列出所有软件包。找到所需的软件包后,请使用:
$ pip show <package-name>
这将显示有关此软件包的详细信息,包括其文件夹。如果您已经知道软件包名称,则可以跳过第一部分
点击这里对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
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
下面的程序有点慢,但是它给出了一个可以识别的格式良好的软件包列表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)
$
较新版本的pip可以通过pip list -l
或pip freeze -l
(--list
)执行OP所需的操作。
在Debian上(至少),手册页对此没有明确说明,而我只是在假设该功能必须存在的情况下才发现了with pip list --help
。
最近有评论表明此功能在文档或现有答案中均不明显(尽管有人暗示),所以我认为应该发布。我本来希望以此作为评论,但我没有信誉点。
pip freeze --local
8年了。pip list --local
也可用...但是请注意,OP问题不是关于虚拟环境(--local
支持),而是关于从sudo pip install
软件包中识别发行版软件包。
正如@almenon指出的那样,这不再起作用,它也不是在代码中获取包信息的支持方式。以下引发异常:
import pip
installed_packages = dict([(package.project_name, package.version)
for package in pip.get_installed_distributions()])
为此,您可以import pkg_resources
。这是一个例子:
import pkg_resources
installed_packages = dict([(package.project_name, package.version)
for package in pkg_resources.working_set])
我上线了 v3.6.5
获取site-packages/
(dist-packages/
如果存在)所有文件/文件夹的名称,然后使用包管理器剥离通过软件包安装的文件/文件夹名称。
如果使用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
最后,您可以获取这些值并使用以下命令pip卸载所有这些值:
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y
请注意,使用-y
标记pip uninstall
来避免必须确认删除。
至少对于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