我正在尝试将一个秘密的基于c的库从CentOS 6.5 / Python 2.6迁移到CentOS 7.4 / Python 2.7。这个库有python接口,它基于Pyrex。
问题是,当我执行'pyrex secret_lib.pyx'(这个文件的第一行 - 包括“python.pxi”)时,我得到了这些错误:
python.pxi:165:8 'PyFrameObject' is not declared
python.pxi:165:8 'PyFrameObject' is not a type identifier
python.pxi的内容:
17 cdef extern from "Python.h":
...
164 ctypedef struct PyFrameObject:
165 PyFrameObject *f_back
166 PyCodeObject *f_code
167 PyObject *f_builtins
168 PyObject *f_globals
169 PyObject *f_locals
170 PyObject *f_trace
171 PyObject *f_exc_type
172 PyObject *f_exc_value
173 PyObject *f_exc_traceback
174 int f_lasti
175 int f_lineno
176 int f_restricted
177 int f_iblock
178 int f_nlocals
179 int f_ncells
180 int f_nfreevars
181 int f_stacksize
所以,这是这一行 - “165 PyFrameObject * f_back”和具有相同名称的结构。看起来像c中的链表,为什么它没有定义?或者在Pyrex中,它意味着扩展预定义的结构“PyFrameObject” - 在这种情况下,它可能会导致错误。但为什么呢?
我甚至尝试修改第17行(3种不同的变体):
1) cdef extern from "Python.h, frameobject.h":
2) cdef extern from "frameobject.h":
3) cdef extern from *:
,但没有帮助。 在这个文件 - “/usr/include/python2.7/frameobject.h”中我们可以找到这个“PyFrameObject”,那么,有什么问题呢?
答案 0 :(得分:1)
这对我来说似乎是一个“前瞻性声明”问题。
(我相信)当执行第165行时 - PyFrameObject
尚未定义(它将在第181行之后 - 但尚未执行)。
要解决这个问题,请尝试告诉编译器它将通过创建前向声明来定义。
在互联网上搜索可能会有所帮助,例如https://www.mail-archive.com/cython-dev@codespeak.net/msg03160.html