Как вернуть char ** из C ++ и заполнить его списком в Python, используя ctypes?

Я пытался вернуть массив строк из C ++ в Python следующим образом:

// c++ code
extern "C" char** queryTree(char* treename, float rad, int kn, char*name, char *hash){
//.... bunch of other manipulation using parameters...

int nbr = 3; // number of string I wish to pass
char **queryResult = (char **) malloc(nbr* sizeof(char**));
for (int j=0;j<nbr;j++){
queryResult[j] = (char *) malloc(strlen(results[j]->id)+1);
if(queryResult[j]){
strcpy(queryResult[j], "Hello"); // just a sample string "Hello"}
}
return queryResult;
}
// output in C++:
Hello
Hello
Hello

Ниже приведен код в Python:

libtest = ctypes.c_char_p * 3;
libtest = ctypes.CDLL('./imget.so').queryTree("trytreenew64", ctypes.c_float(16), ctypes.c_int(20), ctypes.c_char_p(filename), ctypes.c_char_p(hashval))
print libtest

вывод в Python является целым числом:

Я новичок в питоне. Я знаю, что я делаю что-то не так на стороне Python. Я смотрел на некоторые другие вопросы, где они передают символ *, но я не смог заставить его работать на символ **. Я пытаюсь часами. Любая помощь будет оценена.

19306416

0

Решение

ctypes doc говорит: «По умолчанию предполагается, что функции возвращают тип C int. Другие типы возвращаемых значений можно указать, установив атрибут restype объекта функции».

Это должно работать:

(отредактировано, чтобы добавить POINTER)

imget = ctypes.CDLL('./imget.so')
imget.queryTree.restype = ctypes.POINTER(ctypes.c_char_p * 3)
imget.queryTree.argtypes = (ctypes.c_char_p, ctypes.c_float, ctypes.c_int,
ctypes.c_char_p, ctypes.c_char_p)
libtest = imget.queryTree("trytreenew64",16, 20, filename, hashval)
5

Другие решения

Других решений пока нет …