是否可以使用pip
一次升级所有Python包?
注意:官方问题跟踪器上有a feature request。
还没有内置标志,但您可以使用
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
将跳过可编辑(“ - e”)包定义,如@jawache所示。 (是的,你可以用grep
或cut
或sed
或......替换awk
+ perl
)。
-n1
的xargs
标志防止在更新一个包失败时停止一切(感谢@andsens)。
这似乎更简洁。
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
更强大的解决方案
对于pip3使用此:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
对于pip,只需删除3s:
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语法结合sed和sh来完全克服这些问题。可以使用注释版本2仔细检查sed操作的详细信息。
细节
[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组件可能是导致死锁或程序包数据库损坏的潜在原因。
升级时遇到了同样的问题。事实是,我永远不会升级所有包裹。我只升级我需要的东西,因为项目可能会中断。
因为没有简单的方法来升级包,并更新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
参数。
完全披露:我写了这个包。
来自https://github.com/cakebread/yolk:
$ pip install -U `yolk -U | awk '{print $1}' | uniq`
但是你需要先得到蛋黄:
$ sudo pip install -U yolk
单行版@Ramana's answer。
python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
`
当使用virtualenv并且如果您只想升级添加到virtualenv的软件包时,您可能希望:
pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
Windows Powershell解决方案
pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
我在pip issue discussion找到的最简单,最快速的解决方案是:
sudo -H pip install pipdate
sudo -H pipdate
你可以试试这个:
for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
相当神奇的蛋黄使这很容易。
pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade
有关yolk:https://pypi.python.org/pypi/yolk/0.4.3的更多信息
它可以做很多你可能会发现有用的东西。
您可以使用以下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)
对于pip> = 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)
使用awk更新包:qazxsw poi
windows powershell update
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
对我来说是最好的,在这里,但我必须添加一些捕获:
@Ramana's answer
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目录中。 try-except只是跳过已从PyPI中删除的包。
@endolith:我也希望有一个简单的site-packages
,但它看起来并不像pip被命令行所使用的任何东西(文档没有提到内部API,而pip开发人员没有使用docstrings)。
通过pip.install(dist.key, upgrade=True)
发送;在此期间使用我写的这个pip库解决方案:
a pull-request to the pip folk
这似乎对我有用......
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
这不是更有效吗?
pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
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}'
从它左边的管道中获取1个参数,并将其传递给命令以升级包列表。Windows上最短,最简单的。
cut -d' ' -f1
xargs -n1 pip install -U
完成了这项工作。根据其pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
:
pip_upgrade_outdated
步骤1:
docs
第2步:
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
pip install pip-upgrade-outdated
甚至:
pip_upgrade_outdated
快速工作,因为它不会不断发布shell。我很想找到时间来实际使用过时的列表来加快速度。
这是适用于Python 3的PowerShell解决方案:
import pip
pkgs = [p.key for p in pip.get_installed_distributions()]
for pkg in pkgs:
pip.main(['install', '--upgrade', pkg])
而对于Python 2:
import pip
commands = ['install', '--upgrade']
pkgs = commands.extend([p.key for p in pip.get_installed_distributions()])
pip.main(commands)
这会逐个升级软件包。那么一个
pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }
之后应确保没有依赖性被破坏。
升级所有本地包;你可以使用pip-review
:
$ pip install pip-review
$ pip-review --local --interactive
pip-review
是pip-tools
的一个分支。参见pip-tools
issue提到的@knedlsepp。 pip-review
包装工程,但pip-tools
包不再有效。
pip-review
适用于Windows since version 0.5。
怎么样:
pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }
适用于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”来升级所有包;如果一次升级失败,请再次运行并继续下一次升级。
Windows版本之后由Rob van der Woude为documentation咨询优秀的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:'
以下单行可能会有所帮助:
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
$ pip install pipupgrade
$ pipupgrade --latest --yes
pipupgrade帮助您从requirements.txt
文件升级您的系统,本地或包!它还有选择地升级不会破坏变更的软件包。 pipupgrade还确保升级多个Python环境中的包。兼容Python2.7 +,Python3.4 +和pip9 +,pip10 +,pip18 +,pip19 +。
注意:我是该工具的作者。
这个选项在我看来更直接和可读:
pip install -U `pip list --outdated | tail -n +3 | awk '{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
tail -n +3
跳过前两行,awk '{print $1}'
选择每一行的第一个单词。