首页 文章

使用pip升级所有包

提问于
浏览
1520

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

请注意,官方问题跟踪器上有a feature request .

30 回答

  • 529

    Windows上最短,最简单的 .

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

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

    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

    它可以做很多你可能会觉得有用的事情 .

  • 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}
    

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

  • 5

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

    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 替换为 sedawkperl 或......) .

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

  • 22

    这是我对rbp答案的变化,它绕过了“可编辑”和开发发行版 . 它分享了原始的两个缺陷:它不必要地重新下载和重新安装;并且一个包上的错误将阻止在此之后升级每个包 .

    pip freeze |sed -ne 's/==.*//p' |xargs pip install -U --
    

    相关的错误报告,从bitbucket迁移后有点脱节:

  • 9

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

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

    pip-reviewpip-tools 的一个分支 . 见@knedlsepp提到的pip-tools issue . pip-review 包工作但 pip-tools 包不再有效 .

    pip-review 适用于Windows since version 0.5 .

  • 14

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

  • 1764

    您可以使用以下Python代码 . 与 pip freeze 不同,这不会打印警告和FIXME错误 . For pip < 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)
    

    For 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)
    
  • 70

    https://github.com/cakebread/yolk

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

    但是你需要先得到蛋黄:

    $ sudo pip install -U yolk
    
  • 9

    这似乎更简洁 .

    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

  • 4

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

    因为没有简单的方法来逐个包升级,并且更新了requirements.txt文件,所以我为所选的包(或所有包)写了pip-upgrader also updates the versions in your requirements.txt file .

    Installation

    pip install pip-upgrader
    

    Usage

    激活你的virtualenv(很重要,因为它还将在当前的virtualenv中安装新版本的升级包) .

    cd 进入项目目录,然后运行:

    pip-upgrade
    

    Advanced usage

    如果要求放在非标准位置,请将它们作为参数发送:

    pip-upgrade path/to/requirements.txt
    

    如果您已经知道要升级的包,只需将它们作为参数发送:

    pip-upgrade -p django -p celery -p dateutil
    

    如果需要升级到预发布/发布后版本,请在命令中添加 --prerelease 参数 .

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

  • 6

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

    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>.*//'

    这是一个工作示例:

    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
    
  • 5

    More Robust Solution

    对于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 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命令完全相同:

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

  • 57

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

  • 46

    我已经尝试了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)
    
  • 34

    Windows版本经过Rob van der Woude的 FOR 评论优秀documentation

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

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

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

    我的剧本:

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

    通过a pull-request to the pip folk发送;在此期间使用我写的这个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
    
  • 15

    @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 检查不包括我的开发包,因为它们不在系统site-packages目录中 . try-except只是跳过从PyPI中删除的包 .

    @endolith:我也希望有一个简单的 pip.install(dist.key, upgrade=True) ,但它没有提到内部API,而且pip开发人员没有使用docstrings) .

  • 12

    当使用virtualenv并且如果你只想将包 added 升级到你的virtualenv时,你可能想要这样做:

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

    你可以试试这个:

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

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

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

  • 203

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

    `

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

  • 549

    这不是更有效吗?

    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 列出过时的包裹;
      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个参数,并将其传递给命令以升级软件包列表 .

  • 12

    Windows Powershell解决方案

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

    我在_184117中找到的最简单,最快速的解决方案是:

    sudo -H pip install pipdate
    sudo -H pipdate
    

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

  • 26

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

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

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

  • 5

    怎么样:

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

相关问题