有没有办法找到所有使用easy_install或pip安装的Python PyPI包?我的意思是,排除使用分发工具安装的所有内容(在本例中为apt-get on Debian)。
pip freeze
将输出已安装软件包及其版本的列表。它还允许您将这些包写入文件,以后可用于设置新环境。
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
较新版本的pip能够通过pip list -l或pip freeze -l执行OP所需的功能。在Debian(至少)上,手册页没有说明这一点,我只是在假设该特征必须存在的情况下才发现它 - 使用pip list --help。
最近的评论表明,这个功能在文档或现有答案中都不明显(虽然有些人暗示过),所以我想我应该发帖。我宁愿这样做作为评论,但我没有声望点。
这是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:'
获取site-packages/
中的所有文件/文件夹名称(如果存在,则获取dist-packages/
),并使用包管理器删除通过包安装的文件/文件夹名称。
pip freeze列出了所有已安装的软件包,即使不是pip / easy_install也是如此。在CentOs / Redhat上找到通过rpm安装的软件包。
对于那些没有安装pip的人,我在github上找到了这个快速脚本(与Python 2.7.13一起使用):
import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
print distros[key]
正如@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
至少对于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
如果您使用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
,以避免必须确认删除。
从版本1.3的pip开始,您现在可以使用pip list
它有一些有用的选项,包括显示过时的包的能力。这是文档:https://pip.pypa.io/en/latest/reference/pip_list/
如果有人想知道你可以使用'pip show'命令。
pip show [options] <package>
这将列出给定包的安装目录。
如果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'
这里的关键是/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'
Fedora用户可以试试(感谢@eddygeek):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
从...开始:
$ pip list
列出所有包。找到所需的包后,使用:
$ pip show <package-name>
这将显示有关此程序包的详细信息,包括其文件夹。如果您已经知道包名,则可以跳过第一部分
有关pip list和here的更多信息,请单击here以获取有关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: [email protected]
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel
下面有点慢,但它提供了pip
知道的格式良好的包列表。也就是说,并非所有这些都是“by”pip安装的,但所有这些都应该能够通过pip进行升级。
$ pip search . | egrep -B1 'INSTALLED|LATEST'
它很慢的原因是它列出了整个pypi仓库的内容。我提交了一个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)
$
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
请注意,如果您的计算机上安装了多个版本的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
。
添加到@Paul Woolcock的答案,
$ pip freeze > requirements.txt
将在您可以运行的当前位置的活动环境中创建一个包含所有已安装软件包的需求文件
$ pip install -r requirements.txt
在另一个环境中安装需求。