Расширение Python C передает аргументы по ссылке - PullRequest
4 голосов
/ 14 сентября 2011

Я пытаюсь написать оболочку Python C для функции (libFunc) с прототипом

libFunc(char**, int*, char*, int)

Как использовать PyArg_ParseTuple для настройки аргументов для вызова функции. Вот что у меня сейчас

#include <Python.h>

    PyObject* libFunc_py(PyObject* self, PyObject* args)
    {
        char* input;
        char** output;
        int inputlen;
        int* outputlen;

        PyArg_ParseTuple(args, "sisi" , output, outputlen, &input, &inputlen);


        int ret = libFunc(output, outlen, input, inputlen);


        return Py_BuildValue("i", ret);
    }

Я могу сделать то же самое с ctypes, используя byref.

1 Ответ

0 голосов
/ 14 сентября 2011

Я закончил тем же путем

#include <Python.h>

    PyObject* libFunc_py(PyObject* self, PyObject* args)
    {
        char* input;
        char* output;
        int inputlen;
        int outputlen;

        PyArg_ParseTuple(args, "s#" , &input, &inputlen);


        int ret = libFunc(&output, &outlen, input, inputlen);

        if (ret !=0)
        {
            Py_ErrSetString(PyExc_RunTimeError, "ErrorMessage");
            return NULL;
        }

        PyObject* retStr =  Py_BuildValue("s#", output,outputlen);

        if(output)
           free(output)

        return retStr;
    }
...