mac 下为 python 写 C 扩展如何获取 Python.h ?

最新比较无聊,想做点之前没有涉猎过的领域,比如:使用 C 或 C++ 扩展 Python

但是我遇到了一个问题,在我的 macbook m1 上面,我用 clion 起了一个 c project,然后我想使用 #include <Python.h> 的时候,发现有红色波浪线

图片.png

可以看到,显示 Python.h file not found

我该如何解决?

在这台电脑上,我安装了很多个 python 解释器版本:

  • python 官方下载的 python3.9、python3.10,通过 macOS 64-bit universal2 installer 安装

图片.png

  • 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 并不是一种通用解?

回复
阅读 1.5k
2 个回答
  • 解决找不到Python.h的错误

    步骤:首先找到Python.h文件的位置,然后根据所使用的IDE的导入头文件规则添加该头文件路径

    1. 查看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 😂

  1. 导入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:

    1. Python 2:
    # for Ubuntu
    $ sudo apt install python-dev
    
    # for CentOS
    sudo yum install python3-devel
    1. Python 3:
    # for Ubuntu
    $ sudo apt install python3-dev
     
    # for CentOS
    sudo yum install python3-devel
    1. 如果你要安装某个特定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

图片.png

编辑 CMakeLists.txt 添加下面两行内容

find_package(PythonLibs REQUIRED)
include_directories(/Library/Frameworks/Python.framework/Versions/3.10/include/)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