我在Kubuntu Trusty 64位上运行Python 3.4.0-0ubuntu2。
当我试图为我的其他相关(但不重复)question找到一个最小的例子时,我发现使用Python CTypes的以下明显琐碎的代码在调用{{1}时会导致SIGABRT
}}。 (请注意,在另一种情况下,fn1
工作正常,只有fn1
无法正常工作且信号为fn2
。)
lib.c:
SIGSEGV
main.py:
#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;
}
生成文件:
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
,则没有任何区别。
这次中止的原因是什么?我该如何解决?感谢。
答案 0 :(得分:0)
这似乎是libffi中的一个错误(这是ctypes使用的)只会发生,如果你按值传递一个struct并且该结构长度在9-16个字节之间:https://bugs.python.org/issue22273
我能在python 2.7上重现这一点。尝试增加结构的大小或使用方法的指针参数。
不幸的是,直到现在这似乎都没有修复