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
# 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
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
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
30 回答
Windows上最短,最简单的 .
相当神奇的蛋黄使这很容易 .
有关蛋黄的更多信息:https://pypi.python.org/pypi/yolk/0.4.3
它可以做很多你可能会觉得有用的事情 .
PowerShell 5.1中有一行使用adm权限,python 3.6.5和pip ver 10.0.1:
如果列表中没有破损的包裹或特殊轮子,它可以顺利运行......
还没有内置标志,但你可以使用
注意:这有无限的潜在变化 . 我试图让这个答案简短而简单,但请在评论中建议变化!
在旧版本的
pip
中,您可以使用此代替:grep
将跳过可编辑("-e")包定义,如@jawache所示 . (是的,您可以将grep
cut
替换为sed
或awk
或perl
或......) .如果更新一个程序包失败,
xargs
的-n1
标志会阻止所有内容停止(感谢@andsens) .这是我对rbp答案的变化,它绕过了“可编辑”和开发发行版 . 它分享了原始的两个缺陷:它不必要地重新下载和重新安装;并且一个包上的错误将阻止在此之后升级每个包 .
相关的错误报告,从bitbucket迁移后有点脱节:
https://github.com/pypa/pip/issues/49
https://github.com/pypa/pip/issues/59
升级所有本地包;你可以使用pip-review:
pip-review
是pip-tools
的一个分支 . 见@knedlsepp提到的pip-tools issue .pip-review
包工作但pip-tools
包不再有效 .pip-review
适用于Windows since version 0.5 .适用于Windows . 对他人也应该有好处 . ($是你所在的目录,在命令提示符下 . 例如C:/ Users / Username>)
做
打开文本文件,用= =替换==
然后做
如果某个程序包出现问题而导致升级失败(有时会出现问题),只需转到目录($),注释掉名称(在它之前添加#)并再次运行升级 . 您可以稍后取消注释该部分 . 这对于复制python全局环境也很有用 .
我也喜欢pip-review方法:
您可以选择“a”来升级所有包;如果一次升级失败,请再次运行并继续下一次升级 .
您可以使用以下Python代码 . 与
pip freeze
不同,这不会打印警告和FIXME错误 . For pip < 10.0.1For pip >= 10.0.1
从https://github.com/cakebread/yolk:
但是你需要先得到蛋黄:
这似乎更简洁 .
说明:
pip list --outdated
得到这样的行在
cut -d ' ' -f1
中,-d ' '
将"space"设置为分隔符,-f1
表示获取第一列 .所以上面的行成为:
然后将它们传递给
xargs
以运行命令pip install -U
,每行作为附加参数-n1
将传递给每个命令pip install -U
的参数数量限制为1升级时遇到了同样的问题 . 事实是,我永远不会升级所有包裹 . 我只升级我需要的东西,因为项目可能会破坏 .
因为没有简单的方法来逐个包升级,并且更新了requirements.txt文件,所以我为所选的包(或所有包)写了pip-upgrader also updates the versions in your requirements.txt file .
Installation
Usage
激活你的virtualenv(很重要,因为它还将在当前的virtualenv中安装新版本的升级包) .
cd
进入项目目录,然后运行:Advanced usage
如果要求放在非标准位置,请将它们作为参数发送:
如果您已经知道要升级的包,只需将它们作为参数发送:
如果需要升级到预发布/发布后版本,请在命令中添加
--prerelease
参数 .完全披露:我写了这个包 .
以下单行可能会有所帮助:
pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U
如果发生错误,
xargs -n1
继续运行 .如果您需要更多"fine grained"控制省略的内容和引发错误的内容,则不应添加
-n1
标志并明确定义要忽略的错误,对于每个单独的错误,请通过"piping"以下行:| sed 's/^<First characters of the error>.*//'
这是一个工作示例:
More Robust Solution
对于pip3使用此:
对于pip,只需删除3s:
OSX Oddity
截至2017年7月,OSX发布了一个非常旧版本的sed(十几岁) . 要获得扩展的正则表达式,请在上面的解决方案中使用-E而不是-r .
Solving Issues with Popular Solutions
该解决方案经过精心设计和测试1,而即使是最流行的解决方案也存在问题 .
由于更改pip命令行功能而导致的可移植性问题
由于常见的pip或pip3子代而导致xargs崩溃过程失败
从原始xargs输出中拥挤记录
依赖Python-to-OS桥,同时可能升级它3
上面的命令使用最简单,最便携的pip语法结合sed和sh来完全克服这些问题 . 可以使用注释版本2仔细检查sed操作的详细信息 .
Details
[1]在Linux 4.8.16-200.fc24.x86_64集群中经过测试和定期使用,并在其他五种Linux / Unix版本上进行了测试 . 它还运行在Windows 10上安装的Cygwin64上 . 需要在iOS上进行测试 .
[2]为了更清楚地看到命令的解剖结构,这与带有注释的上述pip3命令完全相同:
[3]升级也用于升级Python或PIP组件的Python或PIP组件可能是导致死锁或程序包数据库损坏的潜在原因 .
使用awk更新包:
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
我已经尝试了Ramana的代码,我在Ubuntu上发现你必须为每个命令写
sudo
. 这是我的脚本在ubuntu 13.10上运行正常:Windows版本经过Rob van der Woude的
FOR
评论优秀documentation您只需打印过时的软件包即可
我的剧本:
通过a pull-request to the pip folk发送;在此期间使用我写的这个pip库解决方案:
@Ramana's answer对我来说是最好的,在这里,但我必须添加一些捕获:
site-packages
检查不包括我的开发包,因为它们不在系统site-packages目录中 . try-except只是跳过从PyPI中删除的包 .@endolith:我也希望有一个简单的
pip.install(dist.key, upgrade=True)
,但它没有提到内部API,而且pip开发人员没有使用docstrings) .当使用virtualenv并且如果你只想将包 added 升级到你的virtualenv时,你可能想要这样做:
你可以试试这个:
这个选项在我看来更直接和可读:
解释是
pip list --outdated
以这种格式输出所有过时包的列表:tail -n +3
跳过前两行,awk '{print $1}'
选择每行的第一个单词 .单线版@Ramana's answer .
`
甚至:
快速工作,因为它不会不断发布shell . 我很想找到时间来实际使用过时的列表来加快速度 .
这不是更有效吗?
pip list -o
列出过时的包裹;在
warning
上grep -v -i warning
反向匹配,以避免更新时出错cut -f1 -d1' '
返回第一个单词 - 过时包的名称;tr "\n|\r" " "
将多行结果从cut
转换为单行,空格分隔的列表;awk '{if(NR>=3)print}'
跳过 Headers 行cut -d' ' -f1
获取第一列xargs -n1 pip install -U
从其左侧的管道中获取1个参数,并将其传递给命令以升级软件包列表 .Windows Powershell解决方案
我在_184117中找到的最简单,最快速的解决方案是:
资料来源:https://github.com/pypa/pip/issues/3819
这似乎对我有用......
我之后用
printf
空格来正确分隔包名 .怎么样: