gpt4 book ai didi

python - 使用 Boost.Python 通过引用/指针将 C++ 对象传递给 Python 解释器

转载 作者:行者123 更新时间:2023-12-03 12:49:58 30 4
gpt4 key购买 nike

我有一个 C++ 对象,希望通过引用/指针将其传递给嵌入式 Python 解释器,以便 Python 可以对其进行更改,这些更改对 C++ 和 Python 都是可见的。我正在使用 Boost.Python 进行互操作。

作为示例,下面是一个 Foo 类、其 Boost.Python 包装器以及 C++ 中的 Foo 对象:

mymodule.h:

struct Foo
{
int bar;

Foo(int num): bar(num) {}
};

mymodule.cpp:

#include "mymodule.h"
#include <boost/python.hpp>

BOOST_PYTHON_MODULE(mymodule)
{
using namespace boost::python;

class_<Foo>("Foo", init<int>())
.def_readwrite("bar", &Foo::bar)
;
}

main.cpp:

#include <iostream>
#include <boost/python.hpp>
#include "mymodule.h"

using namespace boost::python;

int main()
{
Py_Initialize();

object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
import("mymodule");

Foo foo(42);

// ... somehow use Boost.Python to send reference to interpreter ...

object result = exec_file("myscript.py", main_namespace);

std::cout << foo.bar << std::endl;
}

那么如何将 foo 的引用发送到 Python,以便 C++ 和 Python 都可以看到其内容?

最佳答案

在 C++ 中,在运行脚本之前添加:

main_namespace["foo"] = ptr(&foo);

现在,Python 环境将有一个指向 C++ 变量 foo 的指针,并且 Python 脚本对其所做的任何更改都将在 C++ 对象而不是拷贝上执行。

如果myscript.py是:

foo.bar = 12

那么最后的cout行的输出将是12,而不是42

请注意,您可能希望将 foo 放置在 mymodule 命名空间中以 self 记录其来源,即 mymodule.foo.bar

Boost.Python 文档似乎没有描述这种传递指针的方法,但它仍然有效。

关于python - 使用 Boost.Python 通过引用/指针将 C++ 对象传递给 Python 解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035396/

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