如何使用boost.python跨模块使用类

How to use class across modules with boost.python?

本文关键字:模块 何使用 boost python      更新时间:2023-10-16

说我有两个模块,例如:

// A.cpp
class A{ /*... */};
BOOST_PYTHON_MODULE(A){
    boost::python::class_<A>("A")...
}
// B.cpp
#include "a.hpp"
int some_function(A a) { /* do something */ }
BOOST_PYTHON_MODULE(B){
    boost::python::def("some_function", some_function) ...
}

现在在Python中,我想:

import A
import B
a=A.A(...)
B.some_function(a)

但是,它提出了一个boost.python.argumenterror,表明该呼叫与C 签名不符。

那么,如何将C 类的实例传递给其他模块中定义的C 函数。

在模块B中公开some_function时,请使用boost :: python :: make_function。根据boost.python的文档,

创建一个python可呼叫对象,当从python调用时,将其参数转换为c 并调用f。

这确保参数转换为正确的C 类型。所以使用

boost::python::def("some_function", boost::python::make_function(&some_function))

而不是。