致命错误:Python.h:没有这样的文件或目录
我正在尝试使用C扩展名文件构build共享库,但首先必须使用以下命令生成输出文件:
gcc -Wall utilsmodule.c -o Utilc
执行命令后,我得到这个错误消息:
utilsmodule.c:1:20:致命错误:Python.h:没有这样的文件或目录编译终止。
实际上我已经尝试了所有在互联网上的build议解决scheme,但问题仍然存在…我也没有与Python.h
问题。 我设法find我的机器上的文件…任何人都面临同样的问题之前?
看起来你没有正确安装Python开发的头文件和静态库。 使用你的软件包pipe理器在系统范围内安装它们。
对于apt
( Ubuntu,Debian … ):
sudo apt-get install python-dev # for python2.x installs sudo apt-get install python3-dev # for python3.x installs
对于yum
( CentOS,RHEL … ):
sudo yum install python-devel
对于dnf
( Fedora … ):
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-devel
或python3-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-dev
是install
的第一件事,但是如果这样做对我来说没有帮助的话,我build议你通过sudo apt-get install libffi-dev
安装外部函数接口包sudo apt-get install libffi-dev
和pip 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
。