当前位置: 首页 > 面试题库 >

用Cython进行setup_requires吗?

阎坚成
2023-03-14
问题内容

我正在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

正确的方法是什么?我Cythonsetup_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有专门的&ldquo;编译器&rdquo;先将 Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块。

  • 我试图包装两个C++类:Cluster和ClusterTree。ClusterTree有一个方法get_current_cluster(),它实例化一个集群对象,并返回对它的引用。ClusterTree拥有集群对象,并在C++中管理其创建和删除。 我用cython包装了Cluster,生成了PyCluster。 PyCluster应该有两种创建方式: 1)通过传入两个数组,这意味着Python应该