使用 boost::python 将回调从 python 传递到 c++
Posted
技术标签:
【中文标题】使用 boost::python 将回调从 python 传递到 c++【英文标题】:pass callback from python to c++ using boost::python 【发布时间】:2011-08-26 12:32:19 【问题描述】:我想将我的 python 代码中的回调传递给 c++
我希望我的代码看起来像这样: 在 C++ 中:
typedef void (*MyCallback_t) (CallbackInfo);
class MyClass
...
void setcallback(MyCallback_t cb);
...
并在 python 中使用它:
import mylib
def myCallback(mylib_CallbackInfo):
...
t = mylib.MyClass()
t.setcallback(myCallback)
我在我的问题附近看到了一些主题,但无法解决
例如这里: Realtime processing and callbacks with Python and C++ 建议使用 boost::python 并警告有关 GLI,但没有示例。 还有这里
How to call a python function from a foreign language thread (C++)没有关于python代码部分和“BOOST_PYTHON_MODULE”部分的完整描述
我还在 Boost python howto 中找到了使用 py_boost_function.hpp 的链接,但它没有编译,实际上我无法理解如何使用它。
【问题讨论】:
+1 很好的问题。正是我想要的! 【参考方案1】:好的,我仍在尝试解决这个问题,但到目前为止,这对我有用:
#this is the variable that will hold a reference to the python function
PyObject *py_callback;
#the following function will invoked from python to populate the call back reference
PyObject *set_py_callback(PyObject *callable)
py_callback = callable; /* Remember new callback */
return Py_None;
...
#Initialize and acquire the global interpreter lock
PyEval_InitThreads();
#Ensure that the current thread is ready to call the Python C API
PyGILState_STATE state = PyGILState_Ensure();
#invoke the python function
boost::python::call<void>(py_callback);
#release the global interpreter lock so other threads can resume execution
PyGILState_Release(state);
python 函数从 C++ 调用,并按预期执行。
【讨论】:
是的,我做的和你一模一样。但是忘记在这里写了。 本例中是否缺少引用计数? 如何将vector<int>
等数据传递给python 回调?
我对这个问题很感兴趣。您愿意详细说明这个答案吗?你能解释一下每一行代码的作用吗?
当然!自从我这样做以来已经有一段时间了,但我已经为你注释了每一行。谷歌搜索每个函数会找到更多文档。【参考方案2】:
这些来自 boost::python 源代码存储库的测试文件包含有关如何将回调从 Python 传递到 C++ 的精彩示例:
https://github.com/boostorg/python/blob/develop/test/callbacks.cpp https://github.com/boostorg/python/blob/develop/test/callbacks.py【讨论】:
欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.以上是关于使用 boost::python 将回调从 python 传递到 c++的主要内容,如果未能解决你的问题,请参考以下文章