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

问题描述 投票:1671回答:52

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

注意:官方问题跟踪器上有a feature request

python pip
52个回答
1916
投票

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

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所示。 (是的,你可以用grepcutsed或......替换awk + perl)。

-n1xargs标志防止在更新一个包失败时停止一切(感谢@andsens)。


36
投票

这似乎更简洁。

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


35
投票

更强大的解决方案

对于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命令行功能而导致的可移植性问题
  • 因为常见的pip或pip3子进程失败而导致xargs崩溃
  • 从原始xargs输出拥挤记录
  • 依赖于Python-to-OS桥,同时可能升级它3

上面的命令使用最简单和最便携的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组件可能是导致死锁或程序包数据库损坏的潜在原因。


28
投票

升级时遇到了同样的问题。事实是,我永远不会升级所有包裹。我只升级我需要的东西,因为项目可能会中断。

因为没有简单的方法来升级包,并更新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参数。

完全披露:我写了这个包。


26
投票

来自https://github.com/cakebread/yolk

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

但是你需要先得到蛋黄:

$ sudo pip install -U yolk

24
投票

单行版@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()]'

`


16
投票

当使用virtualenv并且如果您只想升级添加到virtualenv的软件包时,您可能希望:

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

16
投票

Windows Powershell解决方案

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

13
投票

我在pip issue discussion找到的最简单,最快速的解决方案是:

sudo -H pip install pipdate
sudo -H pipdate

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


12
投票

你可以试试这个:

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

12
投票

相当神奇的蛋黄使这很容易。

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的更多信息

它可以做很多你可能会发现有用的东西。


597
投票

您可以使用以下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)

11
投票

使用awk更新包:qazxsw poi

windows powershell update pip install -U $(pip freeze | awk -F'[=]' '{print $1}')


10
投票

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)。


9
投票

通过pip.install(dist.key, upgrade=True)发送;在此期间使用我写的这个pip库解决方案:

a pull-request to the pip folk

9
投票

这似乎对我有用......

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" "}') 和空格来正确分离包名。


6
投票

我的剧本:

printf

6
投票

这不是更有效吗?

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
  1. 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 列出了过时的包裹;
  2. pip list -ogrep -v -i warning上反向匹配以避免更新时的错误
  3. warning返回第一个单词 - 过时包裹的名称;
  4. cut -f1 -d1' 'tr "\n|\r" " "的多线结果转换为单行,空格分隔的列表;
  5. qazxsw poi跳过标题行
  6. cut取得第一栏
  7. awk '{if(NR>=3)print}'从它左边的管道中获取1个参数,并将其传递给命令以升级包列表。

6
投票

Windows上最短,最简单的。

cut -d' ' -f1

6
投票

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

5
投票
pip install pip-upgrade-outdated

甚至:

pip_upgrade_outdated

快速工作,因为它不会不断发布shell。我很想找到时间来实际使用过时的列表来加快速度。


5
投票

这是适用于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] }

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


574
投票

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

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

pip-reviewpip-tools的一个分支。参见pip-tools issue提到的@knedlsepppip-review包装工程,但pip-tools包不再有效。

pip-review适用于Windows since version 0.5


5
投票

怎么样:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

246
投票

适用于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”来升级所有包;如果一次升级失败,请再次运行并继续下一次升级。


107
投票

Windows版本之后由Rob van der Woude为documentation咨询优秀的FOR

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

71
投票

您只需打印过时的软件包即可

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

59
投票

以下单行可能会有所帮助:

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

54
投票

Use pipupgrade!

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

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

enter image description here

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


52
投票

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

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}'选择每一行的第一个单词。

© www.soinside.com 2019 - 2024. All rights reserved.