使用pip升级所有包

thedjpetersen 1859 python pip

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

请注意,官方问题跟踪器上有此功能请求.

rbp.. 2051

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

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+ cutsedawkperl或......).

如果更新一个包失败-n1,则xargs阻止停止所有内容的标志(感谢@andsens).

  • 右:(问题现在存在于https://github.com/pypa/pip/issues/59.但是每个建议似乎都回答"是的,但是我很确定X是否是正确的做Y的方法"......现在总比没有好?实用性超过纯度?:( (50认同)
  • 在进行实际升级之前,我会先输入一个"tee",这样你就可以获得原始版本的列表.例如`pip freeze --local | tee before_upgrade.txt | ......那样,如果出现任何问题,恢复会更容易. (28认同)
  • 它还会打印那些使用普通包管理器(如apt-get或Synaptic)安装的包.如果我执行这个`pip install -U`,它将更新所有包.我担心它会导致与apt-get发生冲突. (18认同)
  • 我将`-H`添加到`sudo`以避免出现恼人的错误消息:`$ pip freeze --local | grep -v'^\ - e'| cut -d = -f 1 | xargs -n1 sudo -H pip install -U` (9认同)
  • 如何将grep更改为:egrep -v'^(\ - e |#)'(我在ubuntu 12.10上运行时得到这一行:"## FIXME:在这个包的dependency_links中找不到svn URL:". (7认同)
  • 如果由于某种原因pip在它的中间失败(即包不再存在),你可以将`-n1`添加到`xargs`,这使得它一次只传递一个参数到pip,否则pip退出第一个错误. (6认同)
  • 以下咒语更新为使用pip list --outdated.它会忽略任何错误或警告消息,并且不会考虑它们.`pip list --outdated | grep -G'(当前.*)'| sed's /(当前.*//'| xargs -n 1 sudo pip install --upgrade` (4认同)
  • @rbp,这很公平.我有一些建议,因为代码高尔夫是我们的目标.(你说"简单,尽可能短")而不是管道grep&cut,你可以使用一个工具保存**进程**和字符.使用awk`pip冻结 - 本地|保存3个字符 awk -F ='!/ ^ - e/{print $ 1}'| xargs -n1 pip安装-U`或10个字符与sed`pip freeze --local | sed'/^-e/d;s/=.*//'| xargs -n1 pip install -U`. (3认同)
  • @PiotrDobrogost我一直试图保持简单.但是,嗯,有道理.我已经把它包含了(有一个小修复:我已经将正则表达式固定到包名的开头,以避免排除像"<something> -e <something else>"这样的包. (2认同)
  • 你也可以使用*sed*来获得更简单的一行,例如(这并没有击中你所包含的所有东西,但原则上它很容易就可以):`pip freeze --local | sed的/==.*//'| xargs pip install -U`. (2认同)
  • 用户安装的软件包(即〜/ .local中的软件包)应单独处理,否则将被非用户安装替换.对于Github的要点来说,这看起来是一个不错的任务,直到pip升级为止. (2认同)
  • 我需要在最后一个元素中添加一个sudo:pip freeze --local | grep -v'^\ - e'| cut -d = -f 1 | sudo xargs -n1 pip install - (2认同)
  • 管道的好例子,但我仍然会使用pip-review.简单比复杂更好;) (2认同)

Ramana.. 636

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

  • 没有调用子进程就没有办法使用pip安装吗?像'import pip``pip.install('packagename')`的东西? (49认同)
  • 作为Python脚本,此方法也适用于Windows. (47认同)
  • 这个效果非常好......当任务需要一个非常长的时间时,它总是令人满意的......并且给你一大堆新的东西!PS:如果您使用的是OS X,请以root用户身份运行! (15认同)
  • 我把它包装在[fabfile.py](https://gist.github.com/joshkehn/5485111)中.谢谢! (6认同)
  • @BenMezger:你真的不应该在你的virtualenv中使用系统包.你也真的不应该以root身份运行一些可信的,众所周知的程序.使用--no-site-packages运行您的virtualenvs(在最新版本中默认). (5认同)
  • 如果不能再找到包,则对此选项竖起大拇指,所选答案(上图)将失败.这个脚本只是继续下一个包,太棒了. (3认同)
  • 这不起作用,可能会使处理系统范围的软件包的工作变得棘手. (2认同)
  • 应该是接受的答案.只出现了一个问题,如果您的Windows中安装了两个或更多Python,只有一个可以升级软件包.在这种情况下,`pip`是"默认"Python的`pip.exe`.我将其更改为`call("%s \\ Scripts \\ pip.exe install --upgrade%s"%(dirname(sys.executable),dist.project_name),shell = True)`这当然使其无法使用但是,在非Windows平台上. (2认同)

jfs.. 610

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

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

pip-review是一个分叉pip-tools.见pip-tools问题被提到@knedlsepp.pip-review包工作但pip-tools包不再有效.

pip-review自0.5版以来在Windows上运行.

  • @mkoistinen这是一个很好的工具,但直到它在PIP中合并它意味着安装一些并非每个人都想做的事情. (7认同)
  • 不使用交互模式更新所有内容:`pip-review --local --auto` (7认同)
  • pip-review工作得很好(至少对于Python版本3.5.0) (5认同)
  • @Daniel:pip-tools不再有用,pip-review(pip-tools的分支)有效. (2认同)

azazelspeaks.. 280

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

  • 你应该删除`requirements.txt`的`== {version}`.例如:`python-dateutil == 2.4.2`到所有行的`python-dateutil`. (27认同)
  • @youngminz在运行'pip install ...'之前,我建议你在编辑器/ ide中快速'全部替换'==">"> ="'来解决这个问题 (10认同)
  • 对于linux:`$ pip freeze | cut -d'=' - f1> requirements.txt`以删除版本 (7认同)
  • 我发现这实际上没有升级macOS上的软件包. (4认同)

Piotr Dobrog.. 118

咨询优良的售后服务Windows版本文档FOR罗布范德Woude

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

  • `for/F"delims ="%i in('pip list --outdated')do pip install -U%i`更快,因为它只会尝试更新"过时"的包 (17认同)
  • @RefaelAckermann我怀疑这会比原来的慢:)要知道哪些软件包已经过时,请先检查每个软件包的最新版本。它与更新时的第一步完全相同,并且如果没有可用的较新版本,则不会继续进行。但是,在您的版本中,pip将检查两次版本,第一次是建立过时软件包列表,第二次是在更新列表中的软件包时。 (3认同)
  • @RefaelAckermann旋转pip的数量级比通过网络检查软件包的版本快几个数量级,因此应优化的检查数量而不是旋转数量。我的会进行n次检查,您的会进行n + m次检查。 (2认同)
  • +1-今天是6.20.2019,我在Windows 10上使用的是Python 3.7.3,这是我更新所有本地包的最佳方法。 (2认同)

