通过嵌入式调用 C++ 代码 Python
Calling C++ code via embedded Python
我已经成功创建了一个 Python 模块,它似乎可以独立工作,但不会影响正在 运行 运行它的程序。
我有以下模块:
BOOST_PYTHON_MODULE(mandala)
{
class_<state_mgr_t, state_mgr_t*, noncopyable>("states", no_init)
.def("push", &state_mgr_t::push)
.def("pop", &state_mgr_t::pop)
.def("count", &state_mgr_t::count);
scope().attr("states") = boost::python::object(boost::python::ptr(&states));
}
states
对象正在引用全局值,states
:
extern state_mgr_t states;
我可以 运行 我的程序中的以下脚本行:
from mandala import states
states.count()
> 0
所有这些都很好,但我 期望 运行 宁这个 python 脚本会影响程序的实际状态运行正在使用它。看起来 Python 实际上只是在处理它自己的 states
实例而不影响父程序。
现在我想知道我是否完全误解了 Boost.Python
的能力;我期待类似于 Lua 的东西,我可以在其中通过脚本修改 C++ 程序。
这不可能吗?还是我做错了什么?
提前致谢!
如果您要将 Python 嵌入到您的 C++ 程序中,应该可以从您的脚本访问该实例。显然,我没有你的完整代码,但你试过这样的事情吗?
PyImport_AppendInittab("mandala", &initmandala);
Py_Initialize();
try {
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
main_namespace.attr("states") = ptr(&states);
object ignored = exec("print states.count()", main_namespace);
} catch(const error_already_set&) {
PyErr_Print();
}
我已经成功创建了一个 Python 模块,它似乎可以独立工作,但不会影响正在 运行 运行它的程序。
我有以下模块:
BOOST_PYTHON_MODULE(mandala)
{
class_<state_mgr_t, state_mgr_t*, noncopyable>("states", no_init)
.def("push", &state_mgr_t::push)
.def("pop", &state_mgr_t::pop)
.def("count", &state_mgr_t::count);
scope().attr("states") = boost::python::object(boost::python::ptr(&states));
}
states
对象正在引用全局值,states
:
extern state_mgr_t states;
我可以 运行 我的程序中的以下脚本行:
from mandala import states
states.count()
> 0
所有这些都很好,但我 期望 运行 宁这个 python 脚本会影响程序的实际状态运行正在使用它。看起来 Python 实际上只是在处理它自己的 states
实例而不影响父程序。
现在我想知道我是否完全误解了 Boost.Python
的能力;我期待类似于 Lua 的东西,我可以在其中通过脚本修改 C++ 程序。
这不可能吗?还是我做错了什么?
提前致谢!
如果您要将 Python 嵌入到您的 C++ 程序中,应该可以从您的脚本访问该实例。显然,我没有你的完整代码,但你试过这样的事情吗?
PyImport_AppendInittab("mandala", &initmandala);
Py_Initialize();
try {
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
main_namespace.attr("states") = ptr(&states);
object ignored = exec("print states.count()", main_namespace);
} catch(const error_already_set&) {
PyErr_Print();
}