致命错误:Python.h:没有这样的文件或目录


1189

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

gcc -Wall utilsmodule.c -o Utilc

执行命令后,我得到以下错误消息:

utilsmodule.c:1:20:致命错误:Python.h:没有此类文件或目录编译终止。

我已经尝试了所有建议的解决方案,但是仍然存在该问题。我没有问题Python.h。我设法在机器上找到该文件。

Answers:


2232

看来您尚未正确安装python dev的标头文件和静态库。使用软件包管理器在系统范围内安装它们。

对于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

对于dnfFedora ...):

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

21
locate Python.h在执行所有这些操作之前,请尝试查看是否已拥有该文件。如果您找到文件所在的位置,则大多数答案将起作用:stackoverflow.com/a/19344978/4954434(这可能只是路径问题)
Jithin Pavithran

2
@ Hack-R和其他(如果您安装了Python 2.6 2.7),“ python-devel”将仅安装2.6的开发库。要强制其安装2.7库,请使用sudo yum install python27-devel
Doktor J

15
我在14.04上使用python3.6 apt-get install python3.6-dev为我工作。

9
对我来说工作正常(ubuntu 14.04),但必须指定完整的版本号sudo apt-get install python3.6-dev
landrykapela

17
同样适用于sudo apt-get install python3.7-dev
kas

344

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

sudo apt-get install python3-dev

如果要使用未链接到python3的Python版本,请安装关联的python3.x-dev软件包。例如:

sudo apt-get install python3.5-dev

32
sudo apt-get install python3.4-dev为Python3.4 运行了命令,这解决了我的问题。
亚伦·莱里维耶

4
@Rawrgulmuffins很好,这取决于您使用的是哪个版本的python。就我而言,sudo apt-get install python2.7-dev解决了问题
RockScience 2014年

6
我还要在此答案中添加其他内容-如果您有多个Python 3.x版本,python3-dev则会安装该版本的依赖项,该依赖项链接到python3command。因此,如果要安装特定版本,请使用-的完整版本python3.x-dev
xyres

3
这有助于在Ubuntu 14.04上使用python 3.6.3sudo apt-get install python3.6-dev
codestruggle 18-2-27

如果在与系统Python不同的虚拟环境中运行Python版本,则需要这样做。
SuperShoot

73

特别是对于Python 3.7Ubuntu,我需要

sudo apt install libpython3.7-dev

。我认为在某些时候名称已从此更改pythonm.n-dev

对于Python 3.6,类似地:

sudo apt install libpython3.6-dev

6
ty:tearsofjoy:
valem

1
哇。在经过30分钟的搜索并安装了各种东西之后,这个答案实际上解决了问题
Vyacheslav Tsivina

!!!!! 当然,这是使用Python 3.7和Ubuntu 18.04的正确解决方案。
villamejia

谢谢<3 <3 <3
咖啡时间

它也适用于python 3.6 ...但是sudo apt install libpython3.6-dev
Morteza Afshari

70

您必须做两件事。

为Debian / Ubuntu / Mint安装适用于Python的开发包,可通过以下命令完成:

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 2014年

我建议您使用pkg-config原始-I
格式


35

在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
Deleet '17

30

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

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

27

Cygwin的解决方案

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

您可以使用Cygwin.com上的32位64位 setup.exe(取决于您的安装)快速安装它。

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

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

您也可以在其他答案中查看我的其他答案,以从命令行安装Cygwin的软件包。


22

在AWS API(centOS)中

yum install python27-devel

这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方留下评论-您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,就可以在任何帖子中发表评论
Wtower

2
@Wtower是的,它确实提供了答案。
Tadeusz Kopec

1
它确实提供了答案。尽管您必须用版本代替所需的内容。
Ganesh Krishnan

1
这有助于克服我pip install cryptography在亚马逊Linux实例上尝试遇到的问题。
瑞安·塔克

这是一个有用的答案,尽管可以在Amazon Linux上安装python-devel或python2-devel,但这是在virtualenv中运行pip安装时唯一对我有用的方法
Kristofor Carle

21

对我来说,将其更改为有效:

#include <python2.7/Python.h>

我找到了文件/usr/include/python2.7/Python.h,并且由于/usr/include已经在include路径中,因此python2.7/Python.h应该足够了。

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


4
所有其他答案都告诉您安装某些东西。这个为我工作。为什么这不是最佳答案?
noɥʇʎԀʎzɐɹƆ

1
@uoPɥʇʎzɐɹC也许是因为它不会在python3下运行?
路易(Louis)

最好将lib设置为gcc -I/usr/lib/python2.7 etc而不是硬编码include调用。
m3nda '17

1
@noɥʇʎԀʎzɐɹƆ因为它应该工作而无需更改代码。您通常需要编译不属于您的代码,例如一些外部依赖项,而最糟糕的事情就是修改该代码。
David FerenczyRogožan17年

@DawidFerenczy明白了。
noɥʇʎԀʎzɐɹƆ

19

确保您的操作系统随附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) 

16

运行python34的AWS EC2安装:

sudo yum install python34-devel


14

就我而言,在Ubuntu中修复该问题的是安装软件包libpython-all-dev(或者libpython3-all-dev如果您使用Python 3)。


2
python-all-dev就我而言,但足够接近。
Dave S.

1
@Oriol Nieto,非常感谢。python-all-dev也为我解决了这个问题。
shrawan_lakhe

14

如果您使用带有3.6 python的virtualenv(现在是edge),请确保安装匹配的python 3.6 dev sudo apt-get install python3.6-dev,否则执行sudo python3-dev将安装python dev 3.3.3-1,这将无法解决问题。


