在 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'
我有一个 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'