我正在编写一些cython代码,但遇到了一个奇怪的问题。当我尝试将对象从python直接传递给C作为结构时,cython可以很好地生成代码,但是gcc不喜欢代码输出,并给了我以下错误:error: declaration does not declare anything。这是我的测试代码:

// cake.h
using Cake = struct CakeStruct {
    int a, b, c;
};

void bake(Cake batter);


和cython:

# test.pyx

cdef extern from "cake.h":
    void bake(Cake batter)
    ctypedef struct Cake:
        int a
        int b
        int c

def make_one(batter):
    cdef Cake more_batter;
    more_batter.a = 5
    more_batter.b = 10
    print(more_batter.a + more_batter.b)

    bake(more_batter)
    bake(batter)  # <- this line generates bad code


如果查看生成的代码,则坏行如下所示:

...

Cake; // this is the error
static Cake __pyx_convert__from_py_Cake(PyObject *);

...


我正在直接使用Anaconda的cython 0.21和Ubuntu 14.04附带的gcc 4.8.2。 Cython代码是使用cython --cplus test.pyx生成的,并且通过以下方式检查语法:

gcc -std=c++11 -fsyntax-only -I`...python include dir...` test.cpp


-

谁能告诉我我的.pyx文件做错了什么?还是这是我绊倒了的cython bug?

最佳答案

是的,我认为您是对的,因为这是Cython 0.21中的错误。首先,使用Cython 0.20进行测试(因为这是我的linux发行版附带的内容),它给了我

cake.pyx:16:15: Cannot convert Python object to 'Cake'


我想这是因为转换功能在0.20中丢失或不完整,尽管我在发行说明中找不到关于此(https://github.com/cython/cython/blob/master/CHANGES.rst)的任何内容。

接下来,我使用Github存储库(https://github.com/cython/cython)的master分支进行了测试。这完美地工作了,您提供的cythongcc命令没有错误。使用0.21版本,我可以重现您看到的错误。

运行git bisect表明该错误似乎已在提交fd56551中修复。这是0.21.1(当前最新版本)之后的版本,因此升级到此版本将无法修复该错误。看来您将不得不转到开发分支或等待下一个Cython版本。

关于python - Cython错误:声明未声明任何内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27088460/

10-14 16:56