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

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

gcc -Wall utilsmodule.c -o Utilc

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

> utilsmodule.c:1:20: fatal error: Python.h: No such file or directorycompilation terminated.

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

1505019 次浏览

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

对于aptUbuntu,Debian…):

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

对于yumCentOS RHEL…):

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

对于dnfFedora…):

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

对于zypperOpenSUSE…):

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

对于apk高山…):

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

对于apt-cygCygwin…):

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

备注: python3-dev不会自动涵盖python3的所有次要版本,如果您使用的是python 3.8,您可能需要安装python3.8-dev。

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

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

有两件事你必须做。

安装Python开发包,如果是Debian/Ubuntu/Mint,则使用命令完成:

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

确保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)

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

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

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

sudo apt-get install python3-dev

如果您想使用未链接到python3的Python版本,请安装相关的python3. x-dev包。例如:

sudo apt-get install python3.5-dev

对于OpenSuse的同志们:

sudo zypper install python3-devel

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

sudo apt-get install python2.6-devsudo apt-get install python2.7-devetc.

在Fedora上运行Python 2:

sudo dnf install python2-devel

对于Python 3:

sudo dnf install python3-devel

在AWS API(centOS)中

yum install python27-devel

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

例如:

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

现在你可以做一个专家猜测从哪一个选择。

对我来说,把它改成这样是有效的:

#include <python2.7/Python.h>

我找到了文件/usr/include/python2.7/Python.h,由于/usr/include已经在包含路径中,那么python2.7/Python.h应该就足够了。

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

在我的例子中,在Ubuntu中修复它的是安装包libpython-all-dev(如果您使用Python 3,则为libpython3-all-dev)。

当然python-devlibpython-all-dev是(aptinstall的第一件事,但如果这对我的情况没有帮助,我建议您在sudo apt-get install libffi-devsudo pip install cffi之前安装外部函数接口包。

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

运行python34的AWS EC2安装:

sudo yum install python34-devel

解决方案Cygwin

您需要安装包#0或#1,具体取决于您使用的Python版本。

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

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

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

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

如果您使用带有3.6 python(现在边缘)的虚拟环境,请务必安装匹配的python 3.6 devsudo apt-get install python3.6-dev,否则执行sudo python3-dev将安装python dev 3.3.3-1,这不会解决问题。

这不是相同的情况,但它也适用于我,现在我可以使用SWIGPython3.5

我试图编译:

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:没有存档Directorio编译终止。

在我的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/

当我尝试使用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)。这导致在链接ctds时找不到lpython3.6m

最后,有效的是修复Python3.6的开发环境需要使用包含和库进行更正。

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中。

对于CentOS 7:

sudo yum install python36u-devel

我按照这里的说明在几个虚拟机上安装python3.6:https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-centos-7然后能够构建mod_wsgi并让它与python3.6虚拟环境一起工作

如果您在AmazonLinux上使用Python 3.6(基于RHEL,但此处给出的RHEL答案不起作用):

sudo yum install python36-devel

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

所以当使用python3(其中python3 -V=>python3.6)安装一些包时,需要python3.5标头就会出现这个错误。

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

我在ubuntu中安装Coolprop时也遇到了这个错误。

对于带有python 3.6的ubuntu 16.04

sudo apt-get install python3.6-dev

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

sudo apt-get install gcc

有时甚至在安装python-dev后错误仍然存在,如果缺少“gcc”,请检查错误。

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

对于apt(Ubuntu、Debian…):

sudo apt-get install gcc

对于yum(CentOS、RHEL…):

sudo yum install gcc

对于dnf(Fedora…):

sudo dnf install gcc

对于zypper(openSUSE…):

sudo zypper in gcc

对于apk(高山…):

sudo apk gcc
  1. 如果您的操作系统没有附带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)

The python-config program can be named after the Python versions - on Debian, Ubuntu for example these can be named python3-config or python3.6-config.

对于python3.7ubuntu,我需要

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

尝试找到您的Python. h:

gemfield@ThinkPad-X1C:~$ locate Python.h/home/gemfield/anaconda3/include/python3.7m/Python.h/home/gemfield/anaconda3/pkgs/python-3.7.6-h0371630_2/include/python3.7m/Python.h/usr/include/python3.8/Python.h

如果未找到,则安装python-dev或python3-dev;否则包括编译器的正确标头路径:

g++ -I/usr/include/python3.8 ...

如果您使用cmake构建项目,您可以使用此示例。

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})

这里还有另一个解决方案,因为这些解决方案都不适合我。作为参考,我试图在亚马逊LinuxPython 3.6的AMI基础Docker映像上pip install一些东西。

非docker解决方案:

# Install python3-devel like everyone saysyum -y install python36-devel.x86_64
# Find the install directory of `Python.h`rpm -ql python36-devel.x86_64 | grep -i "Python.h"
# Forcefully add it to your include pathC_INCLUDE_PATH='/usr/include/python3.6m'export C_INCLUDE_PATH

Docker解决方案:

# Install python3-devel like everyone saysRUN yum -y install python36-devel.x86_64
# Find the install directory of `Python.h`, for me it was /usr/include/python3.6mRUN rpm -ql python36-devel.x86_64 | grep -i "Python.h" && fake_command_so_docker_fails_and_shows_us_the_output
# Since the previous command contains a purposeful error, remove it before the next run
# Forcefully add it to your include pathARG C_INCLUDE_PATH='/usr/include/python3.6m'

注意:如果您在编译C++时收到错误,请使用CPLUS_INCLUDE_PATH

或者,您可能更喜欢使用另一个Docker映像。例如,我试图在python:3.9.4-slim上安装asyncpg~=0.24.0,它产生了与您看到的相同的错误。然而,当我将映像更新为python:3时,它工作正常。

当您安装了不同的Python版本并且使用的pip不是系统版本时,也会出现此问题。在这种情况下,非系统pip找不到正确版本的Python标头。

当我尝试pip安装与应用程序捆绑的Python包时发生了这种情况。因为它不是系统的python,apt安装pythonXX-dev不起作用。

在这种情况下,解决方案是找到正确的python标头:

find / -iname 'Python.h'

在输出中,您将看到系统python标题,希望是您正在寻找的标题,例如:

/usr/include/python3.7m/Python.h/usr/include/python3.6m/Python.h/home/ubuntu/workspace/blender-git/lib/linux_centos7_x86_64/python/include/python3.7m/Python.h/home/ubuntu/miniconda3/pkgs/python-3.8.5-h7579374_1/include/python3.8/Python.h/home/ubuntu/miniconda3/pkgs/python-3.7.0-h6e4f718_3/include/python3.7m/Python.h/home/ubuntu/miniconda3/include/python3.8/Python.h/home/ubuntu/miniconda3/envs/sim/include/python3.7m/Python.h/home/ubuntu/src/blender-deps/Python-3.7.7/Include/Python.h/opt/lib/python-3.7.7/include/python3.7m/Python.h

然后,您可以设置一个编译器标志,当pip调用时,gcc将使用该标志。我的 /home/ubuntu/workspace/blender-git/lib/linux_centos7_x86_64/python/include/python3.7m/Python.h,所以我做了:

export CPPFLAGS=-I/home/ubuntu/src/blender-deps/Python-3.7.7/Includepip install <package>

我遇到的情况是我的Python.h在目录/usr/include/python3.8/usr/include/python2.7中,只需将gcc的路径像-I /usr/include/python3.8一样给出。

我在ubuntu上。我已经按照一些答案中的建议安装了所有软件包。

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

我仍然有这个问题,线:

#include "Python.h"

还有一些,我可以手动编辑它们,这是一个糟糕的做法。我现在知道秘密了,它来自cython源代码。我有文件。它编译时没有错误。那就是文件。将PYTHON更改为您拥有的python版本,python/python3。将FILE更改为您的c文件名。makefile文件的名称应为Makefile。使用命令运行文件:

make all

用于创建我们的独立Cython程序的Makefile

    FILE := file.cPYTHON := python3PYVERSION := $(shell $(PYTHON) -c "import sys;print(sys.version[:3])")PYPREFIX := $(shell $(PYTHON) -c "import sys; print(sys.prefix)")
INCDIR := $(shell $(PYTHON) -c "from distutils import sysconfig;print(sysconfig.get_python_inc())")PLATINCDIR := $(shell $(PYTHON) -c "from distutils importsysconfig; print(sysconfig.get_python_inc(plat_specific=True))")LIBDIR1 := $(shell $(PYTHON) -c "from distutils import sysconfig;print(sysconfig.get_config_var('LIBDIR'))")LIBDIR2 := $(shell $(PYTHON) -c "from distutils import sysconfig;print(sysconfig.get_config_var('LIBPL'))")PYLIB := $(shell $(PYTHON) -c "from distutils import sysconfig;print(sysconfig.get_config_var('LIBRARY')[3:-2])")
CC := $(shell $(PYTHON) -c "import distutils.sysconfig;print(distutils.sysconfig.get_config_var('CC'))")LINKCC := $(shell $(PYTHON) -c "import distutils.sysconfig;print(distutils.sysconfig.get_config_var('LINKCC'))")LINKFORSHARED := $(shell $(PYTHON) -c "import distutils.sysconfig;print(distutils.sysconfig.get_config_var('LINKFORSHARED'))")LIBS := $(shell $(PYTHON) -c "import distutils.sysconfig;print(distutils.sysconfig.get_config_var('LIBS'))")SYSLIBS :=  $(shell $(PYTHON) -c "import distutils.sysconfig;print(distutils.sysconfig.get_config_var('SYSLIBS'))")
.PHONY: paths all clean test
paths:@echo "PYTHON=$(PYTHON)"@echo "PYVERSION=$(PYVERSION)"@echo "PYPREFIX=$(PYPREFIX)"@echo "INCDIR=$(INCDIR)"@echo "PLATINCDIR=$(PLATINCDIR)"@echo "LIBDIR1=$(LIBDIR1)"@echo "LIBDIR2=$(LIBDIR2)"@echo "PYLIB=$(PYLIB)"@echo "CC=$(CC)"@echo "LINKCC=$(LINKCC)"@echo "LINKFORSHARED=$(LINKFORSHARED)"@echo "LIBS=$(LIBS)"@echo "SYSLIBS=$(SYSLIBS)"
$(FILE:.c=): $(FILE:.c=.o)$(LINKCC) -o $@ $^ -L$(LIBDIR1) -L$(LIBDIR2) -l$(PYLIB)$(LIBS) $(SYSLIBS) $(LINKFORSHARED)
$(FILE:.c=.o): $(FILE)$(CC) -c $^ -I$(INCDIR) -I$(PLATINCDIR)
all: $(FILE:.c=)

确认如果您运行的是centos 8+。您将需要运行以下内容:

sudo yum -y install python36 python38 python39sudo yum -y install python36-devel.x86_64 python38-devel.x86_64 python39-devel.x86_64
pip3.8 install cpythonpip3.9 install cpythonpip3.6 install cpython

如果您已经安装了Python,并且想要链接到特定的Python版本,您可以从Python获取相关的包含路径。

>>> import sysconfig>>> sysconfig.get_path('include')'/usr/include/python3.10' # Example output

您可以使用外壳脚本手动指定针对特定python版本的包含路径/构建:

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

安装python-dev python3-dev后,仍会报告此错误。所以我强制设置标题路径。在我的系统中,python 3头路径 /usr/include/python3.8所以C_INCLUDE_PATH=/us r/包括/python 3.8/:/us r/包括:/us r/本地/包括:/t mp出口C_INCLUDE_PATH编译通过。