【发布时间】:2014-11-08 18:44:49
【问题描述】:
我正在尝试使用 Boost.Python 在 python 中公开 eigen3。
我找不到暴露functionunaryExpr (const CustomUnaryOp &func=CustomUnaryOp())的方法
我想要的是能让我做这样的事情:
蟒蛇
import libMatrix as mat
a = mat.Matrix(10, 10)
mat.unary_expr( lambda x : 1)
你有什么想法吗?它可能看起来像这样:
void unary_expr(Matrix const& self, PyObject* callable_object)
{
cpp_callable = ??(callable_object)
self.unaryEpxr(cpp_callable);
}
=== 我试过的:========================================= ==
1) 我尝试使用简单的回调定义
typedef double(*UnaryExprType)(double);
void unary_expr(Matrix const& self, UnaryExprType a);
{
self.unaryEpxr( a );
}
但 boost 不会将 python 函数转换为 UnaryExprType。
2)我试过implement a structPythonCallBack,但是还是不行,我得到了python签名与c++签名不匹配的错误。
struct PythonCallBackBase
{
public:
virtual ~PythonCallBackBase() {}
virtual double operator() (double const & x) { return 0; }
};
struct PythonCallBack : PythonCallBackBase, boost::python::wrapper<PythonCallBackBase>
{
public:
typedef boost::python::wrapper<PythonCallBackBase> wrap;
double default_op(double const & x)
{
return 0;
}
double operator() (double const & x)
{
if (boost::python::override f = wrap::get_override("__call__"))
return f(x);
return PythonCallBackBase::operator ()(x);
}
};
void unary_expr(Matrix const& self, PythonCallBack a)
{
self.unaryEpxr( a );
}
错误信息
ArgumentError: Python argument types in
Matrix.unary_expr(Matrix, Boost.Python.class)
did not match C++ signature:
unary_expr(Eigen::Matrix<double, -1, -1, 0, -1, -1>, PythonCallBack)
unary_expr(Eigen::Matrix<double, -1, -1, 0, -1, -1>, double (*)(double))
【问题讨论】:
标签: python c++ c boost boost-python