【发布时间】:2015-03-25 23:44:32
【问题描述】:
我的代码主要是 C++,但我想使用 SWIG 导向器选项在 python 中重新定义一个 C++ 虚函数,然后将该函数传递回 C++。下面是一个简化的例子。
这是我的 C++ 基类,带有一个虚函数 fun。 fun 接受(double* x, int n),它允许我将一个 numpy 数组传递给它。
class base{
public:
virtual double fun(double* x, int n){return 0.0;}
};
我有另一个类接受这个基类:
class main{
public:
base* b_;
main(base& b){
b_ = &b;
}
};
这个类有一个构造函数,它接受一个基类并存储一个指向它的指针(b_)。
我可以成功地将 swig 接口编译成一个名为 mymodule 的模块,确保启用导向器(请参阅下面的 SWIG 接口文件),并且根据 SWIG 导向器文档,我继承了基类并重新定义了虚函数 @ 987654328@如下:
import mymodule
class base(mymodule.base):
def __init__(self):
super(base,self).__init__()
def fun(self,x):
return x[0]
然后我将它传递给main 类:
b = base()
m = mymodule.main(b)
但是,当我尝试m.b_.fun(array([1.,2.])) 时,我得到了TypeError:
TypeError: 'SwigPyObject' object has no attribute '__getitem__'
关于如何让它发挥作用的任何想法?我认为当我将b 传递给mymodule.main 时,C++ 将x 视为双* 指针并且不知道如何处理它。
顺便说一下,这是我的 swig 接口文件:
%module(directors="1") mymodule
%{
#define SWIG_FILE_WITH_INIT
/* Includes the header in the wrapper code */
#include "myclasses.h"
%}
%feature("director") base;
%init %{
import_array();
%}
%apply (double* IN_ARRAY1, int DIM1) {(double* x, int n)};
/* Parse the header file to generate wrappers */
%include "myclasses.h"
【问题讨论】:
-
b.fun(array([1.,2.])工作吗? -
是的。但是当我将
b传递给m时,它不会。 -
@kchow462 如果您想要任何不使用 swig 的工作解决方案,我已经使用 boost.python 从 C++ 到 python 再到 C++ 甚至 fork 再到 python 完成了类似的事情。查找文档非常乏味,但结果和生产力使我选择了这种方式。在我最近的工作中,django 从 C++ 启动了 zerorpc 接口并且工作正常。
-
谢谢梅尔。我可能不得不这样做,因为 SWIG 似乎没有办法做到这一点,或者至少,我不知道有什么办法。
标签: python c++ arrays numpy swig