如何使 cython 成为 pip 安装的要求?

How to make cython a requirement for a pip install?

创建 Python 包并将其上传到 pypi 时,它会自动安装 install_requiressetup.py 文件中的要求,例如

from distutils.core import setup
setup(
  name = 'a_package',
  packages = ['a_package'],
  install_requires=['another_package']
)

当包有cython扩展(和.pyx文件而不是.c/.cpp文件)时,setup.py文件将需要导入cython来创建可安装的扩展,例如

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
  name = 'a_package',
  packages = ['a_package'],
  install_requires=['another_package'],
  cmdclass = {'build_ext': build_ext},
  ext_modules = [Extension('the_extension', sources=['a_file.pyx'])]
)

但是由于 Cython 是在执行 setup 部分之前导入的,因此当尝试通过 pip 从从 pypi 下载的源代码(而不是从 wheel)安装此包时,它将因无法导入而安装失败 cython,因为尚未达到要求的部分。

我想知道可以做些什么来确保 pippypi 安装此软件包将在尝试导入它之前安装 cython。添加带有 cythonrequirements.txt 似乎不会为从 pypi.

下载的文件添加自动安装要求

现在,我意识到在 pip install thispackage 之前 pip install cython 是可能的,但我想知道是否有更好的修复方法可以直接从 [=12] 安装包和 cython =] 当无法 运行 附加命令时(无需上传 .c. 文件并调整 setup.py 文件以使用它们而不是 .pyx)。

您所描述的是 "build time dependency",而这恰恰是为“PEP 518 -- Specifying Minimum Build System Requirements for Python Projects”创建的用例。

您可以通过添加 pyproject.toml 文件将 cython 指定为构建时依赖项,例如:

[build-system]
requires = ["cython"]

然后当使用 pip 的现代版本(或另一个 PEP 518 兼容安装程序)安装你的包时,cython 将在你的 setup.py 脚本被安装到构建环境之前运行.