Python Cython需要什么设置?
我正在为一个带有一些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
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报告的吧@确实是拉特斯基;)