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

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

gcc -Wall utilsmodule.c -o Utilc

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

utilsmodule.c: 1: 20: фатальная ошибка: Python.h: компиляция такого файла или каталога не прекращена.

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

36 ответов

Решение

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

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

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

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

На Ubuntu я работал под управлением Python 3, и мне пришлось установить

sudo apt-get install python3-dev

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

sudo apt-get install python3.5-dev

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

sudo apt install libpython3.7-dev

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

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

sudo apt install libpython3.6-dev

Две вещи, которые вы должны сделать.

Установите пакет разработки для 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 

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

sudo apt-get install python-dev

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

sudo dnf install python2-devel

и для Python 3:

sudo dnf install python3-devel

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

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

Убедитесь, что файлы 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

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

#include <python2.7/Python.h>

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

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

Я хотел бы добавить также решение для Cygwin:

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

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

Пример (изменить setup.exe имя файла и основная версия Python, если вам нужно):

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

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

В AWS API (centOS) его

yum install python27-devel

Установка AWS EC2 под управлением python34:

sudo yum install python34-devel

Эта проблема также может возникнуть, когда у вас установлены разные версии Python и вы используете пип, отличный от системного. В этом случае несистемный пип не сможет найти нужную версию заголовков 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

Затем вы можете установить флаг компилятора, который будет использоваться 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>

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

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

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

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

Для Ubuntu 16.04 с Python 3.6

sudo apt-get install python3.6-dev

Если когда-либо это не работает, попробуйте установить / обновить gcc Lib.

sudo apt-get install gcc

Попробуй 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# 

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

Вот еще одно решение, потому что ни одно из этих решений у меня не сработало. Для справки, я пытался 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.

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

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

sudo zypper install python3-devel

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

sudo yum install python36-devel
  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.

Конечно python-dev или же libpython-all-dev первым делом (apt)install, но если это не поможет, как в моем случае, я советую вам установить сторонние пакеты 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,

Попробуйте найти свой 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 ...

Я на Убунте . Я установил все пакеты, как было рекомендовано в некоторых ответах.

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

У меня все еще была эта проблема, строка:

      #include "Python.h"

И некоторые другие, я могу редактировать их вручную, это плохая практика. Теперь я знаю секрет, он исходит из исходного кода cython . У меня есть файл. Компилируется без ошибок. Это файл. Измените PYTHON на версию Python, которая у вас есть, python/python3. Измените FILE на ваше c-имя файла. Имя файла makefile должно быть Makefile . Запустите файл командой:

      make all

Makefile для создания нашей автономной программы Cython

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

Иногда даже после установки python-dev ошибка сохраняется. Проверьте на наличие ошибки, если отсутствует "gcc".

Сначала загрузите, как указано в /questions/17850515/fatalnaya-oshibka-pythonh-net-takogo-fajla-ili-kataloga/17850546#17850546, затем установите gcc

Для apt (Ubuntu, Debian...):

sudo apt-get install gcc

Для ням (CentOS, RHEL...):

sudo yum install gcc

Для dnf (Fedora...):

sudo dnf install gcc

Для zypper (openSUSE...):

sudo zypper in gcc

Для apk (Alpine...):

sudo apk gcc

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

Наконец, работало исправление среды разработки для 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 обычно.

Это часто появляется, когда вы пытаетесь удалить python3.5 и установить python3.6,

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

Разрешить путем установки python3.6-dev модуль.

Другие вопросы по тегам