【问题标题】:Exclude manylinux wheels when downloading from pip从 pip 下载时排除 manylinux 轮子
【发布时间】:2016-09-10 22:29:43
【问题描述】:

在 $company,我们运行一个内部 pypi 服务器来保护自己免受公共 pypi 停机的影响。我们还构建了轮子以避免二进制包的安装开销。一项常见任务是从公共 pypi 导入包,这基本上归结为:

pip install --download . --no-binary :all: $PACKAGE  # download a source distribution

pip wheel $PACKAGE  # build a binary distribution (or use a cached version that's already on our internal pypi)

在最新的pip下,这可能会在pip wheel阶段下载/安装manylinuxwheels。由于在轮子捆绑了 .so 文件,这些与我们在 $company 的安全要求不兼容。我们如何在避免许多 Linux 轮子的同时继续相同的工作流程?

目前我们正在降级到pip<8,但这似乎并不理想

【问题讨论】:

  • 我已经为类似的问题打开了一个 pip 项目的错误。 github.com/pypa/pip/issues/3689据我所知,目前还没有办法禁用manylinux wheel的下载。

标签: python pip python-wheel


【解决方案1】:

解决方法

作为一种解决方法,您可以在当前工作目录中创建文件 _manylinux.py,或在 site-packages 中创建具有以下内容的文件:

manylinux1_compatible = False

这将确保在您运行命令时不会下载 manylinux1 轮子:

pip wheel -w path/to/wheeldir -f path/to/wheeldir -r requirements.txt

您实际上不需要使用两个命令pip install --downloadpip wheel,但是您可以使用上面的单个命令。 (请注意,不推荐使用 pip install --download 以支持 pip download 命令)。

我建议的命令将:

  1. 检查轮子是否已经存在于path/to/wheeldir 中并且不会接触该轮子。
  2. 如果在需求文件中检测到新版本(或者您可以将-r requirements.txt 替换为包和确切版本package==X.X.X)并且轮子是通用的——它将下载该轮子并将其存储到path/to/wheeldir
  3. 如果包需要编译(例如numpy,或matplotlib)——将下载源tgz,pip将构建轮子,生成的轮子将存储在path/to/wheeldir中。

我已经测试了这个解决方案,[在pypa/pip#3689 中建议。它不是我们需要的解决方案,但它是可行的,我使用它。

_manylinux.py 文件可以放在哪里?

画中画attempts to import _manylinux module

问:Python 会在哪里寻找它?
答:Python 遵循the module search path

因此您可以将文件放在以下位置:

  1. 当前工作目录。
  2. PYTHONPATH 中的路径。
  3. 安装默认路径。

前两个路径很简单,但是你如何找到你的安装默认路径呢?只需运行以下命令:

python -c "import os.path as p;print(p.dirname(p.realpath(p.__file__)))"

希望,这会有所帮助。

【讨论】:

    【解决方案2】:

    对于那些寻找可安装解决方法的人,我创建了no-manylinux

    用法比较简单:

    # First install no-manylinux
    pip install no-manylinux
    # Now subsequent invocations of pip will ignore manylinux wheels
    pip install ...
    # To restore the original behaviour, simply `pip uninstall no-manylinux`
    

    它通过安装_manylinux.py 文件以manylinux_compatible = False 作为内容来工作

    【讨论】:

      【解决方案3】:

      在使用轮子时,您似乎只想使用源分发而不是轮子。为此,请将此 --no-use-wheel 添加到您的 pip 命令中。

      在构建轮子时使用它听起来有点违反直觉,但它实际上意味着Do not Find and prefer wheel archives when searching indexes and find-links locations. 这应该强制在轮子阶段为您所依赖的任何依赖项获取远程源 dist 而不是轮子。

      【讨论】:

      • --no-use-wheel 将排除 py2.py3-none-any 轮子以及“正确”编译的 linux_x86_64 轮子(在内部 pypi 上),因此这是一个非解决方案。
      • 出于同样的原因--no-binary :all:(pip>=8 选项)也不够
      • 所以你被困在角落里了。您需要提前在您的存储库中提供您需要的所有依赖项,作为预构建的轮子。并且永远不要依赖主要的 Pypi。
      • 请注意,在可能的情况下事情仍然可以解决,您可以在详细模式下运行 pip 以获取大量正在发生的细节。
      猜你喜欢
      • 2014-07-28
      • 2016-11-18
      • 1970-01-01
      • 2016-02-18
      • 2016-05-12
      • 1970-01-01
      • 2013-03-15
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多