我正在编写一些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分支进行了测试。这完美地工作了,您提供的
cython
或gcc
命令没有错误。使用0.21版本,我可以重现您看到的错误。运行
git bisect
表明该错误似乎已在提交fd56551中修复。这是0.21.1(当前最新版本)之后的版本,因此升级到此版本将无法修复该错误。看来您将不得不转到开发分支或等待下一个Cython版本。关于python - Cython错误:声明未声明任何内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27088460/