在Cython中包装C ++结构

时间:2016-07-13 20:40:27

标签: c++ python-3.x cython

我正在尝试使用以下头文件Cython包装用C ++编写的dll:

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

struct cmplx64
{
    float re;
    float im;
};

EXTERN_DLL_EXPORT int foo(cmplx64 *arr, int arr_sz);

PXD文件:

cdef extern from "mylib.h":

    cdef struct cmplx64:
        np.float64_t re
        np.float64_t im

    int foo(cmplx64 *arr, int arr_sz) except +

PYX文件:

cimport cmylib
import numpy as np
cimport numpy as np
import cython

def foo(np.ndarray[np.complex64_t, ndim=1] arr, int arr_sz):

    return cmylib.foo(&arr[0], arr_sz)

我的设置文件中没有出现此问题。

代替struct定义,我尝试按照我发现的建议构建cppclass,但我没有像现在的方法那样得到那么多。

我收到的错误消息是:

Cannot assign type 'float complex *' to 'complexFloatStruct *'

我的问题是由于我正在使用的库的作者使用结构定义了一个复杂类型,而不是简单地使用C ++ std库中的内置复杂类型。如果是这样的话,我就没有问题了。

但是,我应该能够用Cython包装C ++类或结构似乎是完全合理的。我已经阅读了文档并且几乎失败了。谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

简单的演员表可能就足够了,

filename = '/path/to/file.csv'
df.to_csv(filename, index=False, mode='a', header=(not os.path.exists(filename)))