Ответ 1
Мне удалось решить эту проблему и сгенерировать файл .so одной командой
gcc -shared -o UtilcS.so
-fPIC -I/usr/include/python2.7 -lpython2.7 utilsmodule.c
Я пытаюсь создать общую библиотеку с использованием файла расширения C, но сначала мне нужно сгенерировать выходной файл, используя следующую команду:
gcc -Wall utilsmodule.c -o Utilc
После выполнения команды я получаю это сообщение об ошибке:
utilsmodule.c: 1: 20: фатальная ошибка: Python.h: нет такого файла или каталога компиляция завершена.
на самом деле я пробовал все предлагаемые решения через Интернет, но проблема все еще существует... также у меня нет проблем с Python.h
. Мне удалось найти файл на моей машине... с кем-то сталкивалась такая же проблема раньше?
Мне удалось решить эту проблему и сгенерировать файл .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 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
На Ubuntu я работал под управлением Python 3, и мне пришлось установить
sudo apt-get install python3-dev
Если вы хотите использовать версию Python, которая не связана с python3, установите соответствующий пакет python3.x-dev. Например:
sudo apt-get install python3.5-dev
Две вещи, которые вам нужно сделать.
Установите пакет разработки для Python, в случае Debian/Ubuntu/Mint он выполнит команду:
sudo apt-get install python-dev
Во-вторых, файлы include не по умолчанию включены в путь include, а также не являются библиотекой Python, связанными с исполняемым файлом по умолчанию. Вам нужно добавить эти флаги (соответственно заменить версию Python):
-I/usr/include/python2.7 -lpython2.7
Другими словами, ваша команда компиляции должна быть:
gcc -Wall -I/usr/include/python2.7 -lpython2.7 utilsmodule.c -o Utilc
Если вы используете малину 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.
Вам необходимо установить пакет python2-devel
или python3-devel
, в зависимости от используемой версии Python.
Вы можете быстро установить его, используя 32-битный или 64-битный setup.exe
(в зависимости от вашей установки) с сайта Cygwin.com.
Пример (при необходимости измените имя файла setup.exe
и основную версию Python):
$ setup.exe -q --packages=python3-devel
Вы также можете проверить мой другой ответ, чтобы узнать еще несколько вариантов установки пакетов Cygwin из командной строки.
В AWS API (centOS) его
yum install python27-devel
Для меня это изменилось:
#include <python2.7/Python.h>
Я нашел файл /usr/include/python2.7/Python.h
, и поскольку /usr/include
уже находится в пути include, тогда python2.7/Python.h
должно быть достаточно.
Вместо этого вы можете добавить путь include из командной строки - gcc -I/usr/lib/python2.7
(thanks @erm3nda).
Убедитесь, что файлы разработчика 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)
AWS EC2 устанавливает запуск python34:
sudo yum install python34-devel
В моем случае, что исправлено в 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/
Если вы используете virtualenv с 3.6 python (край сейчас), обязательно установите соответствующий python 3.6 dev sudo apt-get install python3.6-dev
, в противном случае выполнение sudo python3-dev
установит python dev 3.3.3-1, t решить проблему.
Я также столкнулся с этой ошибкой, когда я устанавливал coolprop в Ubuntu.
Для Ubuntu 16.04 с Python 3.6
sudo apt-get install python3.6-dev
Если это не помогло, попробуйте установить/обновить gcc
lib.
sudo apt-get install gcc
попробуйте apt файл. Трудно запомнить имя пакета, в котором находится отсутствующий файл. Он является общим и полезным для любых файлов пакетов.
Например:
[email protected]:~/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
[email protected]:~/auto#
Теперь вы можете сделать экспертную догадку о том, какой из них выбрать.
Для Python 3.7 и Ubuntu в частности мне понадобилось
sudo apt install libpython3.7-dev
,
Я думаю, что в какой-то момент имена были изменены с pythonm.n-dev
на это.
Для товарищей OpenSuse:
sudo zypper install python3-devel
Для 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-dev
или libpython-all-dev
являются первыми (apt
) для install
, но если это не поможет, как в моем случае, я советую вам установить пакеты sudo apt-get install libffi-dev
интерфейса функций с помощью 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
.
Эта ошибка возникла, когда я попытался установить 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 должен быть включен в ваш путь include для gcc. Какая бы версия python не использовалась, например, если она 3.6, то она должна быть в /usr/include/python3.6m/Python.h
обычно.
Если вы используете Python 3.6 в Amazon Linux (на основе RHEL, но приведенные здесь ответы RHEL не сработали):
sudo yum install python36-devel
Это часто появляется, когда вы пытаетесь удалить python3.5
и установить python3.6
.
Поэтому при использовании python3
(который python3 -V
=> python3.6
) для установки некоторых пакетов необходим заголовок python3.5
появится эта ошибка.
Решите, установив python3.6-dev
.
Иногда даже после установки python-dev ошибка сохраняется. Проверьте на наличие ошибки, если отсутствует "gcc".
Сначала загрузите, как указано в fooobar.com/questions/36905/..., затем установите 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
Это означает, что Python.h
отсутствует в ваших путях по умолчанию для компилятора. Установили ли вы его как в системе, так и локально? Что ваша ОС?
Вы можете использовать флаг -I<path>
, чтобы указать дополнительный каталог, в котором ваш компилятор должен искать заголовки. Вам, вероятно, придется следить за -L<path>
, чтобы gcc мог найти библиотеку, с которой вы будете связываться, используя -l<name>
.
Вы должны установить файлы разработки 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
.