几年前,我不得不为C库创建一个python包装器。我对C的了解非常有限,但我设法创造了所需要的东西。 突然有一种方法开始引发问题,我唯一的猜测是它必须用python update做一些事情。
无论如何,我有以下C代码:
const char * myFunction()
{
return "My String";
}
DLL_EXPORT const char*
test()
{
return myFunction();
}
在我的Python包装器中使用以下方法调用:
def test(self):
ret = self.lib.test()
return c_char_p(ret).value
如前所述,这种方法运作良好,但我并不确定为什么在尝试修复时我最近发现了什么。
目前,我正在获得“Seg Fault'从python调用方法test()。
使用此主题:
ctypes return a string from c function
When to use malloc for char pointers
我设法修复了现在看起来像这样的代码,c:
const char * myFunction()
{
return "My String";
}
DLL_EXPORT const char*
test()
{
const char* st = myFunction();
char *bar = _strdup(st);
return bar;
}
python代码保持不变。如前所述,我对C的了解非常有限,因此很少有问题:
答案 0 :(得分:1)
您使用的是64位Python吗?返回类型self.lib.test
默认为c_int
,即32位。如果指针是64位,则截断指针。
您可能只是在代码更改中感到幸运,_strdup
位于内存中的4GB以下。
如果您声明:
self.lib.test.restype = c_char_p
那么这应该有效:
def test(self):
ret = self.lib.test()
return ret.value