cython问题:'bool'不是类型标识符

时间:2014-07-09 17:04:03

标签: python c++ cython

我拼命试图将std::vector<bool>类成员暴露给Python类。

这是我的C ++类:

class Test
{
  public:
    std::vector<bool> test_fail;
    std::vector<double> test_ok;
};

虽然test_ok类型double(或int,float,..)的访问和转换有效,但它不适用于bool

这是我的Cython课程:

cdef class pyTest:
     cdef Test* thisptr
     cdef public vector[bool] test_fail
     cdef public vector[double] test_ok

     cdef __cinit__(self):
         self.thisptr = new Test()
         self.test_fail = self.thisptr.test_fail # compiles and works if commented
         self.test_ok = self.thisptr.test_ok

     cdef __dealloc__(self):
         del self.thisptr

我得到的错误是:

Error compiling Cython file:
------------------------------------------------------------
...




cdef extern from *:
    ctypedef bool X 'bool'
            ^
------------------------------------------------------------

vector.from_py:37:13: 'bool' is not a type identifier

我使用python 2.7.6和Cython 0.20.2(也试过0.20.1)。

我也试过了属性,但它也不起作用。

附录:我的pyx文件顶部有from libcpp cimport bool,以及矢量导入。

出了什么问题?我相信这可能是一个错误。谁知道如何规避这个?感谢。

3 个答案:

答案 0 :(得分:42)

您需要做一些额外的C ++支持。在.pyx文件的顶部,添加

from libcpp cimport bool

我在里面看一下,找到你可能需要的其他东西,比如std :: string和STL容器

答案 1 :(得分:17)

为了在cython中定义boolean个对象,需要将它们定义为bint。根据{{​​3}}:&#34; boolean int&#34;的bint;对象被编译为c int,但是作为布尔值被强制进出Cython。

答案 2 :(得分:2)

我找到了一个有效的解决方法,虽然它可能不是最佳的。

我用python列表替换了pytest类的成员类型。

转换现在是隐含的,如文档中所述:http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library

  

所有转化都会创建一个新容器并将数据复制到其中。容器中的物品自动转换成相应的类型,包括递归地转换容器内的容器,例如容器。字符串映射的C ++向量。

现在,我的班级看起来像这样:

cdef class pyTest:
     cdef Test* thisptr
     cdef public list test_fail #now ok
     cdef public list test_ok

     cdef __cinit__(self):
         self.thisptr = new Test()
         self.test_fail = self.thisptr.test_fail # implicit copy & conversion
         self.test_ok = self.thisptr.test_ok # implicit copy and conversion

     cdef __dealloc__(self):
         del self.thisptr