Python C-API: 从C函数填充Py_buffer
我现在遇到一个很大的难题,就是怎么把一大堆字节数据从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
,我该怎么把它和一个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 个回答
1
问题在于我没有找到适合我需求的API调用。这里有一个解决这个问题的调用(如果有人感兴趣的话):Py_BuildValue
,相关的文档可以在这里找到:
https://docs.python.org/3/extending/extending.html#building-arbitrary-values