gpt4 book ai didi

c++ - 使用 handle<> 构造此对象时,如何从 C++ 中的 python 取回有效对象?

转载 作者:行者123 更新时间:2023-11-30 04:31:38 25 4
gpt4 key购买 nike

我想在 C++ 中分配一个缓冲区并将其作为 memoryview 对象提供给 python。为此,我使用 boost::python 公开了这个函数:

object* Allocator()
{
void* buff = my_alloc_function(char, size);
Py_buffer pybuffer;
int res = PyBuffer_FillInfo(&pybuffer, 0, buff, size, false, PyBUF_CONTIG);
if (res == -1)
return NULL;
handle<> obj_handle(borrowed(PyMemoryView_FromBuffer(&pybuffer)));
object obj = object(obj_handle);
return &obj;
}

一旦 python 对象的计数引用变为零,我还希望能够提供由 python 调用的 C++ 析构函数。我设法让 python 调用我的析构函数,并通过 Allocator() 获取返回的指针作为我的析构函数的参数。

如下,当前python调用的C++函数:

void Destructor()(object* pyMemoryView_object) const 
{
Py_buffer* py_buffer = PyMemoryView_GET_BUFFER(pyMemoryView_object);
my_free_function(py_buffer->buf);
PyBuffer_Release(py_buffer);
}

在调用析构函数之前一切似乎都很顺利......

我遇到的问题是 Py_buffer py_buffer 有一个有效的地址但包含废弃的成员(如调试器中的 0xcccccccc 所示)。

我的第一个问题是:

当此对象已使用句柄<> 构造并包装到 python 对象中时,如何从 python 取回 C++ 中的有效 Py_buffer 对象?

我的第二个问题是:

我是否必须调用 PyBuffer_Release(),因为它可以在调用 Destructor() 之后由 python 调用?

感谢您的帮助!

最佳答案

我设法让它工作。

这是这两个函数的代码(公开它们时没有返回策略):

PyObject* Allocator()
{
void* buff = my_alloc_function(char, size);
Py_buffer pybuffer;
int res = PyBuffer_FillInfo(&pybuffer, 0, buff, size, false, PyBUF_CONTIG);
if (res == -1)
return NULL;
return PyMemoryView_FromBuffer(&pybuffer);
}

void Destructor()(object pyMemoryView_object) const
{
Py_buffer* py_buffer = PyMemoryView_GET_BUFFER(pyMemoryView_object.ptr());
my_free_function(py_buffer->buf);
PyBuffer_Release(py_buffer);
}

我学到的重要一点是,在将对象返回给 python 时,使用 PyObject*

从 python 获取对象时,使用 object

关于c++ - 使用 handle<> 构造此对象时,如何从 C++ 中的 python 取回有效对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8123121/

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