我刚开始熟悉Cython,尝试将C库中的一些结构包装到Python方法和类中。我不明白的是如何从(初始化的)C结构转换为相应的Python类。缺少什么我在这里: 将Cython结构中的C结构转换为Python类
struct test_struct {
int _something;
complex_struct* _another;
};
typedef struct test_struct test;
test *test_new(void);
int some_method(test **n, int irrelevant);
对应的摘录从我.pxd:
cdef struct test_struct:
pass
ctypedef test_struct test
test* test_new()
int some_method(test **n, int irrelevant)
我.pyx:
def do_something(int irrelevant):
cdef test* t = test_new()
ret = some_method(&t, irrelevant)
# Here comes the problem...
return <Test?>t
cdef class Test:
cdef test* _t
# cinit here and some methods here. No members except _t
一个从C头文件片段
一切都取决于返回s代理工作正常。我在ret
等中得到了一个正确的值。但是在return语句中强制转换似乎不正确或缺少更多信息。发行t = do_something(42)
Python段错误。
的段错误本身是不是所有有帮助:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a9e74b in internal_print() from /usr/lib/libpython2.7.so.1.0
(gdb) bt
#0 0x00007ffff7a9e74b in internal_print() from /usr/lib/libpython2.7.so.1.0
#1 0x00007ffff7a81adb in PyFile_WriteObject() from /usr/lib/libpython2.7.so.1.0
#2 0x00007ffff7b19acb in sys_displayhook() from /usr/lib/libpython2.7.so.1.0
#3 0x00007ffff7a64c23 in PyObject_Call() from /usr/lib/libpython2.7.so.1.0
#4 0x00007ffff7af2ff7 in PyEval_CallObjectWithKeywords() from /usr/lib/libpython2.7.so.1.0
#5 0x00007ffff7af6f3b in PyEval_EvalFrameEx() from /usr/lib/libpython2.7.so.1.0
#6 0x00007ffff7af91b0 in PyEval_EvalCodeEx() from /usr/lib/libpython2.7.so.1.0
#7 0x00007ffff7af92b2 in PyEval_EvalCode() from /usr/lib/libpython2.7.so.1.0
#8 0x00007ffff7b11f9f in run_mod() from /usr/lib/libpython2.7.so.1.0
#9 0x00007ffff7b13ec0 in PyRun_InteractiveOneFlags() from /usr/lib/libpython2.7.so.1.0
#10 0x00007ffff7b140ae in PyRun_InteractiveLoopFlags() from /usr/lib/libpython2.7.so.1.0
#11 0x00007ffff7b1470e in PyRun_AnyFileExFlags() from /usr/lib/libpython2.7.so.1.0
#12 0x00007ffff7b24bcf in Py_Main() from /usr/lib/libpython2.7.so.1.0
#13 0x00007ffff746f000 in __libc_start_main() from /usr/lib/libc.so.6
#14 0x000000000040073e in _start()
正如你所看到的,do_something
方法应该返回类型测试的Python对象。我需要添加什么才能使演员成功?我是否需要手动将结构映射到Python类?我可以使用一些Cython魔法吗?
你不想投的结构。你想*创建一个'Test'实例,并用'struct'初始化它。我假设你已经尝试过:'返回Test(t)'[或者你的初始化程序拥有的任何签名]。 – Bakuriu