2015-02-10 149 views
0

假设我有一个SWIG包装的类负责处理一些数据的指针,如下面的代码所示。我想从数据中构造一个numpy ndarray对象并将其返回给用户。我希望它将数据作为缓冲区使用,但不会占用所有权。如果我是对的,我将使用numpy C++ api PyArray_SimpleNewFromData。然而,我的问题是我如何返回到Python?如果我编写以下get函数,SWIG会自动将它作为python对象返回吗?如果不是,我该怎么办?SWIG将PyObject作为python对象返回?

class Test { 
public: 
    Test() { ptr_ = new uint8_t[200]; } 
    ~Test() { delete [] ptr_; } 

    PyObject* get() { 
    npy_intp dims[1] = {25}; 
    return PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, ptr_); 
    } 

private: 
    uint8_t* ptr_; 
}; 

顺便说一下,我也在努力寻找上述api的头文件和库文件。如果你知道,请告诉我。谢谢。

更新:

我试过SWIG包装这个类。除了当我在Python中调用get函数(如下所示)时,其他所有工作都很好,我得到了分段错误。任何帮助表示赞赏。

x = Test() 
y = x.get() 

更新2:

看来PyArray_SimpleNewFromData不赞成使用的功能。那么这仍然是支持的,还是有其他更推荐的方式吗?

回答

0

我想通了,在痛饮使用类型映射解决方案:

%typemap(out) double* { 
    npy_intp dims[1] = {25}; 
    $result = PyArray_SimpleNewFromData(1, dims, PyArray_DOUBLE, $1); 
} 

class Test { 
public: 
    Test() { ptr_ = new uint8_t[200]; } 
    ~Test() { delete [] ptr_; } 

    double* get() { 
    return (double*) ptr_; 
    } 

private: 
    uint8_t* ptr_; 
}; 
+0

我得到一个编译错误,如果我试图用一个浮点数做*。任何建议? – mkuse 2017-10-27 08:52:41

相关问题