传递包含3个int的数组的Python CTypes结构时中止

时间:2015-11-06 09:34:12

标签: python c ctypes abort

我在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,则没有任何区别。

这次中止的原因是什么?我该如何解决?感谢。

1 个答案:

答案 0 :(得分:0)

这似乎是libffi中的一个错误(这是ctypes使用的)只会发生,如果你按值传递一个struct并且该结构长度在9-16个字节之间:https://bugs.python.org/issue22273

我能在python 2.7上重现这一点。尝试增加结构的大小或使用方法的指针参数。

不幸的是,直到现在这似乎都没有修复