我正在编写一些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 --cplus test.pyx
生成Cython代码,并通过以下方式检查语法:
gcc -std=c++11 -fsyntax-only -I`...python include dir...` test.cpp
-
任何人都可以在我的.pyx文件中告诉我我做错了什么吗?或者这是我绊倒的一个cython bug?
答案 0 :(得分:2)
是的,我认为你是对的,这是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版本。