如何使用 pip 升级所有 Python 包

How to upgrade all Python packages with pip

提问人:thedjpetersen 提问时间:4/27/2010 最后编辑:Peter Mortensenthedjpetersen 更新时间:9/5/2023 访问量:1803993

问:

想改进这篇文章吗?提供此问题的详细答案,包括引文和解释为什么您的答案是正确的。没有足够细节的答案可能会被编辑或删除。

是否可以使用 pip 一次升级所有 Python 包?

注意:官方问题跟踪器上有一个功能请求

python 点数

评论

70赞 Colonel Panic 5/22/2013
谨防软件腐烂 - 升级依赖项可能会破坏您的应用程序。您可以使用 (like 或 ) 列出所有已安装软件包的确切版本。最好在修补之前保存一份副本。pip freezebundle installnpm shrinkwrap
6赞 Cyberwiz 2/24/2021
如果你想更新一个包及其所有依赖项(可以说是一个更明智的方法),请这样做: pip install -U --upgrade-strategy eager your-package
14赞 3/7/2021
我使用 PowerShell 7,目前我使用这个单行:(我还无法在此处发布答案)pip list --format freeze | %{pip install --upgrade $_.split('==')[0]}
1赞 qwr 9/12/2022
对于那些像我一样想知道的人来说,直到最近 pip 还没有依赖解析器。github.com/pypa/pip/issues/4551

答:

2829赞 rbp 8/11/2010 #1

目前还没有内置标志。从 pip 版本 22.3 开始,和 变得互斥。使用 Python 解析 JSON 输出:--outdated--format=freeze

pip --disable-pip-version-check list --outdated --format=json | python -c "import json, sys; print('\n'.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

  • 这是跳过可编辑的 (“-e”) 包定义,如 @jawache 所建议的那样。(是的,您可以将 + 替换为 or 或 or...)。grepgrepcutsedawkperl

  • 如果更新一个包失败,则防止停止所有内容的标志(感谢@andsens)。-n1xargs


注意:这有无限的潜在变化。我试图保持这个答案简短明了,但请在评论中提出一些变化!

评论

