fatal error: Python.h: No such file or directory

fatal error: Python.h: No such file or directory

技术背景

在进行Python相关的开发时,尤其是在编写C或C++代码调用Python API,或者使用pip安装一些需要编译的Python包时,可能会遇到fatal error: Python.h: No such file or directory错误。这通常是因为系统中缺少Python开发所需的头文件和静态库。

实现步骤

1. 安装Python开发包

不同的操作系统和包管理工具有不同的安装命令:

  • apt(Ubuntu, Debian…)
    1
    2
    sudo apt-get install python-dev   # for python2.x installs
    sudo apt-get install python3-dev # for python3.x installs
  • yum(CentOS, RHEL…)
    1
    2
    sudo yum install python-devel    # for python2.x installs
    sudo yum install python3-devel # for python3.x installs
  • dnf(Fedora…)
    1
    2
    sudo dnf install python2-devel  # for python2.x installs
    sudo dnf install python3-devel # for python3.x installs
  • zypper(openSUSE…)
    1
    2
    sudo zypper in python-devel   # for python2.x installs
    sudo zypper in python3-devel # for python3.x installs
  • apk(Alpine…)
    1
    2
    sudo apk add python2-dev  # for python2.x installs
    sudo apk add python3-dev # for python3.x installs
  • apt-cyg(Cygwin…)
    1
    2
    apt-cyg install python-devel   # for python2.x installs
    apt-cyg install python3-devel # for python3.x installs

2. 指定Python版本的开发包

如果使用特定版本的Python,可能需要安装对应版本的开发包。例如,使用Python 3.11:

1
2
sudo apt-get install python3.11-dev  # Ubuntu
sudo yum install python3.11-devel # CentOS

3. 解决编译时的路径问题

在编译时,需要确保编译器能够找到Python的头文件和库文件。可以使用以下方法:

  • 手动指定路径
    1
    gcc -Wall -I/usr/include/python2.7 -lpython2.7  utilsmodule.c -o Utilc
  • 使用pkg-config
    1
    gcc -Wall utilsmodule.c -o Utilc $(pkg-config --cflags --libs python2)

4. 处理不同Python版本和虚拟环境

如果使用虚拟环境或多个Python版本,需要确保安装对应版本的开发包,并正确设置环境变量。例如:

1
2
export CPPFLAGS=-I/home/ubuntu/src/blender-deps/Python-3.7.7/Include
pip install <package>

5. Cygwin解决方案

在Cygwin中,需要安装python2-develpython3-devel包:

1
setup.exe -q --packages=python3-devel

6. AWS EC2解决方案

在AWS EC2上,根据Python版本安装对应的开发包:

1
2
3
4
# Python 2.7
yum install python27-devel
# Python 3.4
sudo yum install python34-devel

7. 其他解决方案

  • 使用python-config
    1
    2
    gcc -c mypythonprogram.c $(python3-config --includes)
    gcc -o program mypythonprogram.o $(python3-config --ldflags)
  • 使用CMake
    1
    2
    3
    4
    5
    6
    cmake_minimum_required(VERSION 2.6)
    project(demo)
    find_package(PythonLibs REQUIRED)
    include_directories(${PYTHON_INCLUDE_DIRS})
    add_executable(demo main.cpp)
    target_link_libraries(demo ${PYTHON_LIBRARIES})

核心代码

使用Python获取include路径

1
2
import sysconfig
print(sysconfig.get_path('include'))

编译脚本示例

1
2
3
#!/bin/sh
python_include=$(python3.10 -c "import sysconfig; print(sysconfig.get_path('include'))")
gcc -Wall utilsmodule.c -o Utilc -I"$python_include"

最佳实践

  • 在安装Python开发包之前,先更新系统的包列表,例如在Ubuntu上:
1
sudo apt-get update
  • 使用虚拟环境时,确保为每个虚拟环境安装对应的Python开发包。
  • 尽量使用pkg-configpython-config来自动获取正确的编译选项。

常见问题

安装开发包后仍然报错

  • 检查gcc是否安装:如果缺少gcc,可以根据不同的包管理器进行安装。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # apt
    sudo apt-get install gcc
    # yum
    sudo yum install gcc
    # dnf
    sudo dnf install gcc
    # zypper
    sudo zypper in gcc
    # apk
    sudo apk gcc
  • 检查Python版本:确保安装的开发包与使用的Python版本一致。

不同Python版本导致的问题

如果系统中安装了多个Python版本,可能会出现找不到正确头文件的问题。可以通过以下方法解决:

  • 明确指定Python版本的开发包。
  • 使用--global-option指定include目录,但要注意可能会导致链接问题。
  • 检查Python.h的实际路径,并使用-I选项指定。

fatal error: Python.h: No such file or directory
https://119291.xyz/posts/fatal-error-python-h-no-such-file-or-directory/
作者
ww
发布于
2025年5月26日
许可协议