如何使用pip命令从requirements.txt文件升级我所有的python包?

尝试以下命令

$ pip install --upgrade -r requirements.txt

因为python包的后缀是版本号(Django==1.5.1),所以它们似乎不会升级。有没有比手动编辑requirements.txt文件更好的方法?

EDIT

正如Andy在他的回答中提到的,包被固定到特定的版本,因此不可能通过pip命令升级包。

但是,我们可以使用以下命令使用pip-tools实现这一点。

$ pip-review --auto

这将自动升级requirements.txt中的所有包(确保使用PIP install命令安装PIP -tools)。


当前回答

我已经回答了这个问题。以下是我的解决方案:

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

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

完全披露:这个包是我写的。

其他回答

因为我不能用bash来做这个,我写了一个python模块来创建一个新的没有版本的需求文件并使用它:

data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
    new_line = line[:line.index('==')]
    data2.write(new_line + '\n')
data2.flush()

然后从新文件pip install -U -r requirements-prod-no-version.pip中安装这些库

最后将版本冻结到原始文件pip freeze > requirements-prod.pip

你可以在Linux和Mac上使用以下命令:

cat requirements.txt | cut -f1 -d= | xargs pip install -U

使用pip工具,您有一个基本的要求。在需要的依赖项和一个带有固定版本的requirements.txt文件中。Pip-tools然后自动生成固定版本,这使得处理包括升级依赖项在内的整个过程更加容易。

# requirements.in
django

和自动生成的requirements.txt(固定所有依赖项)

$ pip-compile requirements.in
#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile requirements.in
#
asgiref==3.2.3
    # via django
django==3.0.3
    # via -r requirements.in
pytz==2019.3
    # via django
sqlparse==0.3.0
    # via django

如果你使用这个工作流,我强烈推荐,它是

pip-compile --upgrade

生成带有最新版本的requirements.txt。

不。您的需求文件已经固定到特定的版本。如果您的需求已设置为该版本,则不应尝试升级到超出这些版本的版本。如果您需要升级,那么您需要在需求文件中切换到未固定的版本。

例子:

lxml>=2.2.0

这将把lxml升级到任何比2.2.0更新的版本

lxml>=2.2.0,<2.3.0

这将把lxml升级到2.2.0和2.3.0之间的最新版本。

我想最简单的解决方案是创建requirements.txt:

pip freeze | sed 's/==/>=/' > requirements.txt