81赞 rbp 8/12/2011
正确的:(这个问题现在存在于 github.com/pypa/pip/issues/59 .但每个建议似乎都以“是的,但我太确定 X 是否是做 Y 的正确方法”来回答......现在总比没有好吗?实用性胜过纯粹性?:(
28赞 Jabba 9/13/2011
它还打印那些使用普通包管理器(如 apt-get 或 Synaptic)安装的软件包。如果我执行此操作,它将更新所有包。恐怕会引起与apt-get的冲突。pip install -U
8赞 LasseValentini 3/5/2013
如何将 grep 更改为:egrep -v '^(\-e|#)'(我在 ubuntu 12.10 上运行它时得到这一行:“## FIXME:无法在此包的dependency_links中找到 svn URL:”。
43赞 Emil L 3/4/2014
在进行实际升级之前,我会先输入一个,以便您可以获得原始版本的列表。例如 这样,如果有任何问题,可以更容易地恢复。teepip freeze --local | tee before_upgrade.txt | ...
13赞 Mario S 3/17/2016
我添加了以避免烦人的错误消息:-Hsudo$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
834赞 user515656 4/30/2011 #2

您可以使用以下 Python 代码。与 不同,这不会打印警告和 FIXME 错误。对于 pip < 10.0.1pip freeze

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)

对于点 >= 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)

评论

30赞 Alex Gray 12/31/2011
这效果非常好......当一项任务需要很长时间时,它总是如此令人满意......并给你一堆新东西!PS:如果您使用的是OS X,请以root身份运行它!
60赞 endolith 3/7/2012
有没有办法在不调用子进程的情况下使用 pip 进行安装?像 ?import pippip.install('packagename')
7赞 Josh K 4/30/2013
我把它包在 fabfile.py 里。谢谢!
7赞 jeffcook2150 8/26/2013
@BenMezger:你真的不应该在你的 virtualenv 中使用系统包。你真的不应该以 root 身份运行超过少数几个受信任的、知名的程序。使用 --no-site-packages(最新版本中的默认值)运行 virtualenvs。
3赞 Josh 6/3/2014
为这个竖起大拇指,如果找不到包裹,选择的答案(上面)就会失败。这个脚本只是继续到下一个包,太棒了。
76赞 janrito 6/10/2011 #3

您可以只打印过时的包:

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

评论

14赞 Jeremy Blanchard 3/29/2012
在 virtualenv 中,我是这样做的:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
0赞 Jacktose 10/29/2016
如今,您也可以使用(尽管它不是需求格式)。python -m pip list outdated
4赞 Hugues 3/12/2021
@Jacktose我想你的意思是.python -m pip list --outdated
27赞 brunobord 9/13/2011 #4

使用 virtualenv 时,如果您只想升级添加到 virtualenv 中的软件包,您可能需要执行以下操作:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
159赞 Piotr Dobrogost 2/26/2012 #5

在查阅了 Rob van der Woude 的 FOR 优秀文档后,Windows 版本:

for /F "delims===" %i in ('pip freeze') do pip install --upgrade %i

评论

33赞 Refael Ackermann 4/20/2016
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i 更快,因为它只会尝试更新“过时”的软件包
3赞 Piotr Dobrogost 1/17/2017
@RefaelAckermann我怀疑这会比原来的:)慢要知道哪些软件包已经过时,pip 必须首先检查每个软件包的最新版本。它在更新时执行与第一步完全相同的操作,如果没有更新的版本可用,则不会继续。但是,在您的版本中,pip 将检查版本两次,第一次用于建立过时软件包列表,第二次用于更新此列表中的软件包。
3赞 Piotr Dobrogost 1/18/2017
@RefaelAckermann 旋转 pip 比通过网络检查包的版本快一个数量级,因此这是应该优化的检查次数,而不是加速次数。我的做 n 个检查,你的做 n+m 个检查。
2赞 MacItaly 6/21/2019
+1 - 现在是 2019 年 6 月 20 日,我在 Windows 3.7.3 上使用 Python 10,这是我更新所有本地包的最佳方式。
8赞 Andy 7/13/2019
需要跳过输出的前两行:。如果这是从批处理文件运行的,请确保使用 而不是 .另请注意,在运行此命令之前,使用 .for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i%%i%ipippython -m pip install --upgrade pip
29赞 tkr 4/4/2012 #6

蛋黄

pip install -U `yolk -U | awk '{print $1}' | uniq`

但是,您需要先获得蛋黄:

sudo pip install -U yolk

评论

3赞 7/29/2019
上次提交 7 年前
10赞 chbrown 10/28/2012 #7

在座的那些人中,拉马纳的回答对我来说效果最好,但我不得不补充一些问题:

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 目录中。try-except 只是跳过已从 PyPI 中删除的包。site-packages

致 endolith:我也希望有一个简单的,但看起来 pip 除了命令行之外并不打算被任何东西使用(文档没有提到内部 API,pip 开发人员也没有使用文档字符串)。pip.install(dist.key, upgrade=True)

评论

0赞 drevicko 1/13/2013
在 Ubuntu(和其他 Debian 衍生产品)上,显然将软件包放入或类似。在这种情况下,您可以在语句中使用 '/usr/local/lib/' 而不是 'site-packages'。pip/usr/local/lib/python2.7/dist-packagesif
864赞 jfs 4/29/2013 #8

要升级所有本地软件包,您可以安装 pip-review

$ pip install pip-review

之后,您可以以交互方式升级软件包:

$ pip-review --local --interactive

或自动:

$ pip-review --local --auto

pip-review是 的分支。请参阅 @knedlsepp 提到的 pip-tools 问题。 软件包有效,但软件包不再有效。pip-review 正在寻找新的维护者。pip-toolspip-reviewpip-tools

pip-review自 0.5 版起适用于 Windows。

评论

3赞 jfs 4/25/2014
@hauzer:它不支持 Python 3。虽然这可能是一个错误
8赞 Wernight 7/22/2014
@mkoistinen 这是一个很好的工具,但在它合并到 PIP 中之前,这意味着要安装一些额外的东西,而这并不是每个人都希望这样做。
2赞 jfs 10/12/2015
@Daniel:pip-tools 不再有效,pip-review(pip-tools 的分支)有效。
8赞 FredrikHedman 2/13/2016
pip-review 工作正常(至少对于 Python 版本 3.5.0)
35赞 Dlamini 5/21/2018
要在不使用交互模式的情况下全部更新:pip-review --local --auto
30赞 Samuel Katz 5/22/2013 #9

