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


2047

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

注意:官方问题追踪器上对此功能有要求


37
当心软件腐烂-升级依赖项可能会破坏您的应用程序。您可以使用pip freeze(如bundle installnpm shrinkwrap)列出所有已安装软件包的确切版本。最好在修补之前保存该副本。
Panic Panic

当心这样做,pip升级时会搞砸安装requests。错误消息是cannot import name IncompleteRead
Paul Rooney

11
我尝试了一堆的答案和较新的(因此低分答案)产生一个更好的输出:stackoverflow.com/questions/2720014/...
FauChristian

最新功能请求和讨论:github.com/pypa/pip/issues/4551
cledoux

这个问题既古老又有用,我只是想提醒从现在开始来到这里的任何人,现在有一种新的官方最佳方式来完成所有这些工作:pipenv。文件在这里:docs.pipenv.org/basics和作者的Pycon 2018讨论在这里:youtube.com/watch ? v=GBQAKldqgZs 。编码愉快!
马利克·鲁米

Answers:


2257

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

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+ 替换cutsedor awkperlor or ...)。

-n1标志用于xargs防止在更新一个软件包失败时停止所有操作(感谢@andsens)。


58
是的:(问题现在存在于github.com/pypa/pip/issues/59。但是每个建议似乎都回答为“是的,但是我很确定X是否是正确的Y方式” ...现在比没有好吗?实用胜过纯洁吗?:(
rbp

20
它还会打印那些使用常规软件包管理器(如apt-get或Synaptic)安装的软件包。如果执行此命令pip install -U,它将更新所有软件包。恐怕会与apt-get产生一些冲突。
贾巴

8
如何将grep更改为:egrep -v'^(\-e |#)'(我在ubuntu 12.10上运行时得到了这一行:“ ## FIXME:在此程序包的dependency_links中找不到svn URL:”
LasseValentini

32
tee在进行实际升级之前,我会先提交一个,以便获得原始版本的列表。例如,以 pip freeze --local | tee before_upgrade.txt | ...这种方式,如果有任何问题,还原将更容易。
埃米尔·H

10
为了避免出现令人讨厌的错误消息,我添加-H了以下内容sudo$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Mario S

683

您可以使用以下Python代码。与不同pip freeze,这不会打印警告和FIXME错误。 对于点<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)

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

21
这工作得非常好......它总是那么满足当任务需要很长的时间 ......和为您提供了一堆新的东西!PS:如果您使用的是OS X,请以root用户身份运行它!
亚历克斯·格雷

52
没有调用子进程就无法使用pip进行安装吗?像import pip pip.install('packagename')什么?
endlith 2012年

6
我将其包装在fabfile.py中。谢谢!
2013年

5
@BenMezger:您实际上不应该在virtualenv中使用系统软件包。您实际上也不应以root用户身份运行少数几个受信任的知名程序。使用--no-site-packages(最新版本中的默认值)运行您的virtualenvs。
jeffcook2150

3
对此表示赞许,如果再也找不到软件包,则选择的答案(上述)将失败。这个脚本只是继续到下一个软件包,很棒。
2014年

642

升级所有本地软件包;您可以使用pip-review

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

pip-review是的叉子pip-tools。见pip-tools问题被提到@knedlsepppip-review包有效,但pip-tools包不再有效。

pip-review从0.5版开始在Windows上运行。


2
@hauzer:它不支持Python3。虽然这可能是一个错误
jfs

7
@mkoistinen这是一个很好的工具,但是直到它被合并到PIP中,这意味着安装了并非每个人都希望做的其他事情。
2014年

2
@Daniel:pip-tools不再起作用,pip-review(pip-tools的分支)起作用。
jfs 2015年

7
pip-review工作正常(至少适用于Python 3.5.0版)
FredrikHedman

15
要更新所有不具有交互模式的内容:pip-review --local --auto
Dlamini

333

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

$ pip freeze > 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”来升级所有软件包。如果一次升级失败,请再次运行它,然后继续进行下一次升级。


29
您应该删除requirements.txt=={version}。例如:python-dateutil==2.4.2python-dateutil所有行。
youngminz

4
我发现这实际上并没有在macOS上升级软件包。
jkooker

10
@youngminz我建议在运行'pip install ...'之前在编辑器/ ide中快速执行'替换所有“ ==”>“> =”'来解决此问题
Amaury Liet

7
对于Linux:$ pip freeze | cut -d '=' -f1> requirements.txt为了删除版本
Cavaz

1
如果您使用的外壳是bash,则可以通过pip3 install -r <(pip3 freeze) --upgrade 有效地将其缩短为一个命令,它<(pip3 freeze)是一个匿名管道,但是它将充当文件对象
Sergiy Kolodyazhnyy

128

咨询优良的售后服务Windows版本文档FOR罗布范德Woude

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

19
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i 更快,因为它只会尝试更新“过时”的软件包
Refael Ackermann

3
@RefaelAckermann我怀疑这会比原来的慢:)要知道哪些软件包已经过时,请先检查每个软件包的最新版本。它与更新时的第一步完全相同,并且如果没有可用的较新版本,则不会继续进行。但是,在您的版本中,pip将检查两次版本,第一次是建立过时的软件包列表,第二次是在更新列表中的软件包时。
Piotr Dobrogost

2
@RefaelAckermann旋转点的数量级比通过网络检查软件包的版本快几个数量级,因此应优化的检查次数而不是旋转次数。我的会进行n次检查,而您的会进行n + m次检查。
Piotr Dobrogost

2
+1-今天是6.20.2019,我在Windows 10上使用的是Python 3.7.3,这是我更新所有本地包的最佳方法。
MacItaly

1
需要跳过输出的前两行:for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i。如果这是从批处理文件运行的,请确保使用%%i而不是%i。还要注意,pip使用运行该命令之前进行更新更干净python -m pip install --upgrade pip
安迪

125

使用pipupgrade

$ pip install pipupgrade
$ pipupgrade --verbose --latest --yes

pipupgrade可帮助您从requirements.txt文件升级系统,本地或软件包!它还有选择地升级不会破坏更改的软件包。pipupgrade还确保升级存在于多个Python环境中的软件包。与Python2.7 +,Python3.4 +和pip9 +,pip10 +,pip18 +,pip19 +兼容。

在此处输入图片说明

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


1
此方法的输出比@rbp的答案要干净得多
Gaia

7
不错的主意,但是Checking...当我尝试它时,它会永远停滞不前。
CGFoX

1
刚安装它并且还停留在检查[0;93mChecking...[0m
克里斯

1
@nathandrake关心在问题页面上打开问题吗?
阿基里斯·加斯珀·拉斯奎尼亚

2
在Windows 10和Python 3.7.5上出现错误:ModuleNotFoundError: No module named 'ctypes.windll'
Qin Heyang

74

您可以只打印过时的软件包

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

14
在virtualenv内部,我这样做是这样的:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Jeremy Blanchard

如今,您也可以使用python -m pip list outdated(尽管它不是需求格式)。
Jacktose

74

在我看来,此选项更直接易读:

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命令中,NR>2跳过前两个记录(行)并{print $1}选择每行的第一个单词(如SergioAraujo所建议,我删除了它,tail -n +3因为awk它确实可以处理跳过的记录)。


如果一次升级失败,则不会发生任何升级。
鲍里斯(Boris)

2
您可以避免awk 'NR>2 {print $1}'为您
清理

@SergioAraujo,这使解决方案看起来也更干净,谢谢提示!
Marc

67

以下一线可能会有所帮助:

(点> 20.0)

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

必须为以'Could'和'Some'开头的行添加过滤器,因为显然pip向stdout发送了警告:(
Chip Camden

好的,这很公平:您可以| sed 's/^<First characters of the error>.*//'根据需要添加任意数量。谢谢!
raratiru 2015年

14
或:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
Jens 2015年

51

更强大的解决方案

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

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

对于点子,只需将3删除即可:

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

OSX奇数

截至2017年7月,OSX随附了非常老版本的sed(已有十二年历史)。要获取扩展的正则表达式,请在上述解决方案中使用-E而不是-r。

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

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

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

上面的命令结合使用sed和sh来使用最简单,最可移植的pip语法来完全解决这些问题。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/^([^=# \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组件可能是导致死锁或软件包数据库损坏的潜在原因。


1
克服sedOS X 的侏罗纪BSD 的另一种方法是改用gsed(GNU sed)。要获得它,brew install gnu-sed
Walter Tross

@WalterTross ...侏罗纪...很好的形容词用法。因此,我们现在有两种方法可以对更新pip软件包进行分组,并在终端上提供良好的审核记录。(1)按照答案使用-E选项,(2)安装gsed离开侏罗纪时期。
道格拉斯·达西斯科

40

这似乎更简洁。

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


我收到此警告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

2
@Reman:那是因为您正在使用Pip v9.0.1。这只是不赞成使用的消息,意味着某些功能在以后的Pip版本中将无法继续使用。没什么可担心的;)
AlessioX 2016年

但是,这必须标记为最终解决方案。确实,可接受的答案将遍历您的所有pip软件包,如果您只需要更新1或2个软件包,那是浪费时间。相反,此解决方案将在所有过时的软件包中运行
AlessioX 2016年

34

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

因为没有简便的方法来逐个软件包升级软件包和更新requirements.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请在命令中添加参数。

全面披露:我写了这个包裹。


8
这是默认情况下pip应该执行的操作。
Nostalg.io

用您的工具抬起头,某些字符转义在我的Windows机器上似乎无法正常工作,但
Luke

尚未在Windows上进行真正的测试,但我将安装虚拟机。谢谢
Simion Agavriloaei

如果virtualenv未启用pip-upgrade --skip-virtualenv-check
莫尔斯

2
这也适用于具有通用,开发和生产需求的需求文件夹。简直太棒了!
窃窃私语



22

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

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade


18

Windows Powershell解决方案

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

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

2
也许pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}会更合适。
Brainplot

16

使用awk更新包: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

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


点冻结 awk -F'[=]''{print $ 1}''| xargs pip install -U
JohnDHH

对于python 3 ... pip3安装-U $(pip3冻结| awk -F'[=]''{print $ 1}')
Jimmy MG Lim

12

您可以尝试以下方法:

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

这是最简洁的更新点子软件包的最简洁,可读性最高的方法。大。
M.academy的Mark Shust,13年

12

相当惊人的蛋黄使这一过程变得容易。

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

它可以做很多您可能会发现有用的事情。


3
您的答案已从更改yolkyolk3k,您的原始答案肯定与python3有关。
AXO

10

@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开发人员没有使用文档字符串)。


在Ubuntu(和其他Debian衍生产品)上,pip显然可以放入/usr/local/lib/python2.7/dist-packages或类似的软件包。if在这种情况下,可以在语句中使用“ / usr / local / lib /”而不是“ site-packages” 。
drevicko 2013年

10

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

1
步骤1:pip安装pip-upgrade-outdated步骤2:pip-upgrade-outdated ...完成
shao.lo 18-10-23

9

通过拉动请求发送给小学生。同时使用此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

带有错误处理的版本(根据评论):gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
Samuel Marks

9

这似乎对我有用...

pip install -U $(pip list --outdated|awk '{printf $1" "}')

printf之后,我使用了一个空格来正确分隔软件包名称。


7

这是针对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

之后应确保没有依赖项被破坏。



7

在Windows上最短,最简单。

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

Windows 7上的@Enkouyami如果没有-r,此命令将不起作用。-r必须排除需求文件的路径。
Chockomonkey

6

我的剧本:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade

6

这不是更有效吗?

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个参数,并将其传递给命令以升级软件包列表。

这是我的输出:kerberos iwlib PyYAML Could pygpgme Could Could Could ...注意所有的“可能”。这些源自pip list -o“找不到符合要求<package>的下载内容”的输出
DrStrangepork

您可以粘贴的输出pip list -o吗?
Alex V

注释的格式不正确,但这是一个# 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;
摘要

建议不要过滤掉所有不应该使用的行,而建议过滤存在更新的行:pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") 。否则,您很容易错过不需要的一行,并获得DrStrangeprk提到的结果。
antibus

我强烈建议xargs改为使用。pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -U-r标志确保pip install -U在没有过期软件包的情况下不会运行。该-p标志提示用户在执行任何命令之前进行确认。您可以添加-n1标志,以使其在单独安装每个软件包之前提示您。

6

在Powershell 5.1中具有adm权限,python 3.6.5和pip ver 10.0.1的一行:

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

如果列表中没有破损的包装或特殊的轮子,它会正常工作...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.