![](/img/trans.png)
[英]Boost.Python C++ object reference in Python: unexpected behaviour
[英]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.