C方法通过ctypes将字符串返回给Python

时间:2018-03-10 11:24:14

标签: python c ctypes

几年前,我不得不为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的了解非常有限,因此很少有问题:

  1. 任何想法为什么旧的实现工作并突然停止?是否有一些可能影响它的python更新?
  2. 为什么在我的c test()函数中我必须执行_strdup(st)并返回bar而不是简单地返回st?

1 个答案:

答案 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