我正在编写一个源捆绑包(不是一个完全打包的模块,而是一些有依赖关系的脚本(,以便在框架应用程序中安装和执行(特别是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项目(库或应用程序(的方式。我不认为绝对需要将轮子添加到setuptools的setup_requires
(已弃用或接近它(或pyproject.toml
的build-system.requires
,这更像是一种(非常常见的准标准(便利。
现在,在你的情况下我该怎么办?
- 从包含kiwisolver的
requirements.txt
文件安装之前(直接或间接(,请确保pip是最新的,或明确安装wheel,并且:- 使用PyPI上已有wheels的Python版本
- 如果您想继续使用Python 3.5:
- 确保目标系统能够构建kiwisolver本身(可能需要C/C++编译器和其他一些本机库(