【发布时间】:2020-05-05 17:33:28
【问题描述】:
简介
我有一个使用 boost.python 包从 c++ 调用的 python 代码。当像这样从 .py 调用 MyFunc 时,我可以传递一些变量:
Py_SetPythonHome(pySearchPath);
try
{
Py_Initialize();
numpy::initialize();
object module = import("__main__");
object name_space = module.attr("__dict__");
exec(python_full, name_space, name_space);
object MyFunc = name_space["MyFunc"];
object result = MyFunc(var1, var2, var3)); //HERE
//Python results storage
numpy::ndarray ret = extract<numpy::ndarray>(result);
int input_size = ret.shape(0);
std::vector<std::vector<double>> v(input_size, std::vector<double>(50));
}
catch (error_already_set)
{
PyErr_Print();
}
但是我需要另一个变量,我们称之为var4,基于C++ GUI,在我的python 代码的每个循环中进行更新。如果我理解正确MyFunc(var1, var2, var3) 在开始时只传递一次值,所以即使我在执行后更改var1 的值,它也不会影响python代码。
问题
有什么办法可以公开 c++ 变量,以便在 python 代码中“实时”更新?如果全部使用一种语言,这将是微不足道的(例如使用全局变量),但在两种环境的边缘,它变得很棘手。
编辑:
我试图像这样公开变量gui_cancel:
BOOST_PYTHON_MODULE(cbtest)
{
class_<callback_handler, boost::noncopyable>("callback_handler", no_init)
.def_readwrite("gui_cancel", &callback_handler::gui_cancel);
;
};
但是通过这种方式从 python 访问它:
import cbtest
holder = cbtest.callback_handler
print(holder.gui_cancel)
只给我对象的属性:
<property object at 0x0000012D9AA90BD8>
【问题讨论】:
-
按照你的写法,
cbtest.callback_handler是一个类,gui_cancel是它的数据成员。您需要先实例化此类,然后才能访问其非静态成员。既然你做到了no_init,你就需要在 C++ 端这样做。 |gui_cancel的数据类型是什么? -
TBH,而不是公开一个变量,我会采用 Jeremy Friesner 建议的方法(但没有所有低级的东西)。只需公开两个简单的包装函数,它们将获取和设置值。
标签: python c++ qt boost boost-python