我正在尝试将一个Cython类嵌入到一个C++类中。由于项目的限制,无法为该C++类创建一个Cython包装器。另外,由于Cython类的方法数量和长时间继承,从一个类中完全删除该方法并不是一个有吸引力的解决方案。我需要创建一个Cython类实例并从C++中调用其方法,但似乎无法避免segfault错误。以下是该问题的示例代码:
我使用
<<< 文件: fooClass.pyx >>>
from math import sin
cdef public class Foo[object Foo, type fooType]:
cdef double a,b
def __cinit__(self, double a, double b):
self.a = a
self.b = b
cdef double bar(self, double c):
return sin(self.a*c)
cdef api double foobar(Foo foo, double d):
return foo.bar(d)
<<<文件: Foo.cpp>>>
#include "fooClass_api.h"
#include <iostream>
int main(){
Py_Initialize();
import_fooClass();
Foo foo;
foo.a = 1.0;
foo.b = 10.0;
std::cout << foobar(&foo,5.0) << "\n";
Py_Finalize();
}
<<< File: setup.py >>>
from distutils.core import setup
from Cython.Build import cythonize
setup ( ext_modules = cythonize ("cyClass.pyx"))
我使用
python setup.py build_ext --inplace
进行构建,并使用 g++ 进行编译。测试后发现,Py_Initialize()
和 import_fooClass
调用成功。我知道在 foobar()
中可以打印出 foo.a
和 foo.b
的值,但是一旦我在 foobar()
中使用 Foo
对象进行调用,程序就会崩溃。即使在 foobar()
中调用 foo.__dict__
或者 foo.callable()
也会导致崩溃。更改关键字 public
或者 api
都没有效果,而且在 __init__
和 __cinit__
之间切换也没有用。如果有人知道如何解决这个问题,我将非常感激。我怀疑这与指针或误用 Python C API 有关。非常感谢!
<something>vtab<something>
,它从未被设置,例如(请参见“FooClass.h”)。我认为您需要一个返回Foo
的capi函数。然而,对于我来说仍然无法消除分段错误,并且我不能立即看出需要修复什么... - DavidW