我有一个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
我已经搜索了文档,但无法确定问题所在。任何建议都会受到欢迎-我承认这可能确实很愚蠢。
答案 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'