Achilles Gas.. 85

使用pipupgrade!

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

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

在此输入图像描述

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

  • 不错的主意,但是当我尝试它时,它永远都停留在“检查...”上。 (6认同)

小智.. 72

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

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

  • 在virtualenv中,我这样做:`pip freeze --local | cut -d = -f 1 | xargs -n 1点子搜索| grep -B2'最新:'` (14认同)

raratiru.. 60

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

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 list --outdated | cut -d'' - f 1 | xargs -n 1 pip install --upgrade` (13认同)

Marc.. 57

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

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


Douglas Dase.. 42

更强大的解决方案

对于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组件可能是导致死锁或程序包数据库损坏的潜在原因.


Shihao Xu.. 37

这似乎更简洁.

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

  • @Reman:这是因为您正在使用Pip v9.0.1。这只是不赞成使用的消息,意味着某些功能在以后的Pip版本中将无法生存。不用担心;) (2认同)

小智.. 31

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

因为没有简单的方法来逐个包升级,并且更新了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请在命令中添加参数.

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

  • 这是pip默认应该做的事情. (8认同)

小智.. 26

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

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

但是你需要先得到蛋黄:

$ sudo pip install -U yolk


Salman von A.. 25

@ Ramana答案的单行版本.

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

`

  • subprocess.call("sudo pip install ...以防你需要权限 (4认同)
  • @MaximilianoRios请不要`sudo pip install`,而是使用[virtual env](https://github.com/pypa/virtualenv). (4认同)

小智.. 17

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

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


Apeirogon Pr.. 16

Windows Powershell解决方案

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


RedEyed.. 14

我在pip问题讨论中找到的最简单,最快速的解决方案是:

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


user1175849.. 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

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

  • 你的答案已从`yolk`改为`yolk3k`,你的原始答案肯定与python3有问题. (3认同)

JohnDHH.. 12

使用awk更新包: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

windows powershell更新 foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}


chbrown.. 10

@ Ramana的回答对我来说是最好的,在这里,但我不得不添加一些捕获:

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,而且pip开发人员没有使用文档字符串).


Samuel Marks.. 9

通过拉动请求发送到pip民谣 ; 在此期间使用我写的这个pip库解决方案:

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


SaxDaddy.. 9

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

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

之后我用printf空格来正确分隔包名.


adrin.. 7

pip_upgrade_outdated做这项工作.根据其文档:

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

步骤1:

pip install pip-upgrade-outdated

第2步:

pip_upgrade_outdated


小智.. 7

Windows上最短,最简单的.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt


Alex V.. 6

这不是更有效吗?

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 从它左边的管道中取出一个参数,并将其传递给命令以升级包列表.


Icyblade.. 6

我的剧本:

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


小智.. 6

这是针对Python 3的PowerShell解决方案:

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

对于Python 2:

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

这将一个接一个地升级软件包。所以

pip3 check
pip2 check

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


小智.. 6

怎么样:

pip install -r <(pip freeze) --upgrade


Steve Barnes.. 5

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.我很想找到时间来实际使用过时的列表来加快速度.


小智.. 5

PowerShell 5.1中有一行使用adm权限,python 3.6.5和pip ver 10.0.1:

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

如果列表中没有破损的包裹或特殊轮子,它可以顺利运行......


归档时间:

查看次数:

1076379 次

最近记录:

9 月 前