如何使用 pip 升级所有 Python 软件包

2024-12-31 08:38:00
admin
原创
46
摘要:问题描述:是否可以一次性升级所有 Python 包pip?注意:官方问题跟踪器上有一个针对此功能的请求。解决方案 1:目前还没有内置标志。从 pip 版本 22.3 开始,--outdated和--format=freeze已成为互斥的。使用 Python 来解析 JSON 输出:pip --disable-...

问题描述:

是否可以一次性升级所有 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`sedawkperl`

  • 如果更新一个包失败,则标志可以防止停止一切(感谢-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 终端),而此命令无法直接使用。或者键入cmdPowerShell 以访问命令提示符。

解决方案 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语法与sedsh相结合,完全克服了这些问题。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 包

  1. 将已安装包的列表输出到需求文件(requirements.txt)中:

pip freeze > requirements.txt
  1. 编辑 requirements.txt,将所有 '==' 替换为 '>='。使用编辑器中的“全部替换”命令。

  2. 升级所有过时的软件包

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 版本替换为pip3pip2

  • pip list --outdated检查过时的 pip 包。

  • --format在我的 pip 版本 22.0.3 上只有 3 种类型:columns(默认)、freeze 或 jsonfreeze在命令管道中是更好的选择。

  • 尽可能保持命令简单并且可供尽可能多的系统使用。

解决方案 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
  1. pip list -o列出过时的软件包;

  2. grep -v -i warning反向匹配warning以避免更新时出错

  3. cut -f1 -d1' '返回第一个单词——过时包的名称;

  4. `tr "
    |

" " "将多行结果转换cut`为单行、空格分隔的列表;

  1. awk '{if(NR>=3)print}'跳过标题行

  2. cut -d' ' -f1获取第一列

  3. xargs -n1 pip install -U从其左侧的管道中获取 1 个参数,并将其传递给升级包列表的命令。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   997  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   34  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   40  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   39  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   71  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用