【问题标题】:Upgrade python packages from requirements.txt using pip command使用 pip 命令从 requirements.txt 升级 python 包
【发布时间】:2014-09-06 00:33:28
【问题描述】:

如何使用 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 install 命令安装pip-tools)。

【问题讨论】:

  • Pip-tools 运行良好——更新后的语法是 pip-compile -U requirements.txt
  • 现在是pip install pip-reviewpypi.org/project/pip-review

标签: python pip packages requirements.txt


【解决方案1】:

你可以试试:

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

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

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

【讨论】:

  • 使用该选项似乎会重新安装相同的版本。正如安迪在上面的回答中提到的,包被固定到特定的版本。
  • @abhiomkar 你说得对,我以为你想重新安装相同的版本(也许要添加反向端口修复)
  • 第二个命令就是我要找的。请注意,-I--ignore-installed 是相同的标志,当然在其中包含 , 是无效的。这样在安装过程中不会发生降级,并且在安装要求完成后,可以使用pip-review --auto升级已安装的软件包。
  • 这绝对是最好的解决方案,因为它直接使用 pip 而无需安装另一个包。
  • 没用,我还有旧版本。它卸载了旧版本,然后重新安装了旧版本。
【解决方案2】:

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

例子:

lxml>=2.2.0

这会将 lxml 升级到任何高于 2.2.0 的版本

lxml>=2.2.0,<2.3.0

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

【讨论】:

  • 我发现执行以下操作很有帮助。 1.删​​除venv 2.新建一个同名的(清理所有pip包的方法) 3.将requirements.txt中的所有==替换为>= 4.pip install -r requirements.txt 4.跨度>
  • sed 's/==/&gt;=/g' requirements.txt &gt; TMP_FILE &amp;&amp; mv TMP_FILE requirements.txt 将用&gt;= 替换所有==
【解决方案3】:

由于我无法使用 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 &gt; requirements-prod.pip

【讨论】:

    【解决方案4】:

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

    因为没有简单的方法来逐包升级和更新 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 中没有直接存在这样的功能
    • 优雅!超级高兴我向下滚动到这个:P
    • 我刚用过这个,这是自 f-strings 以来最好的东西。
    • 全面披露:这个包是史诗级的。
    • 美丽。优雅的。比我预期的要容易。如果您不介意额外安装,请使用此答案!
    【解决方案5】:

    我如下编辑 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;
    

    【讨论】:

    • 这是反模式的理想示例。这里有什么问题:1)requirements.txt 是一个 .txt 文件,但您已使其可执行 2)。有一个简单的 pip install -r requirements.txt 命令。因此,您只能使用 requirements.txt 文件来列出您的项目依赖项。 3)您没有使用软件包的版本。 4) 不是通用模式,其他开发人员对如何使用它一无所知。 5) 难以与 CI/CD 管道一起使用。请不要使用此示例
    【解决方案6】:

    如果你在你的 django 项目中安装了任何东西,并且在安装后你想更新你的需求文件,这个命令可以更新你的 requirements.txt 文件 pip freeze > requirements.txt

    如果您的项目中不存在您的需求文件,您可以使用此命令生成新的 requirements.txt 文件 pip freeze > requirements.txt

    【讨论】:

    • 这是个坏主意,因为它还会添加所有需求的需求,从而导致需求文件过大。如果您随后决定更新单个依赖项,则可能会遇到版本冲突,除非您知道由于该软件包而将哪些其他需求添加到您的需求文件中。
    【解决方案7】:

    另一种解决方案是使用upgrade-requirements

    pip install upgrade-requirements
    

    然后运行:

    upgrade-requirements
    

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

    【讨论】:

      【解决方案8】:
      • 1) 从 reqs.txt 升级 pip 安装的文件 添加 >= 代替 == 这将告诉 pip 安装 lib 大于或等于您请求的版本,这里通过安装请求库的最新版本

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

        -我进入这个帖子的原因是为了找到有关如何更新虚拟环境基础 pip 的信息(对我来说通常是 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-none-any.whl

      找到现有安装:pip 10.0.1

      卸载 pip-10.0.1:

       Successfully uninstalled pip-10.0.1
       Successfully installed pip-20.0.2
      

      对不起,脑转储,希望这对某人有帮助:)

      ? 奥斯汀?‍???

      【讨论】:

        【解决方案9】:

        我只需要做同样的事情......使用这个小单线来完成这项工作:

        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}==" &gt;&gt; requirements.new 从 pip freeze 输出中获取与包匹配的包版本行并写入新的 requirements.txt

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

        希望这会有所帮助!

        【讨论】:

          【解决方案10】:

          我建议冻结所有依赖项,以便获得可预测的构建

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

          sed -i '' 's/[~=]=/>=/' requirements.txt
          pip install -U -r requirements.txt
          pip freeze | sed 's/==/~=/' > requirements.txt
          

          完成上述操作后,测试您的项目,使用新的软件包集并最终将requirements.txt 文件提交到存储库,同时仍允许安装热修复程序.

          【讨论】:

          • 这一切都很好。所以几个月后包会有更新,你如何更新这些并再次提交 .txt 文件?
          • 我更新了我的帖子,以便更好地描述我的方法。假设应用程序是活跃的并且正在积极开发,它会不时进行一些更改。在某些情况下,可以使用上述方法手动更新其依赖项。这可能需要一些额外的更改,因为可能存在一些不兼容性。除此之外,由于requirements.txt 中的~=,更改始终通过CI/CD 进行,在此期间至少可以应用一些热修复程序。由于 ~= 不会发生重大和重大变化,因此构建仍然可以被认为是可预测的。
          【解决方案11】:

          第二个答案是最有用的,但我想做的是锁定一些包,同时让其他包处于最新版本(例如 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。

          【讨论】:

            【解决方案12】:

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

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

            【讨论】:

              【解决方案13】:

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

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

              【讨论】:

                【解决方案14】:

                建议将依赖项修复到特定版本。

                这是另一个使用pur 保持依赖关系新鲜的解决方案!

                提供您的 requirements.txt 文件,它会自动将您所有的高级包更新到最新版本,保持您的原始格式和 cmets 就位。

                例如,在示例 requirements.txt 上运行 pur 会将包更新到当前可用的最新版本:

                $ pur -r requirements.txt
                Updated flask: 0.9 -> 0.10.1
                Updated sqlalchemy: 0.9.10 -> 1.0.12
                Updated alembic: 0.8.4 -> 0.8.6
                All requirements up-to-date.
                

                由于 pur 从不修改您的环境或安装的软件包,它的速度非常快,您可以安全地运行它,而不必担心破坏您的本地虚拟环境。 Pur 将更新您的 requirements.txt 文件与安装更新分开。因此您可以使用 pur,然后分步安装更新。

                【讨论】:

                  【解决方案15】:

                  更强大的解决方案是 IMO 使用依赖管理,例如 poetryhttps://python-poetry.org,它带有一个详尽的依赖解析器。

                  【讨论】:

                    猜你喜欢
                    • 2019-03-20
                    • 2016-11-13
                    • 2011-02-12
                    • 1970-01-01
                    • 2011-02-21
                    • 2013-05-22
                    • 2021-02-01
                    • 2018-12-17
                    相关资源
                    最近更新 更多