题 使用pip升级所有包


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

请注意有 功能请求 为此在官方问题跟踪器上。


1425
2018-04-27 09:23


起源


哇..他们合并到github,现在讨论这个问题是一个 食堂,由github维护者发布的数十篇文章(可能是使用删除用户信息的脚本进行迁移)。 - levesque
谨防 软件腐烂升级依赖项可能会破坏您的应用程序。您可以列出所有已安装软件包的确切版本 pip freeze (喜欢 bundle install 要么 npm shrinkwrap)。最好在修修补补之前保存一份。 - Colonel Panic
当你这样做时,要小心你 pip 安装时,升级时 requests。错误消息是 cannot import name IncompleteRead。 - Paul Rooney
我尝试了一堆答案,一个较新的(因此得分低的答案)产生了更好的输出: stackoverflow.com/questions/2720014/... - FauChristian
最新功能请求和讨论: github.com/pypa/pip/issues/4551 - cledoux


答案:


还没有内置标志,但你可以使用

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 是按照@jawache的建议跳过可编辑(“ - e”)包定义。 (是的,你可以替换 grep+cut 同 sed 要么 awk 要么 perl 要么...)。

-n1 国旗 xargs 如果更新一个软件包失败,请阻止停止所有内容 @andsens)。


1671
2017-08-10 19:56



对:(这个问题现在存在于 github.com/pypa/pip/issues/59 。但是每一个建议似乎都回答“是的,但是我太确定X是否是正确的做Y的方式”......现在比从未好过吗?实用性胜过纯洁? :( - rbp
它还会打印那些使用普通包管理器安装的包(如apt-get或Synaptic)。如果我执行此操作 pip install -U,它将更新所有包。我担心这会导致与apt-get发生冲突。 - Jabba
如何将grep更改为:egrep -v'^(\ - e |#)'(我在ubuntu 12.10上运行时得到这一行:“## FIXME:在这个包的dependency_links中找不到svn URL:”。 - LasseValentini
我扔了一个 tee 在进行实际升级之前,您可以获得原始证书的列表。例如。 pip freeze --local | tee before_upgrade.txt | ... 这样,如果出现任何问题,更容易恢复。 - Emil H
我补充道 -H 至 sudo 避免恼人的错误消息: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U - Mario S


您可以使用以下Python代码。不像 pip freeze,这不会打印警告和FIXME错误。

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)

515
2018-04-30 03:31



这非常有效......当一项任务真正令人满意时,它总是令人满意 长时间......然后给你一个 束 新东西! PS:如果您使用的是OS X,请以root用户身份运行! - Alex Gray
没有调用子进程就没有办法使用pip进行安装吗?就像是 import pip  pip.install('packagename')? - endolith
作为Python脚本,此方法也适用于Windows。 - Adrian Spinei
我把它包裹起来了 fabfile.py。谢谢! - Josh K
这不再适用于PIP 10.0。我得到一个“模块pip没有属性get_installed_distributions”错误。 - Cody Dostal


升级所有本地包;你可以用 pip-review

$ pip install pip-review
$ pip-review --local --interactive

pip-review 是一个分支 pip-tools。看到 pip-tools 问题 提到的 @knedlsepppip-review 包工作但是 pip-tools 包不再有效。

pip-review 适用于Windows 从0.5版开始


504
2018-04-29 00:34



注意 - 这看起来很棒但在Windows上目前无用,因为它安装了没有扩展名的脚本。 - julianz
@julianz:是的。它是一个 已知问题。加 .py 扩展作为变通方法。虽然还有其他的单性,比如打电话 cat, sort 在代码中。 - jfs
@mkoistinen这是一个很好的工具,但在PIP合并之前,它意味着安装一些并非每个人都想做的事情。 - Wernight
@Daniel:pip-tools不再有用,pip-review(pip-tools的分支)有效。 - jfs
pip-review工作正常(至少对于Python版本3.5.0) - FredrikHedman


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

$ pip freeze > requirements.txt

打开文本文件,用= =替换==

然后做

$ pip install -r requirements.txt --upgrade

如果某个程序包出现问题而导致升级失败(有时会出现问题),只需转到目录($),注释掉名称(在它之前添加#)并再次运行升级。您可以稍后取消注释该部分。这对于复制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”来升级所有包;如果一次升级失败,请再次运行并继续下一次升级。


183
2017-11-12 09:20



你应该删除 requirements.txt的 =={version}。例如: python-dateutil==2.4.2 至 python-dateutil 适用于所有线路。 - youngminz
我发现这实际上没有升级macOS上的软件包。 - jkooker
@youngminz在运行'pip install ...'之前我会建议你在编辑器/ ide中快速'全部替换'==“>”> =“'来解决这个问题 - Amaury Liet
这正是我想要的。我有一个python virtualenv,我需要保持它是最新的。它升级了requirements.txt中的所有现有包。 - alex
对于linux: $ pip freeze | cut -d '=' -f1> requirements.txt 为了删除版本 - Batsu


咨询后优秀的Windows版本 文件 对于 FOR 作者:Rob van der Woude

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

88
2018-02-25 18:04



for /F "delims= " %i in ('pip list --outdated') do pip install -U %i        更快,因为它只会尝试更新“过时”的软件包 - Refael Ackermann
@RefaelAckermann我怀疑这会比原来要慢:)要知道哪些软件包已过时,请先查看每个软件包的最新版本。它与更新时的第一步完全相同,如果没有可用的新版本则不会继续。但是在您的版本中,pip将检查版本两次,第一次建立过期软件包列表,第二次更新此列表中的软件包。 - Piotr Dobrogost
@PiotrDobrogost,如果我们想要严格分析这一点;)让 n 是安装的包的数量,和 m <= n “过时”套餐的数量。你的意志会好转 pip 适用于所有包裹 1 + n 处决 pip 同 n*log(n) Web查找版本和所有依赖项,以及 m 下载和安装。我会做的 n 网页查找 --outdated 然后调用只会旋转 m  pip 打电话 m*log(n) web查找依赖关系+ m 下载并安装。如果 m << n 我赢了 :) - Refael Ackermann
@RefaelAckermann旋转点数比通过网络检查包的版本快几个数量级,因此应该优化的检查数量不是旋转数量。我做n次检查,你的n + m检查。 - Piotr Dobrogost


