派热克斯 - 'PyFrameObject'未声明

时间:2018-02-27 14:27:54

标签: python pyrex

我正在尝试将一个秘密的基于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”,那么,有什么问题呢?

1 个答案:

答案 0 :(得分:1)

这对我来说似乎是一个“前瞻性声明”问题。

(我相信)当执行第165行时 - PyFrameObject尚未定义(它将在第181行之后 - 但尚未执行)。

要解决这个问题,请尝试告诉编译器它将通过创建前向声明来定义。

在互联网上搜索可能会有所帮助,例如https://www.mail-archive.com/cython-dev@codespeak.net/msg03160.html