在Python中引用Cython常量

时间:2018-07-11 21:30:40

标签: cython cythonize

我有一个C头文件(我们称它为myheader.h),其中包含一些字符串定义,例如:

#define MYSTRING "mystring-constant"

在Cython中,我创建一个cmy.pxd文件,其中包含:

cdef extern from "myheader.h":
    cdef const char* MYSTRING "MYSTRING"

以及相应的my.pyx文件,其中包含一些类定义,均以以下标题为标题:

from cmy cimport *

然后我尝试在Python脚本中引用该字符串:

from my import *

def main():
     print("CONSTANT ", MYSTRING)

if __name__ == '__main__':
    main()

问题是我不断收到错误消息:

NameError: name 'MYSTRING' is not defined

我已经搜索了文档,但无法确定问题所在。任何建议都会受到欢迎-我承认这可能确实很愚蠢。

1 个答案:

答案 0 :(得分:0)

您无法从Python访问cdef变量。因此,您必须创建一个与您的定义相对应的Python对象,如下所示(它使用Cython> = 0.28-feature verbatim-C-code,因此您需要最新的Cython版本来运行代码段):

%%cython
cdef extern from *:   
    """
    #define MYSTRING "mystring-constant"
    """
    # avoid name clash with Python-variable
    # in cdef-code the value can be accessed as MYSTRING_DEFINE
    cdef const char* MYSTRING_DEFINE "MYSTRING"

#python variable, can be accessed from Python
#the data is copied from MYSTRING_DEFINE   
MYSTRING = MYSTRING_DEFINE 

现在MYSTRING是一个字节对象:

>>> print(MYSTRING)
b'mystring-constant'