1
在3.5(.2)上对我来说也很棒。明确为您的Python版本安装正确的dev软件包是一件好事。
赛斯

13

情况不一样,但对我也适用,现在我可以在Python3.5中使用SWIG了:

我正在尝试编译:

gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/

使用Python 2.7可以正常工作,而不能用于我的3.5版本:

existe_wrap.c:147:21:致命错误:Python.h:没有存档或目录编译终止。

在我的Ubuntu 16.04安装中运行后:

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

现在,我可以毫无问题地编译Python3.5了:

gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/

11

我在ubuntu中安装coolprop时也遇到了此错误。

对于带有python 3.6的ubuntu 16.04

sudo apt-get install python3.6-dev

如果这不起作用,请尝试安装/更新gcclib。

sudo apt-get install gcc

1
天哪,我为此苦苦了很长时间,因为我已经跑了python3-dev很多遍了,并且不断遇到同样的错误,但是却一无所知python3.6-dev!谢谢!!
布莱尔

10

尝试apt文件。很难记住丢失文件所在的软件包名称。它是通用的,对任何软件包文件都有用。

例如:

root@ubuntu234:~/auto# apt-file search --regexp '/Python.h$'
pypy-dev: /usr/lib/pypy/include/Python.h
python2.7-dbg: /usr/include/python2.7_d/Python.h
python2.7-dev: /usr/include/python2.7/Python.h
python3.2-dbg: /usr/include/python3.2dmu/Python.h
python3.2-dev: /usr/include/python3.2mu/Python.h
root@ubuntu234:~/auto# 

现在,您可以对要选择的专家进行猜测。


10

我设法解决了这个问题,并在一个命令中生成了.so文件

gcc -shared -o UtilcS.so
-fPIC -I/usr/include/python2.7 -lpython2.7  utilsmodule.c

8

对于OpenSuse同志:

sudo zypper install python3-devel

8

对于CentOS 7:

sudo yum install python36u-devel

我按照此处的说明在多个VM上安装python3.6:https ://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming- 在centos-7上运行 ,然后能够构建mod_wsgi并使其与python3.6 virtualenv一起使用


5

如果您在Amazon Linux上使用Python 3.6(基于RHEL,但此处给出的RHEL答案无效):

sudo yum install python36-devel

4

当我尝试使用Python3.6在CentOS 7上安装ctds时发生此错误。我做了这里提到的所有技巧,包括yum install python34-devel。在Python.h中发现了问题/usr/include/python3.4m but not in /usr/include/python3.6m。我试图--global-option指向包含dir(pip3.6 install --global-option=build_ext --global-option="--include-dirs=/usr/include/python3.4m" ctds)的位置。导致在lpython3.6m链接ctds时找不到。

最后,有效的方法是修复Python3.6的开发环境,需要使用include和libs进行更正。

yum -y install https://dl.iuscommunity.org/pub/ius/stable/CentOS/7/x86_64/python36u-libs-3.6.3-1.ius.centos7.x86_64.rpm

Python.h必须位于gcc的包含路径中。无论使用哪个版本的python(例如,如果版本为3.6,则/usr/include/python3.6m/Python.h通常都应使用该版本)。


不知道为什么会有-1,但是从今天起,对于带有CentOS的python3.6,这是一个问题,因为python36-devel不可用。您需要从上面的URL安装它。
巴布Arunachalam

4

当然,python-dev还是libpython-all-devapt)的第一件事install,但是,如果这对我的情况没有帮助,我建议您通过和安装外部功能接口软件包。sudo apt-get install libffi-devsudo pip install cffi

如果您看到错误信息as / from,这应该会有所帮助c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory


sudo pip3 install cffi(#python3)
Magnus Melwin

3

当您尝试删除python3.5和安装时,它经常出现python3.6

因此,当使用python3(which python3 -V=> python3.6)安装某些软件包时,所需的python3.5标头将出现此错误。

通过安装python3.6-dev模块解决。


3
  1. 如果操作系统随附的Python不附带Python开发文件,则必须在其上安装Python开发文件。关于这个问题的许多答案显示了在不同系统上可以实现的无数种方法。

  2. 您这样做时,问题是告诉编译器它们的位置以及如何针对它们进行编译。Python附带了一个名为的程序python-config。对于编译,您需要--includes输出,并且需要将程序链接到Python库(将Python嵌入程序中)到--ldflags输出。例:

    gcc -c mypythonprogram.c $(python3-config --includes)
    gcc -o program mypythonprogram.o $(python3-config --ldflags)

python-config程序可以以Python版本命名-例如在Debian,Ubuntu上,它们可以命名为python3-configpython3.6-config


2

有时即使安装了python-dev之后,错误仍然存​​在,如果没有'gcc',请检查错误。

首先按照https://stackoverflow.com/a/21530768/8687063中的说明进行下载,然后安装gcc

对于apt(Ubuntu,Debian ...):

sudo apt-get install gcc

对于百胜(CentOS,RHEL ...):

sudo yum install gcc

对于dnf(Fedora ...):

sudo dnf install gcc

对于zypper(openSUSE ...):

sudo zypper in gcc

对于apk(高山...):

sudo apk gcc

1

这意味着它Python.h不在编译器的默认包含路径中。您在系统范围内还是在本地安装了它?您的操作系统是什么?

您可以使用该-I<path>标志指定编译器应在其中查找标头的其他目录。您可能需要跟进,-L<path>以便gcc可以找到要使用链接的库-l<name>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.