Mac环境下使用clang编译Cython生成的C文件提示Python.h缺失如何解决
问题原因
- 手动指定的头文件路径和你实际用来生成Cython代码的Python 3.9版本不匹配:Mac默认自带系统版本Python,自行安装的Python 3.9(官方pkg/brew安装)的头文件路径和系统路径不一样,手动填路径很容易填错。
- 仅修改单文件include的绝对路径没有解决根本问题:Cython生成的C代码中头文件是嵌套引用的,
Python.h内部会依赖cpython/initconfig.h这类相对路径引用的头文件,仅修改Python.h的引入路径不会自动匹配嵌套引用的头文件路径。 - 编译参数没有正确加入整套CPython头文件的搜索目录,导致编译器找不到嵌套的头文件。
修复步骤
- 首先确认你使用的Python 3.9的正确编译参数,直接执行以下命令获取官方标准的编译、链接参数:
python3.9-config --cflags --ldflags
注意如果你使用了虚拟环境,需要先激活对应虚拟环境再执行上述命令,避免调用到全局Python的参数。 - 直接将上述命令的输出嵌入clang编译命令中,不要手动填写路径,示例编译命令如下:
clang cython生成的代码.c -o 输出的可执行文件名 $(python3.9-config --cflags) $(python3.9-config --ldflags) - 如果执行上述命令仍报错,可手动验证头文件路径是否存在:
- 官方pkg安装的Python 3.9头文件路径为:
/Library/Frameworks/Python.framework/Versions/3.9/include/python3.9 - x86架构Mac brew安装的Python 3.9头文件路径为:
/usr/local/Cellar/python@3.9/对应版本号/Frameworks/Python.framework/Versions/3.9/include/python3.9 - arm64架构Mac brew安装的Python 3.9头文件路径为:
/opt/homebrew/Cellar/python@3.9/对应版本号/Frameworks/Python.framework/Versions/3.9/include/python3.9
确认路径下同时存在Python.h和cpython/initconfig.h后,将该路径通过-I参数加入编译命令即可。
- 官方pkg安装的Python 3.9头文件路径为:
- 不要手动修改Cython生成的C代码中的include语句,所有路径配置通过编译参数完成即可。
内容的提问来源于stack exchange,提问作者James Bord
相关产品推荐
相关产品推荐

