现在我正在尝试使用Cython将C函数加载到Python中,类似于这里描述的内容:http://docs.cython.org/src/userguide/external_C_code.html。假设我的 C 文件称为 temp.c,我的 pxd 文件称为 decl.pxd,我的 pyx 文件称为 test.pyx。假设我有一个名为 temp.c 的函数int my_func(int spam)
:
cdef extern from "temp.c":
int my_func(int spam)
cdef int my_func(int spam)
然后我my_func导入test.pyx并尝试使用它:
from decl cimport my_func
my_func(1)
Cython 编译得很好,但是当我尝试使用 Python shell 导入从 test.pyx 构建的"test"模块时,它会抛出一个错误并说"符号my_func无法识别"。此外,当我查看由 Cython 编译器生成的 html 文件时,您可以在其中查看为 test.pyx 生成的 C 代码,my_func
的 C 文件中的代码不存在,这表明 Cython 一定找不到my_func
。
意识到我还没有详细介绍 temp.c 的样子,但是有没有办法调试为什么 Cython 显然无法找到my_func
的源代码?
请参阅 http://docs.cython.org/src/userguide/external_C_code.html#implementing-functions-in-c
请注意,它说cdef extern from "spam.c":
应该在 .pyx 中,cdef void order_spam(int tons)
在 .pxd 中。在您的情况下,您将两者放在 .pxd 中,这似乎是错误的。文档还声明函数必须是静态的。
作为后续,我通过将 temp.c 编译为 libtemp.so 来解决这个问题,然后按照这里的说明将 Cython 与 temp.h(这里的头文件)链接并 libtemp.so:
用 Cython 包装C++库