mac 下为 python 写 C 扩展如何获取 Python.h ?
最新比较无聊,想做点之前没有涉猎过的领域,比如:使用 C 或 C++ 扩展 Python
但是我遇到了一个问题,在我的 macbook m1 上面,我用 clion 起了一个 c project,然后我想使用 #include <Python.h>
的时候,发现有红色波浪线
可以看到,显示 Python.h file not found
我该如何解决?
在这台电脑上,我安装了很多个 python 解释器版本:
- python 官方下载的 python3.9、python3.10,通过
macOS 64-bit universal2 installer
安装
- mac 自带的 python3.8
- 使用 brew 安装的 python3.9
一共有 4 个 python 解释器
有如何几个问题:
Python.h
有 python 版本有关系吗?比如 python3.8 和 3.9 分别有自己的Python.h
,互不兼容- 一个电脑上有多个 python 解释器,如何让 clion 可以调用
Python.h
? - 如何不是 mac 平台,而是 linux 平台,又该如何?(同样多个 python 解释器版本共存)
网上针对 Linux 平台会通过类似 sudo apt install python-dev
来解决找不到 Python.h
问题,但是这种方式只能解决的是 Linux 发行版自带的 Python 的 Python.h
找到问题。
比如 ubuntu18 是 python3.6;ubuntu20 是 python3.8
但是我们实际在 linux 使用 python 的解释器都是自己编译安装的(参考:Ubuntu20.04 从源代码编译安装 python3.10 ),所以这个 sudo apt install python-dev
并不是一种通用解?
回答:
解决找不到Python.h的错误
步骤:首先找到Python.h文件的位置,然后根据所使用的IDE的导入头文件规则添加该头文件路径
- 查看Python.h文件所在的位置
stephanie@klde ~ % locate Python.h
/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/Headers/Python.h
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/Python.h
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/Python.h
/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/Python.h
/Users/stephanie/anaconda/envs/python3.5/include/python3.5m/Python.h
/Users/stephanie/anaconda/envs/python3.5/include/vtk-7.0/vtkPython.h
/Users/stephanie/anaconda/include/python3.6m/Python.h
/Users/stephanie/anaconda/pkgs/python-2.7.13-0/include/python2.7/Python.h
/Users/stephanie/anaconda/pkgs/python-3.5.3-1/include/python3.5m/Python.h
/Users/stephanie/anaconda/pkgs/python-3.6.1-2/include/python3.6m/Python.h
/Users/stephanie/anaconda/pkgs/vtk-5.10.1-py27_0/include/vtk-5.10/vtkPython.h
/Users/stephanie/anaconda/pkgs/vtk-6.3.0-py27_1/include/vtk-6.3/vtkPython.h
/Users/stephanie/anaconda/pkgs/vtk-7.0.0-py35_0/include/vtk-7.0/vtkPython.h
/usr/local/Cellar/python/3.6.1/Frameworks/Python.framework/Versions/3.6/include/python3.6m/Python.h
/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m/Python.h
/usr/local/Cellar/python@2/2.7.16/Frameworks/Python.framework/Versions/2.7/include/python2.7/Python.h
可以看到我电脑装了多个不同版本的python
?
- 导入Python.h的路径(VSCode示例)
你可以把上面找到的任意Python.h 添加到下面的includePath的中,但如果你要为2.7版的python添加C扩展你就使用python2.7下面的Python.h文件;也就是说要对应起来
"includePath": [ "${workspaceFolder}/**",
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/"
],
执行locate Python.h 没有任何输出怎么办?
你应该安装 python-dev 或者你需要为需要扩展功能的python安装对应的 dev package:
- Python 2:
# for Ubuntu
$ sudo apt install python-dev
# for CentOS
sudo yum install python3-devel
# for Ubuntu
$ sudo apt install python3-dev
# for CentOS
sudo yum install python3-devel
- 如果你要安装某个特定Python版本例如:python3.6
$ sudo apt install python3.6-dev
其他
问
: Python.h 有 python 版本有关系吗?比如 python3.8 和 3.9 分别有自己的 Python.h,互不兼容答
: Python.h 有 python 版本有关系;python3.8和3.9分别有自己的Python.h且应该互不兼容问
: 一个电脑上有多个python解释器,如何让clion可以调用 Python.h?答
: 尝试上面的步骤,并且在clion的配置中把Pyton.h添加到IncludePython(我对clion也不太熟悉
)问
:如过不是mac平台,而是linux平台,又该如何?(同样多个python解释器版本共存)答
: 原理一样,操作时命令估计有差别.
以上内容源自Solved: GCC cannot find "Python.h
回答:
我参考了:Python.h: No such file or directory
编辑 CMakeLists.txt
添加下面两行内容
find_package(PythonLibs REQUIRED)include_directories(/Library/Frameworks/Python.framework/Versions/3.10/include/)
以上是 mac 下为 python 写 C 扩展如何获取 Python.h ? 的全部内容, 来源链接: utcz.com/p/938595.html