фатальная ошибка: Python.h: нет такого файла или каталога

Я пытаюсь создать общую библиотеку с использованием файла расширения C, но сначала мне нужно сгенерировать выходной файл, используя следующую команду:

gcc -Wall utilsmodule.c -o Utilc

После выполнения команды я получаю сообщение об ошибке:

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

Я пробовал все предложенные решения через Интернет, но проблема все еще существует. У меня нет проблем с Python.h. Мне удалось найти файл на моем компьютере.


person Mohanad Y.    schedule 03.02.2014    source источник


Ответы (31)


Похоже, вы неправильно установили файлы заголовков и статические библиотеки для 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 python3-devel   # for python3.x 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 (Альпийский ...):

# 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
person wim    schedule 03.02.2014

В Ubuntu я запускал Python 3, и мне пришлось установить

sudo apt-get install python3-dev

Если вы хотите использовать версию Python, которая не связана с python3, установите связанный пакет python3.x-dev. Например:

sudo apt-get install python3.5-dev
person FreshPow    schedule 27.02.2014

В частности, для Python 3.7 и Ubuntu мне понадобилось

sudo apt install libpython3.7-dev

. Я думаю, что в какой-то момент имена были изменены с pythonm.n-dev на это.

для Python 3.6, 3.8 и 3.9 аналогично:

sudo apt install libpython3.6-dev

sudo apt install libpython3.8-dev

sudo apt install libpython3.9-dev
person ijoseph    schedule 28.08.2019

Вам нужно сделать две вещи.

Установите пакет разработки для 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 
person vartec    schedule 03.02.2014
comment
мне нужно добавить флаги для каждого включенного файла в файл расширения C ?? - person Mohanad Y.; 04.02.2014
comment
Если вы используете другую версию Python, например 3.3: sudo apt-get install python3.3-dev - person FreshPow; 06.08.2014

Если вы используете Raspberry Pi:

sudo apt-get install python3-dev
person Malachi Bazar    schedule 16.08.2015

в Fedora запустите это для Python 2:

sudo dnf install python2-devel

и для Python 3:

sudo dnf install python3-devel
person ravi.zombie    schedule 05.06.2015
comment
В Mint 18.2 (на основе Ubuntu) это было apt-get install python-dev. - person CoderGuy123; 31.08.2017

Если вы используете tox для запуска тестов на нескольких версиях Python, вам может потребоваться установить библиотеки разработчиков Python для каждой версия Python, на которой вы тестируете.

sudo apt-get install python2.6-dev 
sudo apt-get install python2.7-dev 
etc.
person Christian Long    schedule 23.04.2015

Убедитесь, что файлы разработки 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) 
person sleblanc    schedule 03.02.2014
comment
Я получаю следующее сообщение об ошибке в RHEL: Неизвестный параметр -I / usr / include / python2.7 - person Fedor Alexander Steeman; 10.06.2020
comment
@FedorSteeman, кто-то отредактировал мой ответ и удалил новую строку из команды. - person sleblanc; 01.07.2020

Решение для Cygwin

Вам необходимо установить пакет python2-devel или python3-devel, в зависимости от версии Python, которую вы используете.

Вы можете быстро установить его с помощью 32-разрядной версии или 64-битная setup.exe (в зависимости от вашей установки) из Cygwin. .com.

Пример (при необходимости измените имя файла setup.exe и основную версию Python):

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

Вы также можете проверить мой другой ответ, где есть еще несколько вариантов установки пакетов Cygwin из командной строки.

person David Ferenczy Rogožan    schedule 23.03.2017

Для меня изменение его на это сработало:

#include <python2.7/Python.h>

Я нашел файл /usr/include/python2.7/Python.h, и поскольку /usr/include уже находится в пути включения, то python2.7/Python.h должно быть достаточно.

Вы также можете вместо этого добавить путь включения из командной строки - gcc -I/usr/lib/python2.7 (спасибо @ erm3nda).

