0

次のプロトタイプを持つ関数がある動的 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 行目

印刷[0]

TypeError: 'int' オブジェクトには属性 '_ _ getitem _ _' がありません

Pythonで物事を進めるための助けは、非常に高く評価されています.

PS : サンプルCコードで foo("a.bcd.ef") の機能をクロス チェックしまし。リターン ポインターは次のようになります。

4

1 に答える 1

3

欠落している手順は、引数戻り値のタイプを定義することfooです。

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
于 2012-08-23T02:05:21.407 に答える