【发布时间】:2017-04-12 14:16:17
【问题描述】:
我正在尝试使用 Cython 将 python 函数包装到 C++ api。我有 2 个模块 sam1.pyx 和 sam2.pyx
## - sam1.pyx
import sam2
cdef public double calc(double x, double y):
return sam2.calc_sub(x,y)
文件sam2.py的内容如下
## - sam2.py
def calc_sub(x, y):
return x*y
有了这样的结构,就生成了被包裹的sam1.h以及对应的sam1.so
在Cpp应用中使用过程中,
#include<iostream>
#include<Python.h>
#include"sam1.h"
using namespace std;
int main(){
Py_Initialize();
#if PY_MAJOR_VERSION < 3
initsam1();
#else
PyInit_sam1();
#endif
cout << "Starting Program!!"<<endl;
cout << calc(3, 5);
Py_Finalize();
return 0;
}
sam2.py(普通python)未导入,错误为
Exception NameError: "name 'sam2' is not defined" in 'sam1.calc' ignored
您能告诉我缺少什么吗?
【问题讨论】:
-
我认为因为函数
calc_sub是cdef,所以它应该是cimported。 (或者,如果您将calc_sub设为标准的def函数,那么您可能可以使用import它)。我没有尝试过你的代码,所以它可能有点复杂。 -
我在标准
def和普通import上遇到同样的错误,我已经上传了文件here -
如果我使用
cimport,程序会一直执行到另一个模块的函数被引用,然后它会抛出一个错误Segmentation fault (core dumped)。无论是否包含pxd文件