我有一个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;
}
那么我如何向Python发送foo
的引用,以便C ++和Python都能看到它的内容?
答案 0 :(得分:0)
在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文档似乎没有描述这种传递指针的方法,但它仍然可以工作。