IPython Cython单元格中#define宏定义的正确放置位置
Cython中NPY_NO_DEPRECATED_API宏不生效的解决方法
你写在Cython代码里的C风格#define语句不生效,核心原因是:Cython处理cimport numpy逻辑时,会自动在生成的C代码最前端插入NumPy头文件的包含逻辑,你手写的#define会被放在头文件引入之后的位置,此时头文件内部的弃用API校验逻辑已经执行完毕,宏定义自然不会起作用。
两种正确配置方式
1. Notebook环境最简便方案:通过%%cython命令参数传宏
直接在%%cython魔法命令后加编译参数,把宏定义传给C编译器,不需要在代码里写#define,修改后的单元格代码如下:
%%cython -a -c=-DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION cimport numpy as cnp
参数里的-c代表后续内容是传给C编译器的参数,-D是C编译器定义宏的标准语法,这个配置会在编译全程生效,不会有顺序问题。
2. 通用兼容方案:通过Cython distutils注释声明宏
如果需要兼容.pyx文件离线编译的场景,可以在代码块第一行(所有import、cimport语句之前)加Cython识别的特殊配置注释,写法如下:
%%cython -a # distutils: define_macros=NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION cimport numpy as cnp
Cython在编译前会解析开头的distutils注释,提前把对应宏配置到编译参数里,保证在引入NumPy头文件之前宏就已经生效。
注意事项
- 不要在Cython代码里直接裸写C风格的
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION,这个写法永远无法命中正确的生效顺序 - 配置完成后重新运行单元格,NumPy弃用API的编译警告就会消失
内容的提问来源于stack exchange,提问作者ignoring_gravity
相关产品推荐
相关产品推荐

