使用 Boost.Python 通过 reference/pointer 将 C++ 对象传递给 Python 解释器
Pass a C++ object by reference/pointer to Python interpreter using Boost.Python
我有一个 C++ 对象,希望通过 reference/pointer 将其传递给嵌入式 Python 解释器,以便 Python 可以对其进行更改,这对 C++ 和 Python。我正在使用 Boost.Python 进行互操作。
例如,这里有一个 class Foo
、它的 Boost.Python 包装器和一个 Foo
C++ 对象:
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-document 其来源,即 mymodule.foo.bar
.
Boost.Python 文档似乎没有描述 pass-by-pointer 的这种方法,但它仍然有效。
我有一个 C++ 对象,希望通过 reference/pointer 将其传递给嵌入式 Python 解释器,以便 Python 可以对其进行更改,这对 C++ 和 Python。我正在使用 Boost.Python 进行互操作。
例如,这里有一个 class Foo
、它的 Boost.Python 包装器和一个 Foo
C++ 对象:
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-document 其来源,即 mymodule.foo.bar
.
Boost.Python 文档似乎没有描述 pass-by-pointer 的这种方法,但它仍然有效。