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

注意:官方问题跟踪器上对此有一个功能请求。


当前回答

我在升级方面也遇到了同样的问题。问题是,我从不升级所有包。我只升级我需要的,因为项目可能会中断。

因为没有一种简单的方法来逐个包升级和更新requirements.txt文件,所以我编写了这个pip升级程序,它还更新了所选包(或所有包)的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参数。

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

其他回答

以下命令在Windows上运行,对其他人也很有用($是命令提示符下的任何目录。例如,C:\Users/Username)。

Do

$ pip freeze > requirements.txt

打开文本文件,将==替换为>=,或让sed为您执行以下操作:

$ sed -i 's/==/>=/g' requirements.txt

并执行:

$ pip install -r requirements.txt --upgrade

如果您对某个软件包延迟升级有问题(有时是NumPy),只需转到目录($),注释掉名称(在其前面添加#),然后再次运行升级。稍后可以取消注释该部分。这对于复制Python全局环境也非常有用。


另一种方式:

我也喜欢pip审查方法:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip-review --local --interactive

您可以选择“a”来升级所有软件包;如果一次升级失败,请再次运行,然后在下一次升级中继续。

以下是通过pip更新所有Python 3包(在激活的virtualenv中)的代码:

import pkg_resources
from subprocess import call

for dist in pkg_resources.working_set:
    call("python3 -m pip install --upgrade " + dist.project_name, shell=True)

这里发布的所有解决方案都打破了依赖关系。

在此对话中,将功能直接包含到pip中,包括正确管理依赖关系:

的作者https://github.com/kdeldycke/meta-package-manager写入MPM可以模拟缺少的upgrade all命令:

mpm --pip upgrade --all

一行(bash)。对我来说最短、最简单。

pip install -U $(pip freeze | cut -d = -f 1)

解释:

pip冻结返回每个包的package_name==版本cut-d=-f 1表示“对于每一行,返回第一行的字段,其中字段由=分隔”$(cmd)返回命令cmd的结果。因此,在这里,cmd将返回包名列表,pip install-U将对其进行升级。

如果您希望升级仅由pip安装,并且避免升级由其他工具(如apt、yum等)安装的软件包,那么您可以使用我在Ubuntu上使用的脚本(可能也适用于其他发行版)-基于以下帖子:

printf "To update with pip: pip install -U"
pip list --outdated 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo