gpt4 book ai didi

Python C-API : Populate a Py_buffer from a C function

转载 作者:行者123 更新时间:2023-11-28 18:34:33 26 4
gpt4 key购买 nike

我真的很难弄清楚如何将大字节数据数组从 C 传递到任意 Python3 函数。作为引用,这里有一些关于该主题的文档链接:

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

文档中的大部分信息似乎都假设我正在将数据从 Python 传递到 C。我需要做相反的事情。我找到了对 API 函数 PyBuffer_FromContiguous 的引用——但它没有在任何地方记录(我可以找到)。函数原型(prototype)在这里:

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):

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...

…我真的很感激任何关于这些问题的线索。

最佳答案

问题是我没有找到适合我需要的正确 API 调用。这是解决此问题的调用(以防有人关心):Py_BuildValue 并在此处记录:

https://docs.python.org/3/extending/extending.html#building-arbitrary-values

关于Python C-API : Populate a Py_buffer from a C function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33747339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com