Python C-API: заполнить Py_buffer из функции C

Мне действительно трудно понять, как передать массив байтов данных из C в произвольную функцию Python3. Для справки, вот несколько ссылок на документацию по теме:

https://docs.python.org/3.5/extending/embedding.html

Большая часть информации в документации, кажется, предполагает, что я передаю данные из Python в C. Мне нужно сделать обратное. Я нашел ссылку на функцию API PyBuffer_FromContiguous - но это нигде не задокументировано (что я могу найти). Прототип функции находится здесь:

PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf,
                                        Py_ssize_t len, char order);

В основном у меня есть два вопроса:

  1. Это правильный способ построить Py_buffer объект? Это даже правильный подход?
  2. Однажды Py_buffer построен, как я могу связать Py_buffer с PyObject что может быть установлено на входной кортеж / аргумент для вызова функции Python?

Вот пример кода для того, что я пытаюсь (обновлен, чтобы включить data_s ЬурейеЕ):

typedef struct
{
  size_t size;
  unsigned char* data;
} data_s;

  // convert the arguments
  PyObject* pArgs;
  PyObject* pRes;
  Py_buffer* pBuf;
  pArgs = PyTuple_New((Py_ssize_t)num_args);
  if (num_args)
  {
    va_start(argp, num_args);
    for (i = 0; i < num_args; i++)
    {
      data_s* arg = va_arg(argp, data_s*);
      result = PyBuffer_FromContiguous(pBuf, arg->data, (Py_ssize_t)arg->size, 'C');
      if (result < 0)
      {
        fprintf(stderr, "Error: Unable to copy argument %d into python object\n", i);
        PY_DECREF(pArgs);
        break;
      }

      // set pValue, something like this?
      PyTuple_SetItem(pArgs, i, pBuf->obj);
    }
  }

  // run the function
  pRes = PyObject_CallObject(func_entry->pFunc, pArgs);

  // error checking... 

... Я был бы очень признателен за любые предложения по этим вопросам.

1 ответ

Проблема заключалась в том, что я не нашел правильный вызов API для того, что мне нужно. Вот вызов (на случай, если кому-то все равно), который решает эту проблему: Py_BuildValue и задокументировано здесь:

https://docs.python.org/3/extending/extending.html

Другие вопросы по тегам