用pip升级所有的软件包

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

请注意,在官方问题跟踪器上有一个function请求 。

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

 pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U 

注意:这里有无限的潜在变化。 我试图保持这个答案简短,但请build议在评论中的变化!

相关修改:

  • 像@jawache(是的,你可以用sedawkperl或者…replacegrep + cut来添加一个grep来跳过“-e”包的定义。
  • 较新的pip版本允许您列出过期的软件包:

     pip list --outdated --format=freeze 
  • xargs添加-n1 ,防止在更新一个包失败时停止所有操作(谢谢@andsens )

你可以使用下面的Python代码。 与pip freeze不同,这不会打印警告和FIXME错误。

 import pip from subprocess import call for dist in pip.get_installed_distributions(): call("pip install --upgrade " + dist.project_name, shell=True) 

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

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

pip-review是一个pip-tools的分支。 请参阅@knedlsepp提到的pip-tools问题 。 pip-review包工程,但pip-tools包不再起作用。

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

在Windows上运行。 应该对他人好。 ($是你所在的目录,在命令提示符下,例如C:/ Users / Username>)

 $ pip freeze > requirements.txt 

然后做

 $ pip install -r requirements.txt --upgrade 

如果你的某个软件包有问题(有时是numpy),只要进入目录($),注释掉这个名字(在它之前加一个#)然后再次运行升级。 您稍后可以取消注释该部分。

Windows版本,通过Rob van der Woude咨询FOR的优秀文档

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

您可以打印过期的软件包

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

以下单线可能会certificate有帮助:

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

如果发生错误, xargs -n1会继续运行。

如果你需要更多的细粒度的控制来省略什么,并且引发一个错误,你不应该添加-n1标志并且明确定义要忽略的错误,通过对每个单独的错误“pipe道”下面的行:

| 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 

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

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

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

而这个版本允许从pip list --outdated抑制警告信息pip list --outdated

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

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

这也可以用来解决即将到来的默认columns格式:

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

这似乎更简洁。

 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 ' '将“space”设置为分隔符, -f1表示获得第一列。

所以上面的线变成:

 urllib3 wheel 

然后将它们传递给xargs来运行命令, pip install -U ,每一行都作为附加参数

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

https://github.com/cakebread/yolk

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

但是你需要先获得蛋黄

 $ sudo pip install -U yolk 

@拉马纳答案的单线版本。

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

`

我有升级相同的问题。 事情是,我从来没有升级所有的软件包。 我只升级我所需要的,因为项目可能会中断。

由于没有简单的方法来升级软件包,并更新requirements.txt文件,我写了这个pip升级程序 ,它也会更新所选软件包(或所有软件包)的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参数添加到您的命令中。

充分披露:我写了这个包。

当使用virtualenv时,如果你只是想升级添加到你的virtualenv的包,你可能想要做:

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

你可以试试这个:

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

更强大的解决scheme

对于pip3使用这个:

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

对于点子,只需删除3s就可以了:

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

OSX奇怪

OSX,截至2017年7月,发行了一个非常老的sed版本(十几岁)。 要获得扩展的正则expression式,请在上面的解决scheme中使用-E而不是-r。

用常见解决scheme解决问题

这个解决scheme经过精心devise和testing1 ,而即使是最stream行的解决scheme也存在问题。

  • 由于改变pip命令行function导致的可移植性问题
  • xargs因为普通的pip或pip3subprocess失败而崩溃
  • 来自原始xargs输出的拥挤logging
  • 依靠Python到OS的桥梁,同时可能升级它3

上面的命令使用最简单和最便携的pip语法结合sed和sh来完全克服这些问题。 sed操作的细节可以使用注释版本2进行审查。


细节

[1]在Linux 4.8.16-200.fc24.x86_64集群中经过testing并定期使用,并在其他五种Linux / Unix版本上进行了testing。 它也运行在Windows 10上安装的Cygwin64上。需要在iOS上进行testing。

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

相当惊人的蛋黄使这容易。

 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

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

@拉马纳对我来说是最好的,但是我不得不补充一些:

 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以及点子开发者没有使用docstrings)。

通过对小点民众的拉动请求发送; 在此期间使用这个点子库解决scheme,我写道:

 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 

这似乎对我有用…

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

之后,我使用了printf和空格来正确分隔包名。

Windows Powershell解决scheme

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

我的脚本:

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

这里是我对rbp的答案的变化,它绕过“可编辑”和发展分布。 它分享了原始的两个缺陷:它不必要的重新下载和重新安装; 而且一个包上的错误会阻止每个包的升级。

 pip freeze |sed -ne 's/==.*//p' |xargs pip install -U -- 

相关的错误报告,从bitbucket迁移后有点脱节:

我已经尝试了Ramana的代码,并且在Ubuntu上发现,您必须为每个命令编写sudo 。 这是我的脚本在ubuntu 13.10上正常工作:

 #!/usr/bin/env python import pip from subprocess import call for dist in pip.get_installed_distributions(): call("sudo pip install --upgrade " + dist.project_name, shell=True) 

这里是python脚本的另一种做法

 import pip, tempfile, contextlib with tempfile.TemporaryFile('w+') as temp: with contextlib.redirect_stdout(temp): pip.main(['list','-o']) temp.seek(0) for line in temp: pk = line.split()[0] print('--> updating',pk,'<--') pip.main(['install','-U',pk]) 

我最近一直在使用。 这很简单,重点。 它会更新您的requirements.txt文件以反映升级,然后您可以照常升级您的requirements.txt文件。

 $ pip install pur ... Successfully installed pur-4.0.1 $ pur Updated boto3: 1.4.2 -> 1.4.4 Updated Django: 1.10.4 -> 1.10.5 Updated django-bootstrap3: 7.1.0 -> 8.1.0 All requirements up-to-date. $ pip install --upgrade -r requirements.txt Successfully installed Django-1.10.5 ... 

这不是更有效吗?

 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从其左侧的pipe道获取1个参数,并将其传递给命令以升级软件包列表。

我在pip问题讨论中find的最简单,最快速的解决scheme是:

 sudo -H pip install pipdate sudo -H pipdate 

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

这是一个只更新过时包的脚本。

 import os, sys from subprocess import check_output, call file = check_output(["pip.exe", "list", "--outdated", "--format=legacy"]) line = str(file).split() for distro in line[::6]: call("pip install --upgrade " + distro, shell=True) 
 import pip pkgs = [p.key for p in pip.get_installed_distributions()] for pkg in pkgs: pip.main(['install', '--upgrade', pkg]) 

甚至:

 import pip commands = ['install', '--upgrade'] pkgs = commands.extend([p.key for p in pip.get_installed_distributions()]) pip.main(commands) 

因为它不是经常启动一个shell,所以工作的很快。 我很想find时间来实际使用过时的列表来加快速度。

这是我的变化:

 pip list --outdated --format=legacy | awk '{print $1;}' | xargs -n1 pip install -U