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

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

gcc -Wall utilsmodule.c -o Utilc 

执行命令后,我得到这个错误消息:

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

实际上我已经尝试了所有在互联网上的build议解决scheme,但问题仍然存在…我也没有与Python.h问题。 我设法find我的机器上的文件…任何人都面临同样的问题之前?

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

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

对于dnfFedora … ):

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

在Ubuntu上,我正在运行Python 3,我不得不安装

 sudo apt-get install python3-dev 

你必须做两件事。

安装Python开发包,以Debian / Ubuntu / Mint为例:

 sudo apt-get install python-dev 

第二件事是包含文件在包含path中不是默认的,Python库也默认与可执行文件链接。 你需要添加这些标志(相应地replacePython的版本):

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

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

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

如果你正在使用树莓派:

 sudo apt-get install python-dev 

在Fedora上运行Python 2:

 sudo dnf install python2-devel 

和Python 3:

 sudo dnf install python3-devel 

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

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

在AWS API(centOS)中

 yum install python27-devel 

我还想为Cygwin添加解决scheme:

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

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

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

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

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

对我来说,改变它到这个工作:

 #include <python2.7/Python.h> 

我find了/usr/include/python2.7/Python.h这个文件,因为/usr/include已经在包含path中,那么python2.7/Python.h就足够了。

你也可以从命令行添加包含path – gcc -I/usr/lib/python2.7 (谢谢@ erm3nda)。

确保Python开发文件随操作系统一起提供。

你不应该硬编码库和包括path。 相反,请使用pkg-config,它将为您的特定系统输出正确的选项:

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

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

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

在我的情况下,在Ubuntu中修复的是安装libpython-all-dev软件包(如果使用Python 3,则安装libpython-all-dev )。

AWS EC2安装运行python34:

sudo yum install python34-devel

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

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

如果你使用一个3.6 python的virtualenv(现在边缘),一定要安装匹配的python 3.6 dev sudo apt-get install python3.6-dev ,否则执行sudo python3-dev会安装python dev 3.3.3- 1,这不会解决问题。

对于OpenSuse同志们来说:

 sudo zypper install python3-devel 

这是不一样的情况,但它也适用于我,现在我可以用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/ 

尝试apt-file。 记住丢失的文件所在的包名是很困难的。 它对任何包文件都是通用的和有用的。

例如:

 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# 

现在你可以让专家猜测哪一个可以select。

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

您可以使用-I<path>标志来指定编译器应该查找标题的附加目录。 您可能需要跟进-L<path>以便gcc可以使用-l<name>find要链接的库。

当然, python-dev或者libpython-all-devinstall的第一件事,但是如果这样做对我来说没有帮助的话,我build议你通过sudo apt-get install libffi-dev安装外部函数接口sudo apt-get install libffi-devpip install cffi

这应该有所帮助,特别是如果你看到错误/从c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory

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

最后,修复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的path中。 无论使用哪种版本的Python,例如,如果它是3.6,那么通常应该在/usr/include/python3.6m/Python.h