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:
答案 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