如何使用 pybind11 引用 Python 来公开修改数据的 C++ 函数?

问题描述 投票:0回答:1

我正在使用 pybind11 创建 C++ 库的 Python 接口, 其中一个函数接收指向 char 数组的指针并更新其值, 问题是 char 数组的值在 C++ 代码中发生了更改,但从 C++ 函数调用返回后没有更改,如下代码所示。

int Copy_String::ModifyString(char* rxBuf)
{
    cout <<"***C++ Before copy***==>" << rxBuf << endl;
    strcpy(rxBuf, "Data to be copied");
    cout <<"***C++ After copy***==> "<< rxBuf << endl;
    return 0;
}

我使用以下 pybind11 代码将该函数公开给 Python:

PYBIND11_MODULE(copylib, m)
{
    m.doc() = "test modifying string passed by reference"; 
    py::class_<Copy_String>(m,"Copy_String")
        .def_static("ModifyString", &Copy_String::ModifyString," Modify String passed by reference");
}

并使用下面的python来测试它

import copylib as cp
class String:
    string="ABC"

obj = String()
print(obj.string)
cp.Copy_String.ModifyString(obj.string)
print(obj.string)

问题在于“obj.string”的值在C++代码中被接收和改变 但是当我在 python 中调用该函数后检查它时,我发现初始值没有被修改,如下代码所示。

ABC
***C++ Before copy***==>ABC
***C++ After copy***==> Data to be copied
ABC

我发现了一些其他的工作,建议实现一个 c++ 包装器或从 python 传递 ctype 变量。

如何从Python代码中通过引用传递对象到C++函数?

python c++ pass-by-reference pybind11
1个回答
1
投票

您无法修改 Python 字符串,因此您必须返回一个 new

str
对象。 (您可以通过将原始字符串复制到缓冲区中来完成此操作,然后由 C++ 函数修改该缓冲区,然后检查它的长度是否正确!) (从技术上讲,在 C/C++ 中,你可以修改 Python 字符串,但不能修改它的长度,如果你不小心使用它,它会破坏很多东西。)

© www.soinside.com 2019 - 2024. All rights reserved.