Python Cython需要什么设置?

Python Cython需要什么设置?,python,build,cython,setuptools,software-distribution,Python,Build,Cython,Setuptools,Software Distribution,我正在为一个带有一些Cython扩展模块的项目创建一个setup.py文件 我已经让它工作了: from setuptools import setup, Extension from Cython.Build import cythonize setup( name=..., ..., ext_modules=cythonize([ ... ]), ) 这个安装很好。但是,这假设Cython已安装。如果没有安装呢?我知道这是设置\u所需的参数的用途: from se

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

我已经让它工作了:

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

setup(
    name=...,
    ...,
    ext_modules=cythonize([ ... ]),
)
这个安装很好。但是,这假设Cython已安装。如果没有安装呢?我知道这是
设置\u所需的
参数的用途:

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

setup(
    name=...,
    ...,
    setup_requires=['Cython'],
    ...,
    ext_modules=cythonize([ ... ]),
)
但是,如果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
$python setup.py安装
回溯(最近一次呼叫最后一次):
文件“setup.py”,第2行,在
从Cython.Build导入cythonize
ImportError:没有名为Cython.Build的模块

正确的方法是什么?我只需要在
设置所需的
步骤运行后以某种方式导入
Cython
,但我需要
Cython
,以便指定
ext\u模块的值。

您必须从Cython包装
。在
try except
中构建导入cythonize
,并在
except
中,将
cythonize
定义为伪函数。这样,可以使用
ImportError
加载脚本而不会失败

随后,当处理
setup\u 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)
编辑

如注释中所述,在setuptools处理缺少的依赖项之后,它不会重新加载Cython。我以前没有想到过,但您也可以尝试一种后期绑定方法,从发布
setuptools
(于2015-06-23发布)开始删除
cythonize

可以在
setup\u requires
中指定
Cython
,并为常规
setuptools传递
*.pyx
模块源。扩展名

try:
    from Cython.Build import cythonize
except ImportError:
     def cythonize(*args, **kwargs):
         from Cython.Build import cythonize
         return cythonize(*args, **kwargs)
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'],
        ),
    ],
)

在执行此处所述的实际
setup.py
(需要
pip
)之前,似乎还有第三种安装构建依赖项的方法:

实质上:

  • 创建包含以下内容的文件
    pyproject.toml
  • 使用
    pip install-e.
    进行设置

  • 这有点老套,但也很酷!我不知道脚本会被重新执行,这很有意义。嗯,如果我在没有先安装Cython的情况下安装,安装程序会工作(它会安装Cython),但扩展模块没有安装(无法从脚本导入)。你知道会发生什么吗?好奇。啊,好吧,它不能被真正地重新执行。我通常不需要安装
    Cython
    ,只需要开发。不要使用
    cythonize
    创建
    Extension
    实例,只需直接在
    Cython
    生成的.c文件上创建它们。检查这个例子,我应该澄清,在这种情况下,您还需要确保在分发版的清单文件中包含.h、.pyx、pxd和.c文件。哦,嗯,这不是一个坏主意。我会让它在脑子里飘一会儿。回答得好,谢谢!如果Cython文件是预先编译的,setup.py中使用了.c文件,这意味着不需要Cython来构建软件包,那么您更喜欢这种方法吗?@Martinsos假设Cython可以使用setuptools安装在所有目标平台上(应该,但总会有例外),使用指定的方法消除了在库部署期间生成这些.c文件而不丢失任何东西的麻烦,所以是的,我建议使用这种方法。唯一的例外是,如果此过程不起作用,例如,如果您使用非常旧的setuptools作为目标系统,默认情况下我不会这样做。您确定它能起作用吗?我尝试了Python 3.5、setuptools 39.0.1。如果cython没有安装,它会给出错误:未知文件类型“.pyx”@Labo我想您是因为上述问题打开了这个bug报告的吧@确实是拉特斯基;)