拉马纳回答的单行版本。

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'

评论

5赞 Maximiliano Rios 5/28/2014
subprocess.call(“sudo pip install...如果您需要权限
5赞 Bengt 2/20/2016
@MaximilianoRios请不要,而是使用虚拟环境sudo pip install
14赞 3WA羽山秋人 7/17/2013 #10

您可以尝试以下操作:

for i in `pip list | awk -F ' ' '{print $1}'`; do pip install --upgrade $i; done

评论

0赞 Mark Shust at M.academy 10/28/2013
这是以最简洁的方式更新 pip 包的最干净、可读性最高的方法。伟大。
9赞 Samuel Marks 1/26/2014 #11

通过拉取请求发送给 pip 人员;同时使用我写的这个 pip 库解决方案:

from pip import get_installed_distributions
from pip.commands import install

install_cmd = install.InstallCommand()

options, args = install_cmd.parse_args([package.project_name
                                        for package in
                                        get_installed_distributions()])

options.upgrade = True
install_cmd.run(options, args)  # Chuck this in a try/except and print as wanted

评论

0赞 Samuel Marks 4/27/2015
具有错误处理功能的版本(根据注释):gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
0赞 areop-enap 9/5/2023
在 pip3 上没有这样的函数get_installed_distributions
82赞 raratiru 3/8/2014 #12

以下单行代码可能会有所帮助:

(点 >= 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('\n'.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

评论

0赞 Chip Camden 8/14/2015
必须为以“Could”和“Some”开头的行添加过滤器,因为显然 pip 会向 stdout 发送警告:(
0赞 raratiru 11/3/2015
好的,这是公平的:您可以根据需要添加任意数量。谢谢!| sed 's/^<First characters of the error>.*//'
17赞 Jens 12/10/2015
艺术pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
10赞 Alex V 10/9/2014 #13

这应该更有效:

pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | 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 "\n|\r" " "将多行结果转换为单行空格分隔的列表;cut
  5. awk '{if(NR>=3)print}'跳过标题行
  6. cut -d' ' -f1获取第一列
  7. xargs -n1 pip install -U从其左侧的管道中获取 1 个参数,并将其传递给命令以升级软件包列表。

评论

0赞 DrStrangepork 11/15/2014
这是我的输出:注意所有“可能”。这些源于“找不到满足要求的任何下载<包>”的输出kerberos iwlib PyYAML Could pygpgme Could Could Could ...pip list -o
0赞 DrStrangepork 11/18/2014
注释的格式不太好,但这里有一个片段(行尾标有“;”):# pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
0赞 antibus 2/20/2015
与其过滤掉所有不应该使用的行,我建议过滤存在更新的行:。否则,你很容易错过一行你不想要的,并得到DrStrangeprk提到的结果。pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ")
1赞 Six 4/21/2016
我强烈建议改用。 该标志确保在没有过时的包时不会运行。该标志提示用户在执行任何命令之前进行确认。您可以添加该标志,以便在单独安装每个包之前提示您。xargspip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -U-rpip install -U-p-n1
102赞 Marc 11/22/2014 #14

在我看来,这个选项更直接、更易读:

pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`

解释是以以下格式输出所有过时包的列表: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 命令中,跳过前两条记录(行)并选择每行的第一个单词(正如 SergioAraujo 所建议的那样,我删除了,因为确实可以处理跳过记录)。NR>2{print $1}tail -n +3awk

评论

5赞 11/11/2018
如果一次升级失败,则不会发生任何升级。
0赞 rubo77 10/3/2022
使用第一个答案中的版本,以防止失败时停止| xargs -n1
465赞 azazelspeaks 11/12/2015 #15

以下内容适用于 Windows,也应该对其他人有好处( 是您在命令提示符下所在的任何目录。例如,C:/Users/Username)。$

$ pip freeze > requirements.txt

打开文本文件,将 替换为 ,或者让 sed 为您执行操作:==>=

$ sed -i 's/==/>=/g' requirements.txt

并执行:

$ pip install -r requirements.txt --upgrade

如果您遇到某个软件包停止升级的问题(有时是 NumPy),只需转到目录 ($),注释掉名称(在它之前添加一个),然后再次运行升级。您可以稍后取消注释该部分。这也非常适合复制 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”来升级所有软件包;如果一次升级失败,请再次运行它,并在下一次升级时继续。

评论

33赞 youngminz 5/15/2016
您应该删除 的 .例如:to 表示所有行。requirements.txt=={version}python-dateutil==2.4.2python-dateutil
7赞 jkooker 3/8/2017
我发现这实际上并没有升级macOS上的软件包。
14赞 Amaury Liet 3/16/2017
@youngminz 在运行“pip install...”之前,我会在编辑器/ide 中快速命令“替换所有”==“>”>=”解决此问题
9赞 Cavaz 1/15/2018
对于 Linux:删除版本$ pip freeze | cut -d '=' -f1> requirements.txt
2赞 Sergiy Kolodyazhnyy 9/4/2018
如果您使用的 shell 是 bash,您可以通过 Effective 将其缩短为一个命令,这是一个匿名管道,但它将充当文件对象pip3 install -r <(pip3 freeze) --upgrade<(pip3 freeze)
13赞 user1175849 6/1/2016 #16

相当神奇的蛋黄使这变得容易。

pip install yolk3k # Don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

有关蛋黄的更多信息:https://pypi.python.org/pypi/yolk/0.4.3

它可以做很多你可能会觉得有用的事情。

46赞 Shihao Xu 6/10/2016 #17

这似乎更简洁。

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

然后将它们传递给以运行命令 ,每行都作为附加参数。xargspip install -U

-n1将传递给每个命令的参数数限制为 1。pip install -U

评论

0赞 Reman 11/26/2016
我收到了此警告DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
2赞 AlessioX 12/18/2016
@Reman:那是因为你使用的是 Pip v9.0.1。这只是一条弃用消息,这意味着某些功能将无法在未来的 Pip 版本中继续存在。没什么好担心的;)
0赞 AlessioX 12/18/2016
但是,这必须标记为最终解决方案。事实上,公认的答案将遍及您的 pip 包,如果您只需要更新 1 或 2 个包,这是浪费时间。相反,此解决方案将仅在所有过时的软件包上运行
26赞 Apeirogon Prime 9/16/2016 #18

Windows PowerShell 解决方案

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}

评论

0赞 Foad S. Farimani 5/22/2019
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?
6赞 brainplot 1/3/2020
也许会更合适。pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
0赞 Timo 9/18/2021
为什么优先于 Powershell 中的建议答案,@brainplotpip list --outdated --format freeze..
0赞 brainplot 9/19/2021
@Timo 当我写那条评论时,建议的答案只用了 .我认为在未来更新中可能发生的变化比让决定格式更强大。 也有效!pip listpip freeze--format freezepip listpip freeze
0赞 Deekshith Anand 2/7/2022
最好将它作为您个人资料中的功能!这对于使用 powershell 的任何人都是完美的
71赞 Douglas Daseeco 2/20/2017 #19

更强大的解决方案

对于 pip3,请使用以下命令:

pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh

对于 pip,只需删除 3 即可:

pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh

OS X 奇异

截至 2017 年 7 月,OS X 附带了一个非常旧版本的 sed(已有十几年的历史)。要获取扩展的正则表达式,请在上面的解决方案中使用 INSTEAD。-E-r

使用流行的解决方案解决问题

该解决方案经过精心设计和测试1,而即使是最流行的解决方案也存在问题。

  • 由于更改 pip 命令行功能导致的可移植性问题
  • 由于常见的 pip 或 pip3 子进程失败而导致 xargs 崩溃
  • 来自原始 xargs 输出的拥挤日志记录
  • 依赖 Python 到 OS 的桥接,同时可能对其进行升级3

上面的命令使用最简单、最可移植的 pip 语法与 sedsh 相结合,以完全克服这些问题。可以使用注释版本2 仔细检查 sed 操作的细节。


[1] 在 Linux 4.8.16-200.fc24.x86_64 集群中测试并定期使用,并在其他五种 Linux/Unix 版本上进行了测试。它还可以在 Windows 64 上安装的 Cygwin10 上运行。需要在 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/^([^=# \t\\][^ \t=]*)=.*"

# Separate the output of package upgrades with a blank line
sed="$sed/echo"

# Indicate what package is being processed
sed="$sed; echo Processing \1 ..."

# Perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"

# 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 组件)可能会导致死锁或包数据库损坏。

评论

3赞 Walter Tross 1/9/2019
克服OS X侏罗纪BSD的另一种方法是使用(GNU sed)。为了得到它,sedgsedbrew install gnu-sed
0赞 Douglas Daseeco 1/9/2019
@WalterTross......侏罗纪。。。形容词用法好。因此,我们现在有两种方法可以在终端上使用良好的审计跟踪对更新 pip 包进行分组。(1) 使用答案中的 -E 选项,以及 (2) 安装 gsed 以离开侏罗纪时期。
52赞 Simion Agavriloaei 4/27/2017 #20

我在升级时遇到了同样的问题。问题是,我从不升级所有软件包。我只升级我需要的东西,因为项目可能会中断。

因为没有简单的方法来逐个包升级和更新需求 .txt 文件,所以我编写了这个 pip-upgrader,它还更新了所选软件包(或所有软件包)requirements.txt 文件中的版本

安装

pip install pip-upgrader

用法

激活 virtualenv(很重要,因为它还会在当前 virtualenv 中安装新版本的升级包)。

cd进入项目目录,然后运行:

pip-upgrade

高级用法

如果需求放置在非标准位置,请将它们作为参数发送:

pip-upgrade path/to/requirements.txt

如果您已经知道要升级的软件包,只需将它们作为参数发送即可:

pip-upgrade -p django -p celery -p dateutil

如果需要升级到预发布/发布后版本,请在命令中添加参数。--prerelease

完全披露:我写了这个包。

评论

14赞 Nostalg.io 6/8/2017
这是 pip 默认应该执行的操作。
0赞 Luke 7/12/2017
注意您的工具,某些字符转义似乎在我的 Windows 机器上无法正常工作,但除此之外还好
0赞 Simion Agavriloaei 7/12/2017
还没有在 Windows 上真正测试过它,但我会安装一个虚拟机。谢谢
0赞 Morse 4/2/2018
如果未启用virtualenvpip-upgrade --skip-virtualenv-check
2赞 cwhisperer 10/3/2019
这也适用于具有通用、dev 和 prod 需求的需求文件夹。简直太棒了!
26赞 RedEyed 8/28/2017 #21

我在 pip 问题讨论中发现的最简单、最快的解决方案是:

pip install pipdate
pipdate

来源:https://github.com/pypa/pip/issues/3819

评论

3赞 Serge Stroobandt 5/11/2018
虽然其他解决方案在遇到最轻微的异常时会停滞不前,但此解决方案会发出警告,然后跳过该问题以继续处理其他软件包。伟大!
0赞 VladoPortos 8/11/2020
投票这个,在Windows中完美运行
2赞 Joseph Konan 8/29/2020
我使用了 pipdate,现在找不到 pip 或 python。使用风险自负。
11赞 user8598996 9/13/2017 #22

用:

pip install -r <(pip freeze) --upgrade
21赞 JohnDHH 11/9/2017 #23

使用 AWK 更新包:

pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

Windows PowerShell 更新

foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}

评论

0赞 mirageglobe 4/3/2019
而对于 python 3...pip3 install -U $(pip3 freeze | awk -F'[=]' '{print $1}')
28赞 adrin 4/13/2018 #24

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

评论

2赞 shao.lo 10/24/2018
第 1 步:pip 安装 pip-upgrade-outdated 第 2 步:pip-upgrade-outdated ...做
0赞 Mario Chapa 9/17/2020
这确实是一个非常好的套餐。需要更多的宣传,我已经在python中工作了很长时间,这是我第一次听说它。好!
3赞 Andrew Jaffe 8/19/2021
@MarioChapa 谢谢 -- 我写了它(基于要点)。
0赞 BSalita 10/4/2021
在 Windows 中, %USERPROFILE%\anaconda3\envs\bridge\scripts\pip_upgrade_outdated.exe
11赞 Ankireddy 4/23/2018 #25

Windows 上最短、最简单的。

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt

评论

0赞 Chockomonkey 7/17/2018
@Enkouyami Windows 7 上,如果没有 -r,此命令将不起作用。-r 必须排除要求文件的路径。
1赞 Peter Mortensen 10/7/2020
在什么情况下?CMD?PowerShell天鹅?蟒蛇?别的?
16赞 Sébastien Wieckowski 6/25/2018 #26

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}

如果列表中没有破损的包装或特殊轮子,它可以顺利运行......

评论

0赞 Mavaddat Javid 11/6/2021
出于纯粹的审美原因,我最喜欢这种方法。生成输出的可执行文件为我们的 shell 提供了对象架构,并且不需要在脚本中使用未标记的索引值。[0]
0赞 Sébastien Wieckowski 10/14/2022
# 设置 pip 升级所有过时包的别名 function PipUpgrade-Outdated { pip list -o --format json |ConvertFrom-Json (英语) |ForEach-Object {pip install $_.name -U} }
14赞 German Lashevich 11/29/2018 #27

如果您已经安装了纯 Bash/Z shell 单行代码来实现这一点:pip<22.3

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

评论

1赞 ᐅdevrimbaris 6/10/2020
<p%%=*> 代表什么?
2赞 German Lashevich 6/10/2020
@ᐅdevrimbaris这将删除版本规范并仅保留软件包名称。您可以通过运行 来查看它。以更一般的方式,意味着 .for p in $(pip list -o --format freeze); do echo "${p} -> ${p%%=*}"; done${haystack%%needle}delete longest match of needle from back of haystack
288赞 Achilles Gasper Rasquinha 1/16/2019 #28

使用 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+ 兼容。

Enter image description here

注意:我是该工具的作者。

评论

13赞 stefanbschneider 3/22/2019
好主意,但当我尝试它时,它永远卡住了。Checking...
0赞 Achilles Gasper Rasquinha 5/11/2019
@CGFoX我相信这已在 1.5.0 中修复
0赞 Achilles Gasper Rasquinha 6/6/2019
@Chris @CGFoX 尝试删除 pip 缓存和(在 macOS 上)~/.cache/pip~/Library/Caches/pip
2赞 Qin Heyang 11/13/2019
在 Windows 10 和 Python 3.7.5 上出现错误:ModuleNotFoundError: No module named 'ctypes.windll'
2赞 user202729 1/12/2021
这似乎会将所有软件包升级到最新版本,这可能会破坏一些依赖项。
26赞 Isaque Elcio 2/11/2021 #29

在 Windows 或 Linux 上更新 Python 包

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

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

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

    pip install -r requirements.txt --upgrade
    

来源: 如何更新所有 Python 包

评论

0赞 aggsol 3/9/2021
这很有效。事后再看一下,看看尖锐的差异。pip freeze > requirements.txt
3赞 10/12/2021
pip freeze | sed 's/==/>=/' > requirements.txt自动交换。==>=
0赞 Timothy C. Quinn 5/7/2023
最好使用另一个名称而不是 requirements.txt,这样您就不会意外地从包中破坏本地要求 .txt。
11赞 Linus SEO 3/1/2022 #30

没有必要那么麻烦或安装一些软件包。

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] }

几点:

  • 将 python 版本替换为 或 。pippip3pip2
  • pip list --outdated检查过时的 pip 包。
  • --format在我的 pip 版本 22.0.3 上只有 3 种类型:列(默认)、freeze 或 json。 在命令管道中是更好的选择。freeze
  • 尽可能多地保持命令简单和可用

评论

1赞 Ela782 4/7/2022
感谢您的 PowerShell 代码片段,这对我来说是最有用的答案!
0赞 areop-enap 9/5/2023
在 pip3 上,它失败并显示:ERROR: List format 'freeze' cannot be used with the --outdated option.