您只需打印过时的软件包即可

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

70
2018-06-10 12:50



在virtualenv中,我这样做: pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:' - Jeremy Blanchard
现在你也可以这样做 python -m pip list outdated (虽然它不是要求格式)。 - P1h3r1e3d13


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

pip list --format legacy --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

xargs -n1 如果发生错误,继续前进。

如果你需要更多的“细粒度”控制什么被省略和什么引发错误你不应该添加 -n1 标记并显式定义要忽略的错误,通过为每个单独的错误“管道”以下行:

| sed 's/^<First characters of the error>.*//'

这是一个工作示例:

pip list --format legacy --outdated | sed 's/(.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U

57
2018-03-07 20:25



不得不为以“可能”和“有些”开头的行添加过滤器,因为显然pip会向stdout发送警告:( - Chip Camden
好的,这是公平的:你可以添加多少 | sed 's/^<First characters of the error>.*//' 如所须。谢谢! - raratiru
要么: pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade - Jens


这个选项在我看来更直接和可读:

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

awk '{ print $1}' 选择行的第一个单词(用空格分隔))

此版本允许抑制来自的警告消息 pip list --outdated

pip install -U `pip list --outdated | awk '!/Could not|ignored/ { print $1}'`

awk '!/<pattern>/' 删除包含给定模式的行。在我的情况下,警告消息分别包括“不能”和“忽略”)

这也可用于解决即将到来的违约问题 columns 格式:

pip install -U `pip list --format=columns --outdated | awk '!/Package|---/{ print $1}'`

42
2017-11-21 23:15



大!我认为一定是 awk '{printf $1 " "}', 但是我错了。 awk {print $1} 也有效。 - Rockallite
将当前格式弃用到列中会影响这个吗?关于这个: 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. - Michal Frystacky


这似乎更简洁。

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


32
2018-06-10 03:47



我收到了这个警告 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. - Reman
@Reman:那是因为你使用的是Pip v9.0.1。这只是一个弃用消息,意味着某些功能在未来的Pip版本中无法生存。没什么值得关注的;) - AlessioX
但是,这必须标记为最终解决方案。事实上,接受的答案将遍及您的pip包,如果您只需更新1或2个包,这将浪费时间。相反,这个解决方案将在过时的软件包上运行 - AlessioX