如何使用 pip 升级所有 Python 软件包
- 2024-12-31 08:38:00
- admin 原创
- 46
问题描述:
是否可以一次性升级所有 Python 包pip
?
注意:官方问题跟踪器上有一个针对此功能的请求。
解决方案 1:
目前还没有内置标志。从 pip 版本 22.3 开始,--outdated
和--format=freeze
已成为互斥的。使用 Python 来解析 JSON 输出:
pip --disable-pip-version-check list --outdated --format=json | python -c "import json, sys; print('
'.join([x['name'] for x in json.load(sys.stdin)]))" | xargs -n1 pip install -U
如果您正在使用,pip<22.3
则可以使用:
pip list --outdated --format=freeze | grep -v '^-e' | cut -d = -f 1 | xargs -n1 pip install -U
对于旧版本pip
:
pip freeze --local | grep -v '^-e' | cut -d = -f 1 | xargs -n1 pip install -U
这
grep
是为了跳过可编辑的(“-e”)包定义,正如@jawache所建议的那样。(是的,你可以用或或或...替换grep
+ )。cut
`sedawk
perl`如果更新一个包失败,则标志可以防止停止一切(感谢
-n1
@andsens )。xargs
注意:这有无限的潜在变化。我试图让这个答案简短明了,但请在评论中提出变化建议!
解决方案 2:
要升级所有本地包,您可以安装pip-review
:
$ pip install pip-review
此后,您可以以交互方式升级软件包:
$ pip-review --local --interactive
或者自动:
$ pip-review --local --auto
pip-review
是 的一个分支pip-tools
。请参阅@knedlsepp提到的pip-tools
问题。包可以工作,但包不再工作。正在寻找新的维护者。pip-review
`pip-tools`pip-review
pip-review
自 0.5 版起可在 Windows 上运行。
解决方案 3:
您可以使用以下 Python 代码。与 不同pip freeze
,这不会打印警告和 FIXME 错误。
对于 pip < 10.0.1
import pip
from subprocess import call
packages = [dist.project_name for dist in pip.get_installed_distributions()]
call("pip install --upgrade " + ' '.join(packages), shell=True)
对于 pip >= 10.0.1
import pkg_resources
from subprocess import call
packages = [dist.project_name for dist in pkg_resources.working_set]
call("pip install --upgrade " + ' '.join(packages), shell=True)
解决方案 4:
以下内容适用于 Windows,也适用于其他系统($
在命令提示符中,无论您身在何处。例如,C:/Users/Username)。
做
$ pip freeze > requirements.txt
打开文本文件,将 替换==
为>=
,或者让 sed 为您执行此操作:
$ sed -i 's/==/>=/g' requirements.txt
并执行:
$ pip install -r requirements.txt --upgrade
如果某个软件包阻碍了升级(有时是NumPy),只需转到目录 ($),注释掉名称(#
在名称前面添加 a)并再次运行升级。稍后您可以取消注释该部分。这对于复制 Python 全局环境也非常有用。
另一种方法:
我也喜欢 pip-review 方法:
py2
$ pip install pip-review
$ pip-review --local --interactive
py3
$ pip3 install pip-review
$ py -3 -m pip-review --local --interactive
您可以选择“a”来升级所有软件包;如果一次升级失败,请再次运行它并继续下一次升级。
解决方案 5:
使用pipupgrade!... 最新版本为 2019
pip install pipupgrade
pipupgrade --verbose --latest --yes
pipupgrade可帮助您从文件升级系统、本地或软件包requirements.txt
!它还会选择性地升级不会造成破坏的软件包。
pipupgrade 还确保升级多个 Python 环境中的软件包。它与 Python 2.7+、Python 3.4+ 和 pip 9+、pip 10+、pip 18+、pip 19+ 兼容。
注意:我是该工具的作者。
解决方案 6:
在查阅了Rob van der Woude 编写的出色文档后,我发现 Windows 版本:FOR
for /F "delims===" %i in ('pip freeze') do pip install --upgrade %i
您需要使用cmd.exe
(即命令提示符);如今,Windows 默认使用 PowerShell(尤其是如果您使用 Windows 终端),而此命令无法直接使用。或者键入cmd
PowerShell 以访问命令提示符。
解决方案 7:
在我看来,这个选项更加直接和易读:
pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`
(2024 年 10 月更新)或者,为了解决某些软件包升级失败的可能性(正如 user3064538、rubo77 和 mattmc3 在评论部分所建议的那样),我在这里添加了 mattmc3 提出的解决方案:
pip list --outdated | awk 'NR>2 {print $1}' | xargs -n1 pip install -U
解释是pip list --outdated
输出以下格式的所有过时软件包的列表:
Package Version Latest Type
--------- ------- ------ -----
fonttools 3.31.0 3.32.0 wheel
urllib3 1.24 1.24.1 wheel
requests 2.20.0 2.20.1 wheel
在AWK命令中,NR>2
跳过前两个记录(行)并{print $1}
选择每行的第一个单词(按照 SergioAraujo 的建议,我将其删除,tail -n +3
因为awk
确实可以处理跳过记录)。
解决方案 8:
下面这句话或许能有所帮助:
(点数 >= 22.3)
按照这个可读的答案:
pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`
或按照接受的答案:
pip --disable-pip-version-check list --outdated --format=json |
python -c "import json, sys; print('
'.join([x['name'] for x in json.load(sys.stdin)]))" |
xargs -n1 pip install -U
(点差 20.0 < 22.3)
pip list --format freeze --outdated | sed 's/=.*//g' | xargs -n1 pip install -U
旧版本:
pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U
xargs -n1
如果发生错误则继续。
如果您需要对省略的内容和引发错误的内容进行更“细粒度”的控制,则不应添加-n1
标志并明确定义要忽略的错误,通过为每个单独的错误“管道”以下行:
| sed 's/^<First characters of the error>.*//'
这是一个有效的例子:
pip list --format freeze --outdated | sed 's/=.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U
解决方案 9:
您可以只打印过时的软件包:
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
解决方案 10:
更强大的解决方案
对于pip3,使用以下命令:
pip3 freeze --local |sed -rn 's/^([^=# \\][^ =]*)=.*/echo; echo Processing ...; pip3 install -U /p' |sh
对于pip,只需删除 3 即可:
pip freeze --local |sed -rn 's/^([^=# \\][^ =]*)=.*/echo; echo Processing ...; pip install -U /p' |sh
OS X 奇异现象
截至 2017 年 7 月,OS X 附带的sed版本非常老旧(已有十几年历史)。要获取扩展正则表达式,请使用上述解决方案中-E
的 而不是。-r
使用流行解决方案解决问题
该解决方案经过精心设计和测试1,而即使是最流行的解决方案也存在问题。
由于改变 pip 命令行功能而导致的可移植性问题
由于常见的 pip 或 pip3 子进程故障导致xargs崩溃
来自原始xargs输出的拥挤日志记录
依赖 Python 到 OS 的桥接器,同时可能对其进行升级3
上述命令使用最简单、最可移植的pip语法与sed和sh相结合,完全克服了这些问题。sed操作的详细信息可以通过注释版本2来查看。
细节
[1] 在 Linux 4.8.16-200.fc24.x86_64 集群中测试并定期使用,并在其他五种 Linux/Unix 版本中测试。它还可以在安装在 Windows 10 上的 Cygwin64 上运行。需要在 iOS 上进行测试。
[2] 为了更清楚地了解命令的结构,这与上面的 pip3 命令完全等效,但带有注释:
# Match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \\][^ =]*)=.*"
# Separate the output of package upgrades with a blank line
sed="$sed/echo"
# Indicate what package is being processed
sed="$sed; echo Processing ..."
# Perform the upgrade using just the valid package name
sed="$sed; pip3 install -U "
# Output the commands
sed="$sed/p"
# Stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local | sed -rn "$sed" | sh
[3] 在升级 Python 或 PIP 组件时,如果还使用某个 Python 或 PIP 组件,则可能会导致死锁或包数据库损坏。
解决方案 11:
我在升级时遇到了同样的问题。问题是,我从不升级所有软件包。我只升级我需要的软件包,因为项目可能会崩溃。
因为没有简单的方法可以逐个包地升级,并更新 requirements.txt 文件,所以我编写了这个pip-upgrader ,它还可以更新文件中所选包(或所有包)的版本。requirements.txt
安装
pip install pip-upgrader
用法
激活您的虚拟环境(很重要,因为它还将在当前虚拟环境中安装升级包的新版本)。
cd
进入你的项目目录,然后运行:
pip-upgrade
高级用法
如果需求放在非标准位置,则将它们作为参数发送:
pip-upgrade path/to/requirements.txt
如果您已经知道要升级哪个包,只需将它们作为参数发送即可:
pip-upgrade -p django -p celery -p dateutil
如果您需要升级到预发布/后发布版本,请--prerelease
在命令中添加参数。
全面披露:这个包是我写的。
解决方案 12:
这看上去更简洁。
pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U
解释:
pip list --outdated
得到如下的行
urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]
在 中cut -d ' ' -f1
,-d ' '
设置“空格”作为分隔符,-f1
即获取第一列。
因此上面的代码变为:
urllib3
wheel
然后将它们传递给xargs
运行命令pip install -U
,每行作为附加参数。
-n1
将传递给每个命令的参数数量限制pip install -U
为 1。
解决方案 13:
拉玛那 (Ramana) 回答的单行版本。
python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
解决方案 14:
来自蛋黄:
pip install -U `yolk -U | awk '{print $1}' | uniq`
不过,你首先需要得到蛋黄:
sudo pip install -U yolk
解决方案 15:
pip_upgrade_outdated
(基于这个较旧的脚本)可以完成这项工作。根据其文档:
usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
[--serial | --parallel] [--dry_run] [--verbose]
[--version]
Upgrade outdated python packages with pip.
optional arguments:
-h, --help show this help message and exit
-3 use pip3
-2 use pip2
--pip_cmd PIP_CMD use PIP_CMD (default pip)
--serial, -s upgrade in serial (default)
--parallel, -p upgrade in parallel
--dry_run, -n get list, but don't upgrade
--verbose, -v may be specified multiple times
--version show program's version number and exit
步骤 1:
pip install pip-upgrade-outdated
第 2 步:
pip_upgrade_outdated
解决方案 16:
在 Windows 或 Linux 上更新 Python 包
将已安装包的列表输出到需求文件(requirements.txt)中:
pip freeze > requirements.txt
编辑 requirements.txt,将所有 '==' 替换为 '>='。使用编辑器中的“全部替换”命令。
升级所有过时的软件包
pip install -r requirements.txt --upgrade
来源:如何更新所有 Python 软件包
解决方案 17:
我在pip 问题讨论中找到的最简单、最快的解决方案是:
pip install pipdate
pipdate
来源:https ://github.com/pypa/pip/issues/3819
解决方案 18:
当使用虚拟环境时,如果您只想升级添加到虚拟环境的软件包,您可能需要执行以下操作:
pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
解决方案 19:
Windows PowerShell 解决方案
pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
解决方案 20:
使用AWK更新包:
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
Windows PowerShell更新
foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
解决方案 21:
在具有管理员权限的PowerShell 5.1、Python 3.6.5 和pip版本 10.0.1中,有一行:
pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}
如果清单中没有破损的包裹或特殊的轮子,它就能顺利运行……
解决方案 22:
您可以尝试以下操作:
for i in `pip list | awk -F ' ' '{print $1}'`; do pip install --upgrade $i; done
解决方案 23:
如果你已经pip<22.3
安装了纯Bash / Z shell ,则可以使用以下一行代码来实现该目的:
for p in $(pip list -o --format freeze); do pip install -U ${p%%=*}; done
或者,以一种格式良好的方式:
for p in $(pip list -o --format freeze)
do
pip install -U ${p%%=*}
done
在此之后,您将发现pip>=22.3
其中-o
和--format freeze
是互斥的,并且您将无法再使用这条单行代码。
解决方案 24:
令人惊奇的蛋黄让这一切变得简单。
pip install yolk3k # Don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade
有关 yolk 的更多信息:https ://pypi.python.org/pypi/yolk/0.4.3
它可以做很多你可能会觉得有用的事情。
解决方案 25:
使用:
pip install -r <(pip freeze) --upgrade
解决方案 26:
没必要那么麻烦或者安装一些包。
在Linux shell上更新 pip 包:
pip list --outdated --format=freeze | awk -F"==" '{print $1}' | xargs -i pip install -U {}
在Windows powershell上更新 pip 包:
pip list --outdated --format=freeze | ForEach { pip install -U $_.split("==")[0] }
一些观点:
pip
将python 版本替换为pip3
或pip2
。pip list --outdated
检查过时的 pip 包。--format
在我的 pip 版本 22.0.3 上只有 3 种类型:columns(默认)、freeze 或 json。freeze
在命令管道中是更好的选择。尽可能保持命令简单并且可供尽可能多的系统使用。
解决方案 27:
Windows 上最短、最简单的。
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
解决方案 28:
对我来说, Ramana 的回答是最有效的,但我不得不补充几点:
import pip
for dist in pip.get_installed_distributions():
if 'site-packages' in dist.location:
try:
pip.call_subprocess(['pip', 'install', '-U', dist.key])
except Exception, exc:
print exc
检查site-packages
排除了我的开发包,因为它们不在系统 site-packages 目录中。try-except 只是跳过已从 PyPI 中删除的包。
对于 endolith:我也希望它是简单的pip.install(dist.key, upgrade=True)
,但它看起来不像是 pip 被命令行以外的任何东西使用(文档中没有提到内部 API,并且 pip 开发人员没有使用文档字符串)。
解决方案 29:
这是针对 Python 3 的 PowerShell 解决方案:
pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }
对于 Python 2:
pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }
这将逐个升级软件包。因此
pip3 check
pip2 check
之后应确保没有依赖关系被破坏。
解决方案 30:
这应该更有效:
pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "
" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U
pip list -o
列出过时的软件包;grep -v -i warning
反向匹配warning
以避免更新时出错cut -f1 -d1' '
返回第一个单词——过时包的名称;`tr "
|
" " "将多行结果转换
cut`为单行、空格分隔的列表;
awk '{if(NR>=3)print}'
跳过标题行cut -d' ' -f1
获取第一列xargs -n1 pip install -U
从其左侧的管道中获取 1 个参数,并将其传递给升级包列表的命令。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件