无法在Cython中使用命名空间返回C ++代码中的C结构

时间:2014-12-31 19:40:53

标签: python c++ cython

Cython版本是0.21.1

我想在带有命名空间的C ++代码中返回C struct数据。

我收到了编译错误

error: ‘__pyx_convert__to_py_Test’ has not been declared

我不能在C ++中使用带有命名空间的C ++代码中的C结构吗? 这个前缀是什么(__ pyx_convert__to_py_Test)?

Cython生成如下代码:

static PyObject* __pyx_convert__to_py_Test::mydata(struct Test::mydata s);

请注意,当我构建没有命名空间的代码时,问题不会发生。

以下是一个示例代码:

libmy.h

namespace Test {
    struct mydata {
        int id;
        char name[256];
    };
    class Myclass {
        mydata _data;
    public:
        const mydata & get_data() const;
    };
}

libmy.cpp

namespace Test {
    const mydata & Myclass::get_data() const {
        return const_cast<const mydata&>(_data);
    }
}

test.pxd

cdef extern from "libmy.h" namespace "Test":
    cdef struct mydata:
        int id
        char* name

    cdef cppclass Myclass:
        const mydata & get_data()

test.pyx

cimport test as my

cdef class Py_Myclass:
    cdef my.Myclass *thisptr

    def __cinit__(self):
        self.thisptr = new my.Myclass()

    def __dealloc__(self):
        del self.thisptr

    def get_data(self):
        return <const mydata&>self.thisptr.get_data()

setup.py

setup(
    ext_modules = cythonize([Extension("mylib", ["mylib.pyx"], language="c++", libraries=["my"])])
)

当我在test.pxd中使用'cppclass'而不是'struct'时,我得到了一个不同的错误。

Cannot convert 'mydata const  &' to Python object

我改变了

cdef struct mydata:

cdef cppclass mydata:

1 个答案:

答案 0 :(得分:2)

我自己解决了这个问题 我应该在&#39; test.pyx&#39;中创建一个包含C ++结构信息的python对象。文件。

例如

def get_data(self):
    d = self.thisptr.get_data()
    data = {}
    data["id"] = d.id
    data["name"] = d.name
    return data

我还将C struct改为&#39; cppclass&#39;在&#39; test.pxd&#39;文件。

 cdef cppclass mydata:
    int id
    char* name