如何使用SWIG在C ++中调用python函数?

时间:2015-03-28 05:44:49

标签: python c++ numpy swig armadillo

我有以下C ++

class myfun{
public:
    virtual double eval(arma::vec& x){};
};

double op(myfun* f, arma::vec& x){
    return f->eval(x);
}

其中arma::vec是一个armadillo c ++向量,我使用armanpy.i将一个numpy数组转换为arma :: vec对象,反之亦然。

启用swig director并为上述C ++代码创建SWIG接口后,我创建了一个python类,它重新定义了eval虚拟方法:

class f(mymodule.myfun):
    def __init__(self):
        super(f,self).__init__()
    def eval(self,x):
        print x
        return 3.14

在python中,我首先创建一个f的实例,它继承了myfun:

b = f()

然后,我将其传递给op

mymodule.op(b,array([3.,4.]))

输出

<Swig Object of type 'arma::vec *' at 0x10e6dcc30>
3.14

Python并没有将arma :: vec *解释为numpy数组,我认为它是在armanpy.i文件中进行的。有任何想法吗?我没有和arma :: vec结婚,我可以用numpy向量替换arma :: vec。

谢谢!

2 个答案:

答案 0 :(得分:0)

在您的情况下,请查看提供犰狳SWIG文件的armanpy

答案 1 :(得分:0)

您可以使用Github上的这个存储库来完成此任务,该存储库使用了armanpy和armadillo 8.500.1

https://github.com/Wolframm74/armadillo_armanpy/blob/master/README.md

按照以下步骤开始编译代码,然后在示例上进行构建。它具有如何通过SWIG将python的numpy数组转换为armadillo数组的示例。