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

abh*_*kar 78 python packages pip requirements.txt

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

试过下面的命令

$ pip install --upgrade -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

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

编辑

正如Andy在他的回答包中提到的那样固定到特定版本,因此无法通过pip命令升级包.

但是,我们可以pip-tools使用以下命令实现此目的.

$ pip-review --auto
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*cer 65

你可以试试:

pip install --upgrade --force-reinstall -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

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

pip install -I, --ignore-installed -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

  • 使用该选项似乎会重新安装相同的版本。正如安迪在上面的回答中提到的,包被固定到特定版本。 (4认同)
  • 这绝对是最好的解决方案,因为它直接使用 pip 而无需安装另一个软件包。 (4认同)
  • 第二个命令是我正在寻找的。请注意,“-I”和“--ignore-installed”是相同的标志,当然其中包含“,”是无效的。这样,在安装过程中就不会发生降级,并且在安装要求完成后,可以使用“pip-review --auto”升级已安装的软件包。 (3认同)

Sim*_*aei 61

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

因为没有简单的方法来逐个包升级,并且更新了requirements.txt文件,所以我编写了这个pip-upgradeder,它还会更新requirements.txt文件中所选包(或所有包)的版本.

安装

pip install pip-upgrader
Run Code Online (Sandbox Code Playgroud)

用法

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

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

pip-upgrade
Run Code Online (Sandbox Code Playgroud)

高级用法

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

pip-upgrade path/to/requirements.txt
Run Code Online (Sandbox Code Playgroud)

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

pip-upgrade -p django -p celery -p dateutil
Run Code Online (Sandbox Code Playgroud)

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

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

  • 非常有用的工具!我还发现了另一个名为 [pur](https://github.com/alanhamlett/pip-update-requirements) 的软件包,它也升级了固定版本 (8认同)
  • 大!令人惊讶的是,这种功能并不直接存在于点子中 (5认同)
  • 优雅!超级高兴我滚动到这个:P (4认同)
  • Pip 升级程序已在其 github 页面上停止使用。 (4认同)
  • 我只是用这个,这是自f弦以来最好的东西。 (3认同)
  • 全面披露:这个包是史诗般的。 (3认同)

And*_*ndy 29

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

例:

lxml>=2.2.0
Run Code Online (Sandbox Code Playgroud)

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

lxml>=2.2.0,<2.3.0
Run Code Online (Sandbox Code Playgroud)

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

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

Vis*_*rde 13

建议的做法是修复特定版本的依赖关系。

这是另一个使用pur来保持依赖项最新的解决方案!

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

例如,在示例 requests.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.
Run Code Online (Sandbox Code Playgroud)

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


Her*_*mes 12

我建议冻结您的所有依赖项,以便进行可预测的构建

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

sed -i '' 's/[~=]=/>=/' requirements.txt
pip install -U -r requirements.txt
pip freeze | sed 's/==/~=/' > requirements.txt
Run Code Online (Sandbox Code Playgroud)

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


Eli*_*Eli 8

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

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

Pillow==6.2.2
requests~=2.22.0
youtube_dl
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

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

cat requirements.txt | cut -f1 -d= | xargs pip install -U
Run Code Online (Sandbox Code Playgroud)


gio*_*tto 7

在我看来,更强大的解决方案是使用依赖项管理,例如poetryhttps://python-poetry.org 它附带了详尽的依赖项解析器。


小智 6

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

pip install upgrade-requirements
Run Code Online (Sandbox Code Playgroud)

然后运行:

upgrade-requirements
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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
Run Code Online (Sandbox Code Playgroud)

哪一个:

  • 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 freeze 输出中获取与包匹配的包版本行并写入新的 requirements.txt

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

希望这可以帮助!