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);
В основном у меня есть два вопроса:
- Это правильный способ построить
Py_buffer
объект? Это даже правильный подход? - Однажды
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
и задокументировано здесь: