我在Kubuntu Trusty 64位上运行Python 3.4.0-0ubuntu2。
当试图为我的其他相关(但不是重复的)的question找到一个最小的示例时,我发现下面使用Python CTypes的简单代码在调用SIGABRT
时会导致fn1
。(注意,在另一种情况下,fn1
工作正常,只有fn2
不工作,信号在那里SIGSEGV
。)
库c:
#include <stdio.h>
typedef struct {
int data[3];
} Triplet;
void fn1(Triplet t)
{
fprintf(stderr, "%d, %d, %d\n", t.data[0], t.data[1], t.data[2]);
}
Triplet fn2(Triplet t)
{
Triplet temp = {{t.data[0] + 1, t.data[1] + 1, t.data[2] + 1}};
return temp;
}
主.py:
from ctypes import *
Array3 = c_int * 3
class Triplet(Union):
_fields_ = [("data", Array3)]
_lib = CDLL("libuniontest.so")
_lib.fn1.argtypes = [Triplet]
_lib.fn2.restype = Triplet
_lib.fn2.argtypes = [Triplet]
t = Triplet(Array3(99, 129, 39))
_lib.fn1(t) # this causes segfault
tt = _lib.fn2(t)
print(tuple(tt.data))
生成文件:
test:
$(CC) -fPIC -shared -o libuniontest.so lib.c
sudo cp libuniontest.so /usr/local/lib/
sudo ldconfig
python3 main.py
如果我把
Union
改成Structure
也没什么区别。中止的原因是什么?我该如何解决?谢谢。
最佳答案
这似乎是libffi(ctypes使用的)中的一个bug,只有在按值传递结构并且该结构的长度介于9-16字节之间时才会发生:https://bugs.python.org/issue22273
我能够在Python2.7上重现这一点。请尝试增大结构的大小或对方法使用指针参数。
不幸的是,直到现在这个问题似乎还没有解决