Python — приведение ctypes c_void_p к выходному параметру C

сначала я знаю о Python ctypes, передать c_void_p в качестве параметра out в функцию c и их предложенное решение, НО я не смог заставить это работать, с их ответом. Моя проблема в любом случае похожа …

У меня есть функция C, которую я хочу обернуть Python, используя ctypes. Он принимает

error_t foo(int a,void ** bar)

с bar в качестве выходного параметра.

Мой Python ctypes выглядит так, как описано в связанной ветке:

bar = c_void_p()
foo(guids, byref(bar))

Я НЕ знаю, что я делаю не так или иначе … я вроде не в курсе …

Выход по типу bar всегда просто отображает:

c_void_p(None)

спасибо за любую помощь или идеи …

1

Решение

Следующие:

import os
file=open("/tmp/1.c","w")
# you didn't provide the implementation of foo (why?) so i needed to write it myself
file.write(
"typedef int error_t;""error_t foo(int a,void ** bar) {""       *bar = a;""       return a * 2;""}")
file.close()
os.system("gcc -Wno-int-conversion -shared -o /tmp/lib1.so.1 /tmp/1.c")

import ctypes
lib1 = ctypes.cdll.LoadLibrary("/tmp/lib1.so.1")
guids = 1000

# the code you provided us
bar = ctypes.c_void_p()
ret = lib1.foo(guids, ctypes.byref(bar))
# end of the code you provided us

print("foo(" + str(guids) + ", " + str(ctypes.byref(bar)) + ") = " + str(ret))
print("And bar has the value: " +  str(bar));

Распечатывает:

foo(1000, <cparam 'P' (0x7ffa3414ee68)>) = 2000
And bar has the value: c_void_p(1000)

Скрипт компилирует в общую библиотеку простую программу на C:

typedef int error_t;
error_t foo(int a,void ** bar) {
*bar = a;
return a * 2;
}

Затем запускает функцию, используя ctypes из python.
Как и ожидалось зовет foo(1000, ...) возвращенный 2000 и установите значение void *bar в 1000, Итак, вызов Python, который вы делаете, в порядке, проверьте функцию. Вероятно, ваш foo() установить значение bar в NULL,

0

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

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

По вопросам рекламы [email protected]