使用pip命令从requirements.txt升级python软件包


111

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

尝试以下命令

$ pip install --upgrade -r requirements.txt

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

编辑

正如Andy在其答案中提到的那样,软件包已固定到特定版本,因此无法通过pip命令升级软件包。

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

$ pip-review --auto

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


7
Pip-tools运作良好-更新的语法为pip-compile -U requirements.txt
erikreed'1

Answers:


40

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

例:

lxml>=2.2.0

这会将lxml升级到2.2.0以上的任何版本

lxml>=2.2.0,<2.3.0

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


2
我发现执行以下操作很有帮助。1.删​​除venv 2.用相同的名称创建一个新的(清理所有pip包的方式)3.将所有==替换为
Requirements.txt

sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt 将全部替换==>=
philshem

80

你可以试试:

pip install --upgrade --force-reinstall -r requirements.txt

您也可以忽略已安装的软件包并安装新的软件包:

pip install --ignore-installed -r requirements.txt

2
使用该选项,似乎重新安装了相同版本。正如安迪(Andy)在上述答案中提到的那样,程序包固定到特定版本。
abhiomkar 2014年

@abhiomkar,您太过严厉了,我以为您想重新安装相同的版本(也许要添加backport修复程序)
Freelancer 2014年

1
第二个命令是我想要的。请注意,-I--ignore-installed是相同的标志,因此在其中当然是无效的,。这样,在安装过程中不会降级,并且在需求安装完成后,可以使用来升级已安装的软件包pip-review --auto
AXO

79

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

因为没有简便的方法来逐个软件包升级软件包和更新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请在命令中参数。

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


5
大!令人惊讶的是,这种功能没有直接出现在点子中
Jacopofar

5
优雅!我很高兴我向下滚动到:P
PulseJet '18

3
我只是用这个,这是自f弦以来最好的东西。
Pierre.Sassoulas

1
很棒的工具。谢谢。
mszaro

非常有用的工具!我还发现了另一个称为pur的软件包,它也可以升级固定版本
Gal Avineri '19

4

我建议冻结所有依赖项,以使构建具有可预测性

这样做时,您可以像这样一次更新所有依赖项

sed -i '' 's/==/>=/g' requirements.txt
pip install -U -r requirements.txt
pip freeze > requirements.txt

完成上述操作后,请使用新的程序包集测试您的项目,并最终将文件提交requirements.txt到存储库。


3

我只需要做同样的事情...用这个小的一线工作:

packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done

哪一个:

  • packages=$(cat requirements.txt | sed 's/==.*//g') 在requirements.txt中创建当前软件包名称的列表(删除版本)。
  • echo $packages | xargs pip3 install -U 然后将所有软件包作为参数传递给pip3进行升级。
  • freeze=$(pip3 freeze); 以requirements.txt所需的格式获取所有当前软件包版本。
  • for p in $(echo $packages) 然后遍历软件包名称
    • echo $freeze | grep -E "^${p}==" >> requirements.new 从pip Frozen输出中获取与软件包匹配的软件包版本行,并写入新的requirements.txt

这具有保留原始requirements.txt的顺序的额外好处。:)

希望这可以帮助!


2

由于无法使用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


2

另一个解决方案是使用升级要求

pip install upgrade-requirements

然后运行:

upgrade-requirements

它将升级所有不是最新版本的软件包,并在最后创建一个更新的requirements.txt。


0
  • 1)要从reqs.txt升级pip安装的文件, 添加> =代替==, 这将告诉pip安装的lib大于或等于您请求的版本,此处安装的是请求的库的最新版本

    1.a)**我对线程的回答**通过将py -m pip install -r reqs.txt添加到每日重启中...或者类似的性质,您可以更新已安装的库。安迪完美总结

    -我进入此线程的原因是查找有关如何更新虚拟环境基本点的信息(通常对我来说是10.0.03 ??)

希望解决一个问题,我能够得出两个解决方案之一

A. venv创建|| B.安装必需的库

多亏了安迪,我满足了需求B

通过在reqs.txt中添加pip > = 请求的版本

在实例化新的虚拟环境后|| 重新说明以前的Venv

  1. py -m venv devenv

设置新的开发环境

  1. devenv\scripts\activate.bat

激活开发环境

  1. python -m pip install -r requirenments.txt

安装基本库

产量输出

收集pip > = 20.0.2(从-r requirenments.txt(第1行))使用缓存的> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-无任何

找到现有的安装:pip 10.0.1

卸载pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

对不起,我们希望可以帮助某人:)

🤳奥斯汀👨‍🎤🚀🥊


0

第二个答案是最有用的,但是我想做的是锁定某些程序包,同时使其他程序包处于最新版本(例如youtube-dl)。

一个示例requirements.txt如下所示(〜表示兼容):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

然后在终端中,使用命令 pip install --upgrade -r requirements.txt

这样可以确保Pillow保持在6.2.2,将请求升级到最新的2.22.x(如果有),如果尚未安装,则将安装最新版本的youtube-dl。


0

我猜最简单的解决方案是使用以下命令创建requirements.txt:

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

-1

如果您在django项目中安装了任何内容,并且在安装后想要更新需求文件,则此命令可以更新您required.txt文件pip冻结> requirements.txt

如果您的需求文件不存在于项目中,则可以使用此命令来创建新的需求文件。


这是个坏主意,因为它还会添加所有需求的需求,从而导致不必要的大需求文件。如果随后决定更新单个依赖项,则可能会发生版本冲突,除非您知道由于该软件包将哪些其他需求添加到了需求文件中。
暴动

-10

我按如下所示编辑requirements.txt并运行$ sh ./requirements.txt

pip install -U amqp;
pip install -U appdirs;
pip install -U arrow;
pip install -U Babel;
pip install -U billiard;
pip install -U celery;
pip install -U Django;
pip install -U django-cors-headers;
pip install -U django-crispy-forms;
pip install -U django-filter;
pip install -U django-markdown-deux;
pip install -U django-pagedown;
pip install -U django-timezone-field;
pip install -U djangorestframework;
pip install -U fcm-django;
pip install -U flower;
pip install -U gunicorn;
pip install -U kombu;
pip install -U Markdown;
pip install -U markdown2;
pip install -U packaging;

3
这是反模式的理想示例。这是怎么回事:1)requirements.txt是一个.txt文件,但是您已将其设置为可执行文件2)。有一个简单的pip install -r requirements.txt命令。因此,您只能将requirements.txt文件用于列出您的项目依赖项。3)您没有使用软件包的版本。4)这不是一种常见的模式,其他开发人员也不会对如何使用它有所重视。5)难以与CI / CD管道一起使用。请不要使用此示例
Fannigurt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.