使用Cython进行setup_requires?

Cla*_*diu 23 python software-distribution build setuptools cython

我正在setup.py为一个带有一些Cython扩展模块的项目创建一个文件.

我已经让这个工作了:

from setuptools import setup, Extension
from Cython.Build import cythonize

setup(
    name=...,
    ...,
    ext_modules=cythonize([ ... ]),
)
Run Code Online (Sandbox Code Playgroud)

安装很好.但是,这假设已安装Cython.如果没有安装怎么办?我知道这是setup_requires参数的用途:

from setuptools import setup, Extension
from Cython.Build import cythonize

setup(
    name=...,
    ...,
    setup_requires=['Cython'],
    ...,
    ext_modules=cythonize([ ... ]),
)
Run Code Online (Sandbox Code Playgroud)

但是,如果尚未安装Cython,这当然会失败:

$ python setup.py install
Traceback (most recent call last):
  File "setup.py", line 2, in <module>
    from Cython.Build import cythonize
ImportError: No module named Cython.Build
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?我Cythonsetup_requires需要Cython在步骤运行后以某种方式导入,但我需要为了指定ext_modules值.

rut*_*sky 26

从开始18.0发布setuptools(发布于2015年6月23日),可以指定Cythonsetup_requires并通过*.pyx定期模块来源setuptools.Extension:

from setuptools import setup, Extension


setup(
    # ...
    setup_requires=[
        # Setuptools 18.0 properly handles Cython extensions.
        'setuptools>=18.0',
        'cython',
    ],
    ext_modules=[
        Extension(
            'mylib',
            sources=['src/mylib.pyx'],
        ),
    ],
)
Run Code Online (Sandbox Code Playgroud)

  • 你确定它有效吗?我尝试使用Python 3.5,setuptools 39.0.1.如果未安装cython,则会出错:未知文件类型'.pyx' (2认同)

mob*_*ein 5

您必须将from Cython.Build import cythonizein try-except和in中except定义cythonize为虚拟函数.这样可以加载脚本而不会失败ImportError.

然后在setup_requires处理参数时,Cython将安装并重新执行安装脚本.从那时起Cython安装,您将能够成功导入cythonize

try:
    from Cython.Build import cythonize
except ImportError:
     def cythonize(*args, **kwargs):
         from Cython.Build import cythonize
         return cythonize(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

编辑

如注释中所述,在setuptools处理缺少的依赖项之后,它将不会重新加载Cython.我以前没想过,但你也可以尝试一种后期绑定的方法来剔除cythonize