我正在setup.py
使用一些Cython扩展模块为项目创建文件。
我已经使这个工作了:
from setuptools import setup, Extension
from Cython.Build import cythonize
setup(
name=...,
...,
ext_modules=cythonize([ ... ]),
)
这安装很好。但是,这假定安装了Cython。如果未安装怎么办?我了解这是该setup_requires
参数的用途:
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
正确的方法是什么?我Cython
只setup_requires
需要Cython
在步骤运行后以某种方式导入,但是我需要为了指定ext_modules
值。
您必须包裹from Cython.Build import cythonize
在一个try- except
,而在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)
编辑
如评论中所述,setuptools处理完缺少的依赖关系后,将不会重新加载Cython。我以前没想过,但是您也可以尝试采用后期绑定方法来解决问题cythonize
问题内容: 我正在尝试研究如何使用cython来加快涉及我定义的类中完成的集成的计算。我试图更好地了解cython如何与用户定义的python类一起工作。我想了解更多有关为什么发生以下描述的错误的信息。 我在名为的文件中有以下cython代码 它显示了从班级内调用的三种方式 使用在类外部定义的cython被积函数:(确定!) 使用在类内部定义的cython被积函数:(产生错误) 将在类内部定义的c
问题内容: (为什么/什么时候)最好用于索引?在我刚刚找到的文档中 ->这是否总是在索引NumPy / Cython时应始终使用-数组/视图? ->例如,这样我就不能使用 问题答案: 已签名。请参阅PEP 353,其中说: “引入了一个新类型Py_ssize_t,其大小与编译器的size_t类型相同,但已签名。如果可用,它将是ssize_t的typedef。” 您应该使用索引。我在Cython文档
我试图使用liner_profiler库在jupyter笔记本与cython函数。它只工作了一半。我得到的结果只包括函数的第一行,没有分析结果。 对于分析结果,int onlt显示一行代码
我正在寻找合并一些cython来加速我的代码。我在Jupyter中运行cython代码时遇到问题。 牢房1: 单元格2: 错误: 但如果我这样做,效果很好。 看起来cdef在Jupyter中的使用方式不同,我如何在Jupyter笔记本中使用cdef?
准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而Cython有专门的“编译器”先将 Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块。
我试图包装两个C++类:Cluster和ClusterTree。ClusterTree有一个方法get_current_cluster(),它实例化一个集群对象,并返回对它的引用。ClusterTree拥有集群对象,并在C++中管理其创建和删除。 我用cython包装了Cluster,生成了PyCluster。 PyCluster应该有两种创建方式: 1)通过传入两个数组,这意味着Python应该