在 Python 中引用 Cython 常量

Referencing Cython constants in Python

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

#define MYSTRING "mystring-constant"

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

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

和相应的 my.pyx 文件,其中包含一些 class 定义,全部由:

from cmy cimport *

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

from my import *

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

if __name__ == '__main__':
    main()

问题是我一直收到错误消息:

NameError: name 'MYSTRING' is not defined

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

您无法从 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'