用pip升级所有的软件包
是否可以一次性用pip
升级所有的Python包?
请注意,在官方问题跟踪器上有一个function请求 。
还没有内置的标志,但你可以使用
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
注意:这里有无限的潜在变化。 我试图保持这个答案简短,但请build议在评论中的变化!
相关修改:
- 像@jawache(是的,你可以用
sed
或awk
或perl
或者…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
-
pip list -o
列出过时的软件包; -
grep -v -i warning
反向匹配warning
以避免更新时出现错误 -
cut -f1 -d1' '
返回第一个单词 – 过时包的名称; -
tr "\n|\r" " "
将cut
的多行结果转换为单行,空格分隔的列表; -
awk '{if(NR>=3)print}'
跳过标题行 -
cut -d' ' -f1
取第一列 -
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