person sashoalm    schedule 14.11.2015
comment
Все остальные ответы говорят вам что-то установить. Этот сработал для меня. Почему это не лучший ответ? - person noɥʇʎԀʎzɐɹƆ; 08.08.2016
comment
@ uoɥʇʎPʎzɐɹC Может быть, потому что он не работает под python3? - person Louis; 31.08.2016
comment
Лучше установить для библиотеки gcc -I/usr/lib/python2.7 etc, чем жестко кодировать вызовы include. - person m3nda; 29.03.2017
comment
@ noɥʇʎԀʎzɐɹƆ Потому что он должен работать без изменения кода. Вам часто нужно скомпилировать код, которым вы не владеете, например некоторую внешнюю зависимость, и худшее, что вы можете сделать, - это изменить этот код. - person David Ferenczy Rogožan; 19.04.2017
comment
@DawidFerenczy Understod. - person noɥʇʎԀʎzɐɹƆ; 20.04.2017
comment
Я бы рекомендовал использовать pkg-config вместо изменения ваших источников C: stackoverflow.com/a/21531170/895245 - person Ciro Santilli 新疆再教育营六四事件ۍ 15.08.2018

В AWS API (centOS) его

yum install python27-devel
person yespbs    schedule 09.07.2015
comment
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением - вы всегда можете комментировать свои собственные сообщения, и как только у вас будет достаточно репутации, вы сможете комментировать любое сообщение. - person Wtower; 09.07.2015
comment
@Wtower Да, он дает ответ. - person Tadeusz Kopec; 09.07.2015
comment
Это дает ответ. Хотя надо заменять версию на то, что вам нужно. - person Ganesh Krishnan; 03.08.2015
comment
это помогло преодолеть мои проблемы с попыткой pip install cryptography на экземпляре amazon linux. - person ryantuck; 07.03.2017
comment
Это был полезный ответ, хотя можно установить python-devel или python2-devel на Amazon Linux, это единственный, который действительно сработал для меня при запуске установки pip внутри virtualenv. - person Kristofor Carle; 18.10.2017

Установка AWS EC2 с запущенным python34:

sudo yum install python34-devel

person parsethis    schedule 12.12.2016

Если вы используете virtualenv с питоном 3.6 (край прямо сейчас), обязательно установите соответствующий python 3.6 dev sudo apt-get install python3.6-dev, иначе выполнение sudo python3-dev установит python dev 3.3.3-1, что не решит проблему.

person Guillaume Cisco    schedule 09.05.2017
comment
Отлично работал у меня и на 3.5 (.2). Явная установка правильного пакета разработчика для вашей версии Python - это хорошо. - person Seth; 29.05.2017

В моем случае в Ubuntu это было исправлено путем установки пакетов libpython-all-dev (или libpython3-all-dev, если вы используете Python 3).

person Oriol Nieto    schedule 01.02.2016
comment
python-all-dev в моем случае, но достаточно близко. - person Dave S.; 31.05.2016
comment
@Oriol Nieto, Большое спасибо. python-all-dev также решил проблему для меня. - person shrawan_lakhe; 22.02.2017

Это не та же ситуация, но у меня тоже работает, и теперь я могу использовать 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: Нет существующего архива или компиляция директории прекращена.

После запуска в моей установке 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/
person Hugo L.M    schedule 10.06.2017

Мне удалось решить эту проблему и сгенерировать файл .so одной командой

gcc -shared -o UtilcS.so
-fPIC -I/usr/include/python2.7 -lpython2.7  utilsmodule.c
person Mohanad Y.    schedule 04.02.2014

Я также столкнулся с этой ошибкой, когда устанавливал coolprop в ubuntu.

Для ubuntu 16.04 с python 3.6

sudo apt-get install python3.6-dev

Если это не сработает, попробуйте установить / обновить gcc lib.

