使用 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&lt;int&gt; 等数据传递给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++的主要内容,如果未能解决你的问题,请参考以下文章

boost::python 和回调驱动的执行

从 Python 将不透明数据传递给 C++ 回调

如何组织 python / Boost Python 项目

使用 boost::python 从 c++ 函数访问大表

使用 Boost::Python 从嵌入式 python 中提取数据

如何从 boost::python 返回 numpy.array?