Фатальная ошибка: 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 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
Если вы используете Python 3.6 в Amazon Linux (на основе RHEL, но приведенные здесь ответы RHEL не сработали):
sudo yum install python36-devel
Вы должны установить файлы разработки Python в своей операционной системе, если Python, поставляемый с вашей операционной системой, не поставляется с ними. Многие ответы на этот вопрос показывают бесчисленное множество способов, которыми это может быть достигнуто в разных системах.
Когда вы это сделаете, проблема состоит в том, чтобы сообщить компилятору, где они расположены и как скомпилировать их. 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
модуль.