通过 Boost Python 将 Python 函数转换为 C++,用作回调
Convert Python function to C++, via Boost Python, for use as a callback
一般来说,通过Boost-Python传递Python函数以供以后在C++代码中使用(即作为C++对象的回调(的推荐方法是什么?
更具体地说,我有一个C++类FooCPP
,我已经通过Boost-Python成功地向Python公开了;用户与在后台运行C++对应项的Python类Foo
进行交互。人为的例子:
# Foo.py
from foo_base import FooBase
class Foo(FooBase):
...
def callback(val=42.):
return val
foo = Foo()
foo.run(callback)
还有 Boost Python 绑定:
// foo_bindings.cpp
#include "foo.hpp"
#include <boost/python.hpp>
namespace bp = boost::python;
FooPython::Run(const bp::object& py_callback)
// TODO: Do something with the python callback to make it a C++ function!
std::function<double(double)> cpp_callback;
FooCPP::Run(cpp_callback);
)
BOOST_PYTHON_MODULE(foo_base){
bp::class_<FooPython>("FooBase")
.def("run", &FooPython::Run)
;
}
那么我该如何解决foo_bindings.cpp中的 TODO 评论呢?
我已经经历了许多相关的SO问题 - 例如传递python函数来提升c和发送py函数作为boost函数arg - 我熟悉Boost-Python文档,但没有找到一个好的解决方案/解释。提前感谢!
注释: C++11, boost v1.58.0, ubuntu 16.04
更新
我可能刚刚找到了一个解决方案,我可以在foo_bindings.cpp中实现一个函子,例如,
struct PythonCallback {
public:
PythonCallback(bp::object cb_func) : cb_func_(cb_func) {}
double operator() (const double& val) {
// Call the callback function in python
return cb_func_(val);
}
private:
bp::object cb_func_;
};
但是,FooCPP::Run
签名应该是什么? 即为传入的cpp_callback
定义了什么类型?
此回调函子是否需要更改BOOST_PYTHON_MODULE
代码?
在 foo_bindings.cpp 中实现一个函子,其中回调通过调用调用
:#include <boost/python.hpp>
#include <boost/python/call.hpp>
struct PythonCallback : {
public:
PythonCallback(PyObject* func) : cb_(func) {}
double operator() (const double& value) {
// Call the callback function in python
return boost::python::call<double>(cb_, value);
}
private:
PyObject* cb_;
};
相关文章:
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Pybind11:将元组列表从Python传递到C++
- 如何在c++中使用引用实现类似python的行为
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 递归列出所有目录中的C++与Python与Ruby的性能
- IPC使用多个管道和分支进程来运行Python程序
- 从python中调用C++函数并获取返回值
- Python 3.7 和 excess_args 的 SWIG 问题
- Python中的for循环与C++有何不同
- 使用Pybind11向Python公开Eigen::张量
- Python str to C++ to Python str
- 如何使用Python从C++中读取谷物序列化数据
- 如何在C++中使用pybind11加载一个pickle python列表
- 如何在c++中使用system()来运行包含空格的python脚本
- python集合的C++等价物是什么.计数器
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 从python调用openMP共享库时,未定义opnMP函数
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 如何将真正的字符串从python c-api转换为python脚本
- Python ctype 'c_char_p' Memory Leak