【问题标题】:fatal error: Python.h: No such file or directory致命错误:Python.h:没有这样的文件或目录
【发布时间】:2021-09-19 10:24:51
【问题描述】:

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

gcc -Wall utilsmodule.c -o Utilc

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

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

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

【问题讨论】:

    标签: python gcc python-c-api


    【解决方案1】:

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

    对于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    # for python2.x installs
    sudo yum install python3-devel   # for python3.x installs
    

    对于dnfFedora...):

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

    对于zypperopenSUSE...):

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

    对于apkAlpine...):

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

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

    【讨论】:

    • 注意:python3-dev 不会自动覆盖所有次要版本的 python3,如果你使用例如python 3.8 你可能需要安装 python3.8-dev
    • Arch Linux 怎么样?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你必须做的两件事。

      安装 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 
      

      【讨论】:

      • 是否必须为 C 扩展文件中的每个包含文件添加标志??
      • 如果您使用的是其他版本的 Python,例如 3.3:sudo apt-get install python3.3-dev
      【解决方案4】:

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

      【讨论】:

      • 我在 RHEL 上收到以下错误消息:“未知选项 -I/usr/include/python2.7”
      • @FedorSteeman,有人编辑了我的答案并从命令中删除了换行符。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        sudo apt-get install python3-dev
        

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

        sudo apt-get install python3.5-dev
        

        【讨论】:

          【解决方案7】:

          对于 OpenSuse 的同志们:

          sudo zypper install python3-devel
          

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              在 Fedora 上为 Python 2 运行这个:

              sudo dnf install python2-devel
              

              对于 Python 3:

              sudo dnf install python3-devel
              

              【讨论】:

              • 在 Mint 18.2(基于 Ubuntu)上,它是 apt-get install python-dev
              【解决方案10】:

              在 AWS API (centOS) 中

              yum install python27-devel
              

              【讨论】:

              • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
              • @Wtower 是的,它确实提供了答案。
              • 它确实提供了答案。尽管您必须将版本替换为您需要的版本。
              • 这有助于克服我在亚马逊 Linux 实例上尝试 pip install cryptography 时遇到的问题。
              • 这是一个有用的答案,虽然可以在 Amazon Linux 上安装 python-devel 或 python2-devel,但在 virtualenv 中运行 pip install 时,这是唯一对我有效的方法
              【解决方案11】:

              尝试 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# 
              

              现在您可以做出专家猜测,选择哪一种。

              【讨论】:

                【解决方案12】:

                对我来说,将其更改为有效:

                #include <python2.7/Python.h>
                

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

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

                【讨论】:

                • 所有其他答案都告诉你安装一些东西。这个对我有用。为什么这不是最佳答案?
                • @uoɥʇʎPʎzɐɹC 也许是因为它不会在python3下运行?
                • 最好将库设置为gcc -I/usr/lib/python2.7 etc,而不是硬编码包含调用。
                • @noɥʇʎԀʎzɐɹƆ 因为它应该可以在不更改代码的情况下工作。您经常需要编译不属于您的代码,例如一些外部依赖项,而您能做的最糟糕的事情就是修改该代码。
                • @DawidFerenczy 了解。
                【解决方案13】:

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

                【讨论】:

                • python-all-dev 在我的情况下,但足够接近。
                • @Oriol Nieto,非常感谢。 python-all-dev 也为我解决了这个问题。
                【解决方案14】:

                当然 python-devlibpython-all-dev 是 (apt )install 的第一件事,但如果这对我的情况没有帮助,我建议您安装 foreign Function Interface sudo apt-get install libffi-devsudo pip install cffi 打包。

                这应该会有所帮助,尤其是当您看到/来自c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory 的错误时。

                【讨论】:

                • sudo pip3 install cffi (# for python3)
                【解决方案15】:

                运行 python34 的 AWS EC2 安装:

                sudo yum install python34-devel

                【讨论】:

                  【解决方案16】:

                  Cygwin 的解决方案

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

                  您可以使用来自Cygwin.com32-bit64-bit setup.exe(取决于您的安装)快速安装它。

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

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

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

                  【讨论】:

                    【解决方案17】:

                    如果你使用带有 3.6 python (edge) 的 virtualenv,请务必安装匹配的 python 3.6 dev sudo apt-get install python3.6-dev,否则执行 sudo python3-dev 将安装 python dev 3.3.3-1,它不会'解决不了问题。

                    【讨论】:

                    • 在 3.5(.2) 上也非常适合我。为您的 Python 版本显式安装正确的开发包是一件好事。
                    【解决方案18】:

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

                    【讨论】:

                      【解决方案19】:

                      当我尝试使用 Python3.6 在 CentOS 7 上安装 ctds 时出现此错误。我做了这里提到的所有技巧,包括yum install python34-devel。问题是在/usr/include/python3.4m but not in /usr/include/python3.6m 中发现了Python.h。我尝试使用--global-option 指向包含目录(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 中。

                      【讨论】:

                      • 不知道为什么会有-1,但是对于带有CentOS的python3.6来说这是一个问题,因为python36-devel不可用。您需要从上面的 URL 安装它。
                      【解决方案20】:

                      对于 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 一起工作

                      【讨论】:

                        【解决方案21】:

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

                        sudo yum install python36-devel
                        

                        【讨论】:

                        • 感谢您的评论,它拯救了一天!
                        【解决方案22】:

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

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

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

                        【讨论】:

                          【解决方案23】:

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

                          对于 ubuntu 16.04 和 python 3.6

                          sudo apt-get install python3.6-dev
                          

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

                          sudo apt-get install gcc
                          

                          【讨论】:

                          • omg,我为此苦苦挣扎了这么久,因为我已经运行了很多次python3-dev 并且一直收到相同的错误,但不知道python3.6-dev!谢谢!!
                          【解决方案24】:

                          有时即使在安装 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(Alpine...):

                          sudo apk gcc
                          

                          【讨论】:

                            【解决方案25】:
                            1. 如果您的操作系统没有随附 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

                            【讨论】:

                              【解决方案26】:

                              特别是对于 Python 3.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 3.10 相同
                              【解决方案27】:

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

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

                              【讨论】:

                                【解决方案29】:

                                这是另一种解决方案,因为这些解决方案都不适合我。作为参考,我试图在 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

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

                                【讨论】:

                                • 我的问题的确切解决方案,谢谢!
                                • 像魅力一样为亚马逊 Linux 工作。很高兴我找到了你的解决方案。谢谢
                                【解决方案30】:

                                当您安装了不同的 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>
                                

                                【讨论】:

                                猜你喜欢
                                相关资源
                                最近更新 更多