簡體   English   中英

使用Boost.Python通過引用/指針將C ++對象傳遞給Python解釋器

[英]Pass a C++ object by reference/pointer to Python interpreter using Boost.Python

我有一個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命名空間中,以自我記錄其來源,即mymodule.foo.bar

Boost.Python文檔似乎沒有描述這種通過指針的方法,但是仍然可以使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM