如何使用python ctypes处理wchar_t **?

时间:2012-08-22 22:43:19

标签: python ctypes wchar-t

我有一个动态C库(比如 foo.so ),其中有一个具有以下原型的函数

wchar_t **foo(const char *);

/*
  The structure of the return value is a NULL terminated (wchar_t **),
  each of which is also NULL terminated (wchar_t *) strings
*/

现在我想使用 ctypes 模块从python通过此API调用该函数

以下是我尝试过的代码段:

from ctypes import *

lib = CDLL("foo.so")

text = c_char_p("a.bcd.ef")
ret = POINTER(c_wchar_p)
ret = lib.foo(text)
print ret[0]

但它显示以下错误:

  

追踪(最近一次呼叫最后一次):

     

文件“./src/test.py”,第8行,

     

print ret [0]

     

TypeError:'int'对象没有属性'_ _ getitem _ _'

任何有关使用python进行操作的帮助都非常明显。

P.S:我已经在示例 C 代码&中交叉检查了foo(“a.bcd.ef”)的功能。 this是返回指针的样子

1 个答案:

答案 0 :(得分:3)

缺少的步骤是定义foo的{​​{3}}和arguments

from ctypes import *
from itertools import takewhile

lib = CDLL("foo")
lib.foo.restype = POINTER(c_wchar_p)
lib.foo.argtypes = [c_char_p]

ret = lib.foo('a.bcd.ef')

# Iterate until None is found (equivalent to C NULL)
for s in takewhile(lambda x: x is not None,ret):
    print s

简单(Windows)测试DLL:

#include <stdlib.h>

__declspec(dllexport) wchar_t** foo(const char *x)
{
    static wchar_t* y[] = {L"ABC",L"DEF",L"GHI",NULL};
    return &y[0];
}

输出:

ABC
DEF
GHI