【问题标题】:How to make cython a requirement for a pip install?如何使 cython 成为 pip 安装的要求?
【发布时间】:2019-08-31 02:37:38
【问题描述】:

创建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 部分之前导入的,当尝试从 pypi 下载的源(而不是从轮子)通过 pip 安装此软件包时,由于未安装而无法安装可以导入cython,因为还没有达到要求的部分。

我想知道如何确保从pypi 安装此软件包的pip 将在尝试导入之前安装cython。添加requirements.txtcython 似乎不会为从pypi 下载的文件添加自动安装要求。

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

【问题讨论】:

    标签: pip pypi


    【解决方案1】:

    您所描述的是“构建时间依赖性”,而这正是为“PEP 518 -- Specifying Minimum Build System Requirements for Python Projects”创建的用例。

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

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

    然后,当使用现代版本的 pip(或其他 PEP 518 兼容安装程序)安装您的软件包时,cython 将在您的 setup.py 脚​​本运行之前安装到构建环境中。

    【讨论】:

    • 我看到默认情况下,python setup.py sdist 没有将文件包含到包中 - 是否需要将其添加到 MANIFEST.in 或者它对@生成的包文件有一些影响987654330@ 或 distutils?
    • 您还需要在您的setup.py 文件中使用setuptools。 PEP 518 支持尚未(也可能不会)添加到 distutils
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2012-01-11
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多