致命错误:Python.h: 没有那个文件或目录。

1825

我正在尝试使用C扩展文件构建共享库,但首先必须使用以下命令生成输出文件:

gcc -Wall utilsmodule.c -o Utilc

执行命令后,我收到了以下错误信息:
> utilsmodule.c:1:20: fatal error: Python.h: No such file or directory
compilation terminated.

我尝试了互联网上提供的所有建议解决方案,但问题仍然存在。我对 Python.h 没有任何问题。我成功地在我的电脑中找到了该文件。

35个回答

3412

看起来你没有正确安装Python开发所需的头文件和静态库。请使用软件包管理器在系统范围内安装它们。

对于aptUbuntu,Debian...):

sudo apt-get install python-dev   # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

对于 yumCentOS,RHEL...):

sudo yum install python-devel    # for python2.x installs
sudo yum install python3-devel   # for python3.x installs

对于 dnf (Fedora...):

sudo dnf install python2-devel  # for python2.x installs
sudo dnf install python3-devel  # for python3.x installs

对于 zypperopenSUSE...):

sudo zypper in python-devel   # for python2.x installs
sudo zypper in python3-devel  # for python3.x installs

对于 apkAlpine...):

# This is a departure from the normal Alpine naming
# scheme, which uses py2- and py3- prefixes
sudo apk add python2-dev  # for python2.x installs
sudo apk add python3-dev  # for python3.x installs

对于 apt-cygCygwin...):

apt-cyg install python-devel   # for python2.x installs
apt-cyg install python3-devel  # for python3.x installs

注意: python3-dev并不自动覆盖Python3的所有小版本号,如果您使用的是如 Python 3.8等版本,则可能需要安装python3.8-dev。


3
如果我们在机器上没有su访问权限怎么办?我正在使用本地用户授权的虚拟环境进行工作。是否有任何类似于"pip"的修复方法可用,或者我们可以手动放置Python.h的副本的位置? - sh37211
1
@sh37211 是的,你通常只需要将CPython源代码下载到你的主目录中。在这种情况下,通常需要提供一些自定义链接器选项来提供路径。 - wim
1
@PhilGoetz 请查看如何为Cygwin安装apt-cyg?(https://dev59.com/_VcO5IYBdhLWcg3wvUMp) - wim
4
似乎我们需要安装特定版本的python(2-3)-dev。例如3.11版本:sudo apt-get install python3.11-dev。只有这个命令对我有效。 - Thanos
1
@sh37211 有点晚了,但我会选择使用Linuxbrew。 从源代码编译Python还需要从系统包管理器安装一些(很多)软件包。 - Francisco Pena
显示剩余3条评论

549

在Ubuntu上,我正在运行Python 3,我必须安装

sudo apt-get install python3-dev
如果你想使用一个未与Python3关联的Python版本,请安装相应的python3.x-dev软件包。例如:
sudo apt-get install python3.5-dev

8
如果你正在使用不同 Python 版本的虚拟环境,请确保在安装必要的开发软件包后创建虚拟环境。否则,头文件可能会被错误地复制。 - ruhsuzbaykus
Python 版本的更新对我的情况非常有帮助。 - Chiffa

410
对于特定的Python 3.7和Ubuntu,我需要执行以下命令:sudo apt install libpython3.7-dev。我想在某个时候,名称从pythonm.n-dev改变成了这个。
对于Python 3.6、3.8到3.10(以及更多版本),类似地执行以下命令: sudo apt install libpython3.6-dev sudo apt install libpython3.8-dev sudo apt install libpython3.9-dev sudo apt install libpython3.10-dev sudo apt install libpython3.11-dev sudo apt install libpython3.12-dev

6
Python 3.10 同理。 - Daniel
6
仍然相关且有效。 - Krishnadas PC
1
这是Python3.10的最佳解决方案。 - Jalil Nourmohammadi Khiarak
2
仍在2023年4月3日继续工作。 - Jerry Chong
1
3.12号参与了编译软件包的工作,谢谢! - undefined
显示剩余2条评论

96

你需要做两件事。

安装Python的开发包,如果是Debian/Ubuntu/Mint操作系统,可以使用以下命令完成:


```shell command: sudo apt-get install python3-dev ```
sudo apt-get install python-dev

其次,包含文件默认不在包含路径中, Python库也不会默认链接到可执行文件中。您需要添加这些标志(相应地替换Python的版本):

-I/usr/include/python2.7 -lpython2.7 

换句话说,你的编译命令应该是:

gcc -Wall -I/usr/include/python2.7 -lpython2.7  utilsmodule.c -o Utilc 

在 C 扩展文件中,我是否需要为每个包含的文件添加标志? - Mohanad Y.
1
如果您使用的是另一个版本的Python,例如3.3:sudo apt-get install python3.3-dev - FreshPow

41

在 Fedora 上运行 Python 2,请运行以下命令:

sudo dnf install python2-devel

并且适用于Python 3:

sudo dnf install python3-devel

1
在Mint 18.2(基于Ubuntu),它是apt-get install python-dev - CoderGuy123

35

如果您正在使用tox来在多个Python版本上运行测试,则可能需要为每个测试版本的Python安装Python开发库。

sudo apt-get install python2.6-dev 
sudo apt-get install python2.7-dev 
etc.

33

请确保您的操作系统附带Python开发文件。

不应将库和包含路径硬编码。相反,请使用pkg-config,该工具会为您的特定系统输出正确的选项:

$ pkg-config --cflags --libs python2
-I/usr/include/python2.7 -lpython2.7

您可以将其添加到您的gcc命令行中:

gcc -Wall utilsmodule.c -o Utilc $(pkg-config --cflags --libs python2) 

我在RHEL上遇到了以下错误信息:“未知选项-I/usr/include/python2.7”。 - Fedor Alexander Steeman
@FedorSteeman,有人编辑了我的答案并从命令中删除了换行符。 - sleblanc

30

对我来说,将其更改为这个可以起作用:

#include <python2.7/Python.h>

我找到了文件/usr/include/python2.7/Python.h,并且因为/usr/include已经在包含路径中了,所以python2.7/Python.h应该就足够了。

你也可以通过命令行添加包含路径 - gcc -I/usr/lib/python2.7(感谢 @erm3nda)。


6
所有其他答案都告诉你要安装某些东西。而这个方法对我很有效。为什么它不是最佳答案? - noɥʇʎԀʎzɐɹƆ
3
也许是因为它无法在Python3下运行? - Louis
3
因为它应该在不改变代码的情况下运行。你经常需要编译一个不属于你自己的代码,例如一些外部依赖项,而最糟糕的事情就是修改那段代码。 - David Ferenczy Rogožan
我建议使用pkg-config而不是修改您的C源代码: https://dev59.com/ZmEi5IYBdhLWcg3wMZ3a#21531170 - Ciro Santilli OurBigBook.com
1
这个方法在Python3中对我也起作用。 - Gokul nath
显示剩余2条评论

29

Cygwin的解决方案

您需要安装包python2-develpython3-devel,具体取决于您使用的Python版本。

您可以通过使用32位64位setup.exe(根据您的安装情况而定)来快速安装它,下载地址在Cygwin.com

示例(如有需要,请修改setup.exe文件名和Python的主要版本):

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

您还可以查看我的其他答案,以获得更多通过命令行安装Cygwin软件包的选项。


28

在AWS EC2上安装并运行Python34:

sudo yum install python34-devel


这个对我有效:yum install python3-devel - Arundale Ramanathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接