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

时间:2014-02-03 15:00:17

标签: python gcc python-c-api python-c-extension

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

gcc -Wall utilsmodule.c -o Utilc

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

  

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

事实上我已经在互联网上尝试了所有建议的解决方案,但问题仍然存在......我对Python.h没有任何问题。我设法在我的机器上找到了这个文件......任何人都面临同样的问题吗?

31 个答案:

答案 0 :(得分:1727)

看起来你没有正确安装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

对于yum CentOS,RHEL ... ):

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

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

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

zypper openSUSE ... ):

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

对于apk Alpine ... ):

# 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-cyg Cygwin ... ):

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

答案 1 :(得分:268)

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

sudo apt-get install python3-dev

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

sudo apt-get install python3.5-dev

答案 2 :(得分:60)

你必须做的两件事。

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

sudo apt-get install python-dev

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

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

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

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

答案 3 :(得分:46)

如果您使用的是Raspberry Pi:

sudo apt-get install python-dev

答案 4 :(得分:34)

Fedora上的

为Python 2运行它:

sudo dnf install python3-devel

和Python 3:

scala> Vector(1)
res0: scala.collection.immutable.Vector[Int] = Vector(1)

scala> res0 :+ "fish"
res1: scala.collection.immutable.Vector[Any] = Vector(1, fish)

答案 5 :(得分:29)

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

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

答案 6 :(得分:25)

Cygwin

的解决方案

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

您可以使用32-bit中的64-bitCygwin.com setup.exe(取决于您的安装)快速安装它。

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

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

您还可以查看我的other answer以获取更多选项,以便从命令行安装Cygwin的软件包。

答案 7 :(得分:21)

对于 Python 3.7 ,尤其是Ubuntu,我需要

sudo apt install libpython3.7-dev

。 我认为有时名称已从pythonm.n-dev更改为此。

答案 8 :(得分:21)

在AWS API(centOS)中

yum install python27-devel

答案 9 :(得分:20)

对我而言,改变它是有效的:

#include <python2.7/Python.h>

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

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

答案 10 :(得分:15)

运行python34的AWS EC2安装:

sudo yum install python34-devel

答案 11 :(得分:14)

确保您的操作系统附带Python dev文件。

您不应该对库进行硬编码并包含路径。相反,请使用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

答案 12 :(得分:13)

这不是同样的情况,但它也适用于我,现在我可以使用 SWIG Python3.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:没有existe el archivo o el   导演编辑终止。

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

答案 13 :(得分:13)

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

答案 14 :(得分:12)

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

答案 15 :(得分:11)

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

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

答案 16 :(得分: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# 

现在你可以专门猜测哪一个可以选择。

答案 17 :(得分:8)

对于那里的OpenSuse同志:

sudo zypper install python3-devel

答案 18 :(得分: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-environment-on-centos-7 然后能够构建mod_wsgi并使用python3.6 virtualenv

答案 19 :(得分:8)

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

对于带有python 3.6的ubuntu 16.04

sudo apt-get install python3.6-dev

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

sudo apt-get install gcc

答案 20 :(得分:4)

当然09 12 2016 09:13:48.987:WARN [karma]: No captured browser, open http://localhost:9876/ 09 12 2016 09:13:49.008:INFO [karma]: Karma v1.2.0 server started at http://localhost:9876/ 09 12 2016 09:13:49.010:INFO [launcher]: Launching browser Chrome with unlimited concurrency 09 12 2016 09:13:49.420:INFO [launcher]: Starting browser Chrome 09 12 2016 09:13:58.642:INFO [Chrome 54.0.2840 (Windows 7 0.0.0)]: Connected on socket /#QZ9LSSUVeK6KwNDlAAAA with id 46830907 Failed: Unexpected value 'FormBuilder' imported by the module 'DynamicTestModule' Error: Unexpected value 'FormBuilder' imported by the module 'DynamicTestModule' python-dev是(libpython-all-devapt的第一件事,但如果这对我的情况没有帮助,我建议您安装installsudo apt-get install libffi-dev外部函数接口包。

如果您将错误视为/ sudo pip install cffi

,这应该会有所帮助

答案 21 :(得分:4)

当我尝试使用Python3.6在CentOS 7上安装ctds时发生此错误。我做了这里提到的所有技巧,包括Python.h。问题是在/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指向包含目录(lpython3.6m)。这导致在链接ctds时找不到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

最后有效的是修复Python3.6的开发环境需要用include和lib来纠正。

/usr/include/python3.6m/Python.h

Python.h需要位于gcc的包含路径中。无论使用哪种版本的python,例如,如果它是3.6,那么它通常应该在init() { books = [Book]() //empty list totalbooks = 0 gross = 0.0 } 中。

答案 22 :(得分:2)

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

sudo yum install python36-devel

答案 23 :(得分:2)

通常会在您尝试删除python3.5并安装python3.6时显示。

因此,当使用python3python3 -V =&gt; python3.6)来安装某些必需的包时,python3.5标题会出现此错误。

按安装python3.6-dev模块解析。

答案 24 :(得分:2)

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

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

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

upstream jessered {
    server 127.0.0.1:3000;
}

server {

    server_name jesse.red www.jesse.red;
    root /var/www/jesse.red/;

    # ---------------------------------------------------------------
    # Location
    # ---------------------------------------------------------------
    location / {
        proxy_pass          http://jessered;
        #proxy_http_version  1.1;                                                       
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection 'upgrade';
        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_cache_bypass  $http_upgrade;
        proxy_read_timeout  90;
    }

    # ---------------------------------------------------------------
    # SSL
    # ---------------------------------------------------------------
    listen 443 ssl http2; # managed by Certbot
    gzip off;

    ssl_certificate /etc/letsencrypt/live/www.jesse.red/fullchain.pem; # managed by Certbot  
    ssl_certificate_key /etc/letsencrypt/live/www.jesse.red/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    error_log /var/www/errors/jesse.red.error.log;
}

# ---------------------------------------------------------------
# Force SSL
# ---------------------------------------------------------------
server {
    if ($host = www.jesse.red) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = jesse.red) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
}


# ---------------------------------------------------------------
# Remove Non-www
# ---------------------------------------------------------------
server {
  listen 443 ssl http2;
  server_name www.jesse.red;
  return 301 $scheme://jesse.red$request_uri;
}

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

sudo apt-get install gcc

对于dnf(Fedora ...):

sudo yum install gcc

对于zypper(openSUSE ...):

sudo dnf install gcc

对于apk(高山...):

sudo zypper in gcc

答案 25 :(得分:2)

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

非 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

Docker 解决方案:

# 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'

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

答案 26 :(得分:1)

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

当我尝试 pip install 与应用程序捆绑的 Python 包时发生了这种情况。由于它不是系统的 python,apt install 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/Include
pip install <package>

答案 27 :(得分:1)

尝试找到您的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 ...

答案 28 :(得分:1)

  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)
    

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

答案 29 :(得分:1)

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

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

答案 30 :(得分:0)

如果你使用 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})