【问题标题】:How to install multiple .whl files in the right order如何以正确的顺序安装多个 .whl 文件
【发布时间】:2021-04-26 21:32:40
【问题描述】:

我最近发现自己不得不在没有互联网连接的机器上安装 python 项目的所有依赖项(20+)。我使用pip download ... 获取所有*.whl 文件并手动传输它们。直到现在我才完全欣赏 pip 的天才,以及它如何自行计算依赖树并设法以正确的顺序安装每个包。例如。一个包依赖于requests 包,它自己依赖于urllib3 包等等。

我想要一种使用命令控制台或 python 本身在机器上安装所有这些依赖项的自动化方式,所以我求助于 StackOverflow 并找到了以下解决方案: How to install multiple whl files in cmd

几乎所有建议的解决方案都对我有用,但缺点是必须多次运行它们直到不再安装失败!这是由于脚本/命令按字母顺序对软件包进行排序并尝试按该顺序安装它们(例如,尝试在 urllib3 到位之前安装 requests)。

有没有更聪明的方法来做到这一点,只准时执行一个脚本/命令?

【问题讨论】:

  • 作为一个框架挑战 - 您是否考虑过在没有 Internet 连接的机器上“托管”您自己的 PyPI 存储库? stackoverflow.com/a/51127695/1149933
  • 不,直到这一刻我才知道这是可能的。您是否有用于解释该过程的材料的建议/链接?
  • 我更新了我的评论,并在您输入回复时添加了指向该问题(我认为)的答案的链接。
  • 我有点困惑。为什么顺序很重要?这绝对不重要。如果它确实重要,那么某些地方可能会损坏......安装 wheels 只是将wheels文件解压缩到正确的文件夹中(有点复杂,但不是那么多)。您是否尝试在安装命令中添加--no-deps?也许像python -m pip install --no-deps wheels/*.whl这样的东西?
  • 就是这样!由于我确定我拥有 .whl 文件形式的所有依赖项,因此使用 --no-deps 标志是合理的。尽管亚当的建议也有效,但这当然更简单。如果你想让它成为一个答案,我会接受它。

标签: python pip


【解决方案1】:

确定正确安装顺序的最简单方法是根据包的依赖关系对包进行排序。 这些主题已经在其他几个 SO 问题中单独讨论过,所以我将链接到它们而不是重复。“安全安装算法”如下所示:

  1. 读取所有包的元数据。 this question explains how 关注包名和依赖关系。
  2. 按拓扑排序 Article on Wikipediaanother helpful question
  3. 按顺序安装包。

【讨论】:

  • 虽然这是一种解决问题的非常系统的方法,但我觉得这个答案没有抓住问题的重点。目的是找到一种在一个脚本或命令中自动化该过程的方法。在尝试手动找出依赖关系图并挖掘包的元数据之前,我还可以简单地执行我的脚本 n 次,其中 n 在最坏的情况下是图的深度,直到不再安装失败。
  • 获取信息:pip 的依赖解析器是 resolvelib。还有一个 simple example 展示了如何使用它来解决 PyPI 上的 wheels
【解决方案2】:

这个包含您创建的车轮分发文件的目录有时称为wheelhouse。它们通常用于进行可重复和/或离线安装。

从驾驶室安装的常用方法是:

python -m pip install --no-index --no-deps path/to/wheelhouse/*.whl

如果所有依赖项及其依赖项的所有轮子都在 Wheelhouse 中,则安装顺序无关紧要,无需连接到任何远程包索引(用于依赖项解析等)。这就是我们可以使用--no-deps--no-index 标志的原因。

参考


旁白

直到现在我才完全欣赏 pip 的天才,以及它如何自行计算依赖关系树并设法以正确的顺序安装每个包。

pip 的依赖解析器是 resolvelib。有一个简单的example on its source code repository 展示了如何使用它来解决 PyPI 上的轮子问题。

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 2016-11-22
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多