我有一个动态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是返回指针的样子
答案 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