sudo apt-get install gcc
person Wreeecks    schedule 14.05.2018
comment
Боже мой, я так долго боролся с этим, потому что я запускал python3-dev много раз и получал ту же ошибку, но не знал о python3.6-dev !! Спасибо!! - person Blairg23; 14.03.2019

попробуйте apt-файл. Трудно вспомнить имя пакета, в котором находится отсутствующий файл. Он универсален и полезен для любых файлов пакетов.

Например:

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# 

Теперь вы можете догадаться, какой из них выбрать.

person Venfah Nazir    schedule 03.11.2015

Для 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

person Steve G    schedule 27.11.2017

Для товарищей по OpenSuse:

sudo zypper install python3-devel
person kmonsoor    schedule 29.03.2015

Если вы используете Python 3.6 в Amazon Linux (на основе RHEL, но приведенные здесь ответы RHEL не сработали):

sudo yum install python36-devel
person Yigal    schedule 13.02.2018
comment
Спасибо за комментарий, он спас положение! - person Herminne; 25.11.2020

  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-config или python3.6-config.

person Antti Haapala    schedule 08.06.2019

Конечно, python-dev или libpython-all-dev - это первое, что нужно (apt) install, но если это не поможет, как в моем случае, я советую вам установить пакеты external Function Interface от sudo apt-get install libffi-dev и sudo pip install cffi.

Это должно помочь, особенно если вы видите ошибку как / от c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory.

person Huge    schedule 07.12.2016
comment
sudo pip3 install cffi (# для python3) - person Magnus Melwin; 16.09.2017

Эта ошибка возникла, когда я попытался установить ctds на CentOS 7 с Python3.6. Я проделал все упомянутые здесь приемы, включая 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). Это привело к тому, что lpython3.6m не был найден при связывании ctds.

Наконец, сработало исправление среды разработки для 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. Какая бы версия python не использовалась, например 3.6, она обычно должна быть в /usr/include/python3.6m/Python.h.

person Babu Arunachalam    schedule 03.11.2017
comment
Не уверен, почему есть -1, но на сегодняшний день это проблема для python3.6 с CentOS, поскольку python36-devel недоступен. Вам нужно будет установить его по указанному выше URL. - person Babu Arunachalam; 16.11.2017

Часто появляется при попытке удалить python3.5 и установить python3.6.

Таким образом, при использовании python3 (который python3 -V => python3.6) для установки некоторых пакетов требуется заголовок python3.5, появится эта ошибка.

Устранение проблемы установкой модуля python3.6-dev.

person dphans    schedule 14.04.2018

Это означает, что Python.h не входит в пути включения вашего компилятора по умолчанию. Вы установили его в масштабе всей системы или локально? Какая у вас ОС?

Вы можете использовать флаг -I<path>, чтобы указать дополнительный каталог, в котором ваш компилятор должен искать заголовки. Вам, вероятно, придется продолжить работу с -L<path>, чтобы gcc смог найти библиотеку, с которой вы будете связываться с помощью -l<name>.

person Kos    schedule 03.02.2014

Иногда даже после установки 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
person HimanshuGahlot    schedule 28.06.2018

попробуйте найти свой 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 ...
person gemfield    schedule 21.08.2020
comment
аккуратный. Спасибо! - person aerijman; 14.05.2021

Вот еще одно решение, потому что ни одно из этих решений у меня не сработало. Для справки, я пытался pip install что-то сделать в базовом образе Docker Amazon Linux AMI для Python 3.6.

Решение без докеров:

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

person serg06    schedule 26.01.2021
comment
Точное решение моей проблемы, спасибо! - person Kubra; 14.06.2021

Эта проблема также может возникнуть, когда у вас установлены разные версии Python и вы используете пип, отличный от системного. В этом случае несистемный пип не сможет найти нужную версию заголовков Python.

Это случилось со мной при попытке pip install пакета для 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

Затем вы можете установить флаг компилятора, который будет использоваться gcc при вызове из pip. Мой был /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>
person Milo    schedule 08.04.2021

Если вы используете 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})
person KingKong    schedule 22.01.2021