【问题标题】:Pass a C++ object by reference/pointer to Python interpreter using Boost.Python使用 Boost.Python 通过引用/指针将 C++ 对象传递给 Python 解释器
【发布时间】:2017-02-04 01:06:49
【问题描述】:

我有一个 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 都能看到它的内容?

【问题讨论】:

    标签: python c++ boost boost-python


    【解决方案1】:

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

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

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

    如果myscript.py 是:

    foo.bar = 12
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2019-09-16
      • 2014-05-06
      • 2017-11-12
      • 1970-01-01
      • 2017-04-05
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多