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

Moh*_* Y. 1042 python gcc python-c-api python-c-extension

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

gcc -Wall utilsmodule.c -o Utilc
Run Code Online (Sandbox Code Playgroud)

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

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

事实上我已经通过互联网尝试了所有建议的解决方案,但问题仍然存在...我也没有问题Python.h.我设法在我的机器上找到该文件......任何人在遇到同样的问题之前?

wim*_*wim 1966

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

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

sudo apt-get install python-dev   # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs
Run Code Online (Sandbox Code Playgroud)

对于yum(CentOS,RHEL ......):

sudo yum install python-devel   # for python2.x installs
sudo yum install python3-devel   # for python3.x installs
Run Code Online (Sandbox Code Playgroud)

对于dnf(Fedora ......):

sudo dnf install python2-devel  # for python2.x installs
sudo dnf install python3-devel  # for python3.x installs
Run Code Online (Sandbox Code Playgroud)

对于zypper(openSUSE ...):

sudo zypper in python-devel   # for python2.x installs
sudo zypper in python3-devel  # for python3.x installs
Run Code Online (Sandbox Code Playgroud)

对于apk(阿尔卑斯山......):

# 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
Run Code Online (Sandbox Code Playgroud)

对于apt-cyg(Cygwin ......):

apt-cyg install python-devel   # for python2.x installs
apt-cyg install python3-devel  # for python3.x installs
Run Code Online (Sandbox Code Playgroud)

  • 我在14.04使用python3.6`apt-get install python3.6-dev`为我工作. (13认同)
  • 尝试`找到Python.h`,看看你是否已经拥有该文件,然后才能完成所有这些工作.如果你能找到找到的文件,那么这个答案大多数都可行:stackoverflow.com/a/19344978/4954434(这可能只是一个路径问题) (12认同)
  • 同样地,使用sudo apt-get install python3.7-dev。 (10认同)
  • 看来我们需要安装特定的 python(2-3)-dev 版本。3.11 的示例:`sudo apt-get install python3.11-dev`。只有这个对我有用。 (5认同)
  • 我工作得很好(ubuntu 14.04),但必须指定完整的版本号`sudo apt-get install python3.6-dev` (4认同)
  • 如果我们在机器上没有 su 访问权限怎么办?我正在具有本地用户授权的虚拟环境中工作。是否有任何类似“pip”的修复可用,或者我们可以在某个地方手动放置 Python.h 的副本? (3认同)
  • @ Hack-R和其他人如果安装了Python 2.6*和*2.7,"python-devel"只会安装2.6的开发库.要强制它安装2.7库,请使用`sudo yum install python27-devel` (2认同)

Fre*_*Pow 300

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

sudo apt-get install python3-dev
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get install python3.5-dev
Run Code Online (Sandbox Code Playgroud)

  • 我为Python3.4运行了命令`sudo apt-get install python3.4-dev`,这解决了我的问题. (29认同)
  • 如果您使用具有不同 python 版本的虚拟环境,请确保在安装必要的开发包后创建虚拟环境。否则头文件将无法正确复制。 (9认同)
  • 我还要为这个答案添加一个东西 - 如果你有多个Python 3.x版本,`python3-dev`将为那个链接到`python3`命令的版本安装依赖项.因此,如果要为特定版本安装,请使用完整版本,例如 - `python3.x-dev`. (6认同)
  • @Rawrgulmuffins这取决于你使用的是哪个版本的python.在我的情况下,`sudo apt-get install python2.7-dev`解决了这个问题 (4认同)
  • 这有助于在Ubuntu 14.04上使用python 3.6.3`sudo apt-get install python3.6-dev` (3认同)

var*_*tec 63

你需要做的两件事.

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

sudo apt-get install python-dev
Run Code Online (Sandbox Code Playgroud)

第二件事是包含文件默认情况下不包含在include路径中,默认情况下Python库也不与可执行文件链接.您需要添加这些标志(相应地替换Python的版本):

-I/usr/include/python2.7 -lpython2.7 
Run Code Online (Sandbox Code Playgroud)

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

gcc -Wall -I/usr/include/python2.7 -lpython2.7  utilsmodule.c -o Utilc 
Run Code Online (Sandbox Code Playgroud)


Mal*_*zar 47

如果您使用的是Raspberry Pi:

sudo apt-get install python-dev
Run Code Online (Sandbox Code Playgroud)

  • 这适用于任何基于apt的分发:) +1 (3认同)

rav*_*bie 34

在Fedora上为Python 2运行这个:

sudo dnf install python2-devel
Run Code Online (Sandbox Code Playgroud)

对于Python 3:

sudo dnf install python3-devel
Run Code Online (Sandbox Code Playgroud)

  • 我的CentOS成功应用此命令 (5认同)

Chr*_*ong 29

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

sudo apt-get install python2.6-dev 
sudo apt-get install python2.7-dev 
etc.
Run Code Online (Sandbox Code Playgroud)


Daw*_*žan 27

Cygwin的解决方案

您需要安装软件包,python2-devel或者python3-devel根据您使用的Python版本进行安装.

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

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

$ setup.exe -q --packages=python3-devel
Run Code Online (Sandbox Code Playgroud)

您还可以查看我的其他答案以获取更多选项,以便从命令行安装Cygwin的软件包.


小智 22

在AWS API(centOS)中

yum install python27-devel
Run Code Online (Sandbox Code Playgroud)

  • @Wtower是的,确实提供了答案. (2认同)

ijo*_*eph 21

For Python 3.7 and Ubuntu in particular, I needed

sudo apt install libpython3.7-dev

. I think at some point names were changed from pythonm.n-dev to this.

  • Python 3.10 也一样 (6认同)

Mil*_*ilo 21

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

当我尝试pip 安装与应用程序捆绑在一起的 Python 包时,就发生了这种情况。由于它不是系统的python,所以apt install pythonXX-dev不起作用。

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

find / -iname 'Python.h'
Run Code Online (Sandbox Code Playgroud)

在输出中,您将看到系统 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
Run Code Online (Sandbox Code Playgroud)

然后,您可以设置一个编译器标志,当 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/Include
pip install <package>
Run Code Online (Sandbox Code Playgroud)

  • 这是最致命的答案!首先搜索您的系统,而不是随机安装新的依赖项。 (3认同)
  • 谢谢,这给了我所需的提示 - 我需要安装 python3.8-dev :) (2认同)

sas*_*alm 19

对我来说,改变它是有效的:

#include <python2.7/Python.h>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 所有其他答案都告诉你安装一些东西.这个对我有用.为什么这不是最佳答案? (4认同)
  • @uoɥʇʎPʎzɐɹC 也许是因为它不会在python3下运行? (2认同)
  • @noɥʇʎԀʎzɐɹƆ 因为它应该可以在不更改代码的情况下工作。你经常需要编译一个不属于你的代码,例如一些外部依赖,你能做的最糟糕的事情就是修改该代码。 (2认同)

sle*_*anc 16

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

您不应该对库进行硬编码并包含路径.相反,使用pkg-config,它将为您的特定系统输出正确的选项:

$ pkg-config --cflags --libs python2 -I/usr/include/python2.7 -lpython2.7
Run Code Online (Sandbox Code Playgroud)

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

gcc -Wall utilsmodule.c -o Utilc $(pkg-config --cflags --libs python2) 
Run Code Online (Sandbox Code Playgroud)


ors*_*ady 16

运行python34的AWS EC2安装:

sudo yum install python34-devel


Ori*_*eto 14

在我的例子中,在Ubuntu中修复它的是安装包libpython-all-dev(或者libpython3-all-dev如果你使用Python 3).

  • `python-all-dev`在我的情况下,但足够接近. (2认同)

Hug*_*L.M 13

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

我试图编译:

gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
Run Code Online (Sandbox Code Playgroud)

使用Python 2.7工作正常,而不是我的版本3.5:

existe_wrap.c:147:21:致命错误:Python.h:没有existe el archivo o el directorio编译终止.

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

sudo apt-get install python3-dev  # for python3.x installs
Run Code Online (Sandbox Code Playgroud)

现在我可以编译没有问题Python3.5:

gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
Run Code Online (Sandbox Code Playgroud)


Gui*_*sco 12

如果你使用带有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,这将无法解决问题.


Wre*_*cks 11

我在ubuntu中安装coolprop时遇到了这个错误.

对于带有python 3.6的ubuntu 16.04

sudo apt-get install python3.6-dev
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get install gcc
Run Code Online (Sandbox Code Playgroud)


ser*_*g06 11

这是另一个解决方案,因为这些解决方案都不适合我。作为参考,我尝试pip install在适用于 Python 3.6 的 Amazon Linux AMI 基础 Docker 映像上进行一些操作。

非docker解决方案:

# Install python3-devel like everyone says
yum -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 path
C_INCLUDE_PATH='/usr/include/python3.6m'
export C_INCLUDE_PATH
Run Code Online (Sandbox Code Playgroud)

码头解决方案:

# Install python3-devel like everyone says
RUN yum -y install python36-devel.x86_64

# Find the install directory of `Python.h`, for me it was /usr/include/python3.6m
RUN 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 path
ARG C_INCLUDE_PATH='/usr/include/python3.6m'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 准确解决我的问题,谢谢! (2认同)

Moh*_* Y. 10

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

gcc -shared -o UtilcS.so
-fPIC -I/usr/include/python2.7 -lpython2.7  utilsmodule.c
Run Code Online (Sandbox Code Playgroud)


Ven*_*zir 9

尝试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# 
Run Code Online (Sandbox Code Playgroud)

现在,您可以专门猜测哪一个可供选择.


kmo*_*oor 8

对于那里的OpenSuse同志:

sudo zypper install python3-devel
Run Code Online (Sandbox Code Playgroud)


小智 8

对于CentOS 7:

sudo yum install python36u-devel
Run Code Online (Sandbox Code Playgroud)

我按照这里的说明在几个虚拟机上安装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 virtualenv


Yig*_*gal 8

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

sudo yum install python36-devel
Run Code Online (Sandbox Code Playgroud)


Ant*_*ala 6

  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)
    
    Run Code Online (Sandbox Code Playgroud)

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


Hug*_*uge 5

当然python-dev或者libpython-all-dev是 ( apt)的第一件事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


gem*_*eld 5

尝试找到你的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
Run Code Online (Sandbox Code Playgroud)

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

g++ -I/usr/include/python3.8 ...
Run Code Online (Sandbox Code Playgroud)


小智 5

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

sudo apt-get install python-dev   # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs
Run Code Online (Sandbox Code Playgroud)

我仍然遇到这个问题,行:

#include "Python.h"
Run Code Online (Sandbox Code Playgroud)

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

make all
Run Code Online (Sandbox Code Playgroud)

用于创建独立 Cython 程序的 Makefile

    FILE := file.c
    PYTHON := python3
    PYVERSION := $(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 import 
    sysconfig; 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=)
Run Code Online (Sandbox Code Playgroud)