如何在 Cythonize() 上使用 annotate=True

Posted

技术标签:

【中文标题】如何在 Cythonize() 上使用 annotate=True【英文标题】:How to use annotate=True on Cythonize() 【发布时间】:2019-11-17 14:08:22 【问题描述】:

我是 Cython 的新手,但通过关注此 basic guide from the official docs 使其正常工作:

它说的是: “Cython 有一种方法可以可视化与 Python 对象和 Python 的 C-API 进行交互的位置。为此,请将 annotate=True 参数传递给 cythonize()。它会生成一个 html 文件。”

我很惊讶我不能只用谷歌搜索这个,或者 *** 上没有人问过这个问题。但我不知道如何让它工作。它没有具体显示它想要什么。所以我尝试了最明显的语法(在 Setup.py 中):

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("gpcython.pyx", annotate=True)
)

虽然这不会引发错误,但我也没有看到任何 HTML 正在生成。

我在 Windows 上使用最新版本的 Python 3.7 和 Cython 0.29.12。

https://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html

【问题讨论】:

这可能是因为没有构建任何内容:遗憾的是更改 setup.py 不会导致完全重建。需要添加--force,即python setup.py build_ext --inplace --force,那么pyx-file旁边就是html。 很确定这不是问题。我确实注意到了这一点(感谢 --force 开关!)但我刚刚删除了构建并且它重新开始。结果相同。没有 HTML。 我尝试添加:import Cython.Compiler.Options Cython.Compiler.Options.annotate = True 没有效果 github.com/cython/cython/issues/3036 setup.py --force 对我不起作用。但是,删除生成的 out.c 文件会使创建 .html 文件的 annotate=True 工作。 【参考方案1】:

这是我最终使用的,现在似乎有效的方法:

from distutils.core import setup
from Cython.Build import cythonize

import Cython.Compiler.Options
Cython.Compiler.Options.annotate = True

setup(
    ext_modules = cythonize("gpcython.pyx", annotate=True)
)

【讨论】:

【参考方案2】:

您可以尝试删除生成的 c 或 cpp 文件。如果 pyx 没有变化,cython 不会尝试重复构建。我不知道 cython 如何跟踪构建依赖项。我想这类似于make 的工作方式。

【讨论】:

【参考方案3】:

也许晚了,但我解决了这个问题,如下所示:

更改.pyx 源文件或删除.c 文件并再次运行setup.py 以强制cython 再次重建它。

--force 参数可能不起作用。

【讨论】:

以上是关于如何在 Cythonize() 上使用 annotate=True的主要内容,如果未能解决你的问题,请参考以下文章

报错解决方案:ERROR: Cython.Build.cythonize not found.

如何在Google Annotated Timeline上使用范围更改()来仅获取所选范围的数据?

几个 .pyx 的 Cython setup.py

JAVA-Spring注解实现AOP权限拦截,如何取得方法上自定义Annotation的值呢?

Spring:使用Spring AOP时,如何获取目标方法上的注解

如何手动编译使用 C++ 的 Cython 代码?