我很难弄清楚如何将大字节数据数组从 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
可以设置为输入元组/参数的 a 关联起来以调用 python 函数?
这是我正在尝试的代码示例(已更新以包含data_s
typedef):
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...
......我真的很感激在这些问题上的任何线索。