Вернуть структуру ctypes C обратно в C - PullRequest
2 голосов
/ 30 октября 2019

Я пытаюсь обернуть голову вокруг API ctypes. У меня есть структура C (zmsg_t), которую я хочу создать в Python, а затем вернуться из Python в C.

Таким образом, вызывается метод Python из C, и он должен вернуть объект, который мы затем обрабатываем в C снова.

У меня есть привязка для доступа и создания методов и структур C, поэтому в Python я могу вызывать конструктор Zmsg (). Теперь мне нужно вернуть это.

Мой метод тестирования python просто:

def actor_test(*args, **kwargs):
    print("test")
    msg = Zmsg()
    frame = Zframe(b"Hello", 5)
    msg.prepend(frame)
    return msg

метод вызывается из C следующим образом:

PyObject *pReturn = PyObject_CallObject(pFunc, NULL);

Это правильно вызывает метод. Однако возвращаемый объект - это, конечно, PyObject *. Отладчик говорит, что это

"<czmq._czmq_ctypes.Zmsg object at 0x7ffff5f18e50>"    PyObject
            [class]    "<class 'czmq._czmq_ctypes.Zmsg'>"   
            [super class]    "<class 'object'>"   
            [meta type]    "<class 'type'>"   
            ob_refcnt    1    Py_ssize_t

Как мне вернуть его к исходному типу C (zmsg_t *)

Любая помощь действительно ценится.

Определения ctypes дляZmsg можно увидеть здесь

1 Ответ

0 голосов
/ 31 октября 2019

Я бы попробовал использовать return byref(msg), выполнить кастинг C и следить за сборкой мусора. Но я обычно звоню с из процесса Python.

...