应该如何以及由谁将wheel指定为Python包依赖项



我正在编写一个源捆绑包(不是一个完全打包的模块,而是一些有依赖关系的脚本(,以便在框架应用程序中安装和执行(特别是AmazonSageMaker的TensorFlow服务容器-运行Python 3.5(。

我的依赖项之一是matplotlib,它反过来需要kiwisolver,它有C++组件。

默认情况下,我的目标容器似乎没有安装wheel,因为当我只提供requirements.txt文件时,我会收到"为什么python setup.py在Travis CI上说命令'bdist_wheel'无效?"中描述的错误。

我想我是通过提供setup.py,而不是Travis CI问题的答案中建议的setup_requires=["wheel"]来实现的。

我的Python封装fu很弱,所以我的问题是:谁应该指定这个依赖项,因为它似乎不应该是我?

  • kiwisolver是否应该宣传它需要wheel
  • 通过requirements.txt安装用户代码模块的框架应用程序/环境是否有一个隐含的契约,以使wheel在环境中可用,这是因为Python的封装精神
  • 也许我真的有责任知道,因为我间接地使用了像kiwisolver这样的模块,所以我的包需要wheel进行设置,而直接的pip install -r requirements.txt不起作用

如果有人能解释这个答案是否随着PEP518和setup_requires:S 的弃用而改变,那就更好了

通常轮子可以被视为构建时间依赖项,而不是安装时间heel只是分发Python项目(库或应用程序(的一种方式,因此它通常不是强制性的依赖项。

构建库的一个系统(kiwisolver(可能需要安装wheel工具。但是,如果我没有错的话,最近版本的pip已经捆绑了wheel,所以现在通常不需要明确安装它。

在许多情况下,PyPI上已有车轮。但有时没有与目标系统兼容的轮子(Python解释器版本、操作系统、CPU位(。在您的案例中,kiwisolver有多种轮子可用,但不适用于Python 3.5

因此,您想要安装kiwisolver的系统似乎与PyPI上的任何轮子都不兼容。因此pip必须在本地构建它。通常pip会尝试先构建wheel,但据我所知,如果无法构建wheel,那么pip通常只是继续并安装项目,而不需要执行wheel中间步骤。

但是pip仍然必须能够构建库,这可能需要一些C/C++编译器,或者本地系统上满足其他异常条件。这就是为什么将库作为wheel分发是非常舒适的,因为构建步骤已经完成。

综上所述,从我的角度来看,没有人真的必须将wheel声明为依赖项或安装wheel,除非他们真的想构建车轮。但是wheel实际上只是一个可选的中间步骤。这是一种分发Python项目(库或应用程序(的方式。我不认为绝对需要将轮子添加到setuptoolssetup_requires(已弃用或接近它(或pyproject.tomlbuild-system.requires,这更像是一种(非常常见的准标准(便利。

现在,在你的情况下我该怎么办?

  • 从包含kiwisolverrequirements.txt文件安装之前(直接或间接(,请确保pip是最新的,或明确安装wheel,并且:
    • 使用PyPI上已有wheels的Python版本
    • 如果您想继续使用Python 3.5
      • 确保目标系统能够构建kiwisolver本身(可能需要C/C++编译器和其他一些本机库(

相关内容

  • 没有找到相关文章

最新更新