在IPython Notebook中为Cython宏传递字符串值的问题
在IPython Notebook中为Cython宏传递字符串值的正确方式
在IPython Notebook里使用Cython时,直接通过# distutils: define_macros=NAME="VALUE"传递字符串宏,会得到__Pyx_L1_这类临时变量名,而用'"VALUE"'或\"VALUE\"又会触发编译错误。可以用以下两种方法解决:
方法一:拆分字符串字面量
利用C语言自动拼接相邻字符串的特性,把目标字符串拆成多个双引号包裹的部分:# distutils: define_macros=NAME="V""ALUE"这样编译后,宏
NAME的实际值就是"VALUE"。方法二:直接在Cython代码中定义宏
跳过distutils指令,在Cython代码块开头用C预处理器指令直接定义:%%cython #define NAME "VALUE" # 后续业务代码这种方式更直观,也能避免预处理过程中的转义问题。
问题原因说明
Cython在解析distutils的define_macros参数时,会将等号后的内容视为C表达式处理。直接写带双引号的字符串会被Cython内部预处理转换为临时字符串变量的引用,而非原始字符串字面量。拆分字符串的写法则能被C编译器正确识别为合法的字符串拼接,从而得到预期的结果。
内容的提问来源于stack exchange,提问作者Jayen
相关产品推荐
相关产品推荐

