фатальна помилка: Python.h: Немає такого файлу чи каталогу


1190

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

gcc -Wall utilsmodule.c -o Utilc

Після виконання команди я отримую це повідомлення про помилку:

utilsmodule.c: 1: 20: фатальна помилка: Python.h: Не збирається компілювати такий файл чи каталог.

Я спробував усі запропоновані рішення через Інтернет, але проблема все ще існує. У мене немає проблем Python.h. Мені вдалося знайти файл на своїй машині.

Відповіді:


2233

Схоже, ви неправильно встановили файли заголовків та статичні бібліотеки для 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

21
Спробуйте locate Python.hі подивіться, чи є у вас файл, перш ніж зробити все це. Якщо ви можете знайти файл, який знаходиться, в основному ця відповідь спрацює: stackoverflow.com/a/19344978/4954434 (Це може бути лише проблема шляху)
Jithin Pavithran

2
@ Hack-R та інші, якщо у вас встановлені Python 2.6 та 2.7, "python-devel" встановить бібліотеки розробників лише для 2.6. Щоб змусити його встановити 2,7 бібліотеки, використовуйтеsudo yum install python27-devel
Doktor J

15
Я використовую python3.6 14.04 apt-get install python3.6-devпрацював на мене.
біти

9
добре працював для мене (ubuntu 14.04), але довелося вказати повний номер версіїsudo apt-get install python3.6-dev
landrykapela

17
Так само і з sudo apt-get install python3.7-dev.
kas

344

На Ubuntu я запускав Python 3 і мені довелося встановити

sudo apt-get install python3-dev

Якщо ви хочете використовувати версію Python, яка не пов'язана з python3, встановіть пов'язаний пакет python3.x-dev. Наприклад:

sudo apt-get install python3.5-dev

32
Я запустив команду sudo apt-get install python3.4-devдля свого Python3.4 і це вирішило мою проблему.
Аарон Лелев'є

4
@Rawrgulmuffins добре залежить від того, яку версію python ви використовуєте. У моєму випадку sudo apt-get install python2.7-devвиправлена ​​проблема
RockScience

6
Я додам ще одну річ до цієї відповіді - якщо у вас є кілька версій Python 3.x, python3-devвстановіть залежності для тієї версії, яка пов'язана з python3командою. Отже, якщо ви хочете встановити для певної версії, використовуйте повну версію типу - python3.x-dev.
xyres

3
Це допомогло python 3.6.3 на Ubuntu 14.04sudo apt-get install python3.6-dev
codestruggle

Якщо ви працюєте з версією Python у віртуальному середовищі, відмінному від вашої системи Python, це.
SuperShoot

74

Зокрема, для Python 3.7 та Ubuntu , мені потрібно

sudo apt install libpython3.7-dev

. Я думаю, в якийсь момент імена були змінені з pythonm.n-devна це.

для Python 3.6, аналогічно:

sudo apt install libpython3.6-dev

6
ty: tearsofjoy:
valem

1
Ого. Після 30 хвилин пошуку та встановлення різного роду ця відповідь фактично вирішила проблему
В'ячеслав Цівіна

!!!!! Звичайно, це було правильним рішенням для мене за допомогою Python 3.7 та Ubuntu 18.04.
villamejia

дякую <3 <3 <3
Кава в часі,

1
він також працює для python 3.6 ... алеsudo apt install libpython3.6-dev
Morteza Afshari

70

Дві речі, які ти повинен зробити.

Встановіть пакет розробки для 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 ??
Моханад Ю.

1
Якщо ви використовуєте іншу версію Python, 3.3, наприклад: sudo apt-get install python3.3-dev
FreshPow

Я б рекомендував використовувати pkg-configзамість необробленого -I: stackoverflow.com/a/21531170/895245
Чіро Сантіллі冠状病毒审查六四事件法轮功


35

у Fedora запустіть це для Python 2:

sudo dnf install python2-devel

а для Python 3:

sudo dnf install python3-devel

1
На Монетному дворі 18.2 (на базі Ubuntu) це було apt-get install python-dev.
Делете

30

Якщо ви використовуєте tox для запуску тестів на декількох версіях Python, можливо, вам доведеться встановити бібліотеки розробників Python для кожної версії Python, на якій ви тестуєте.

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

27

Рішення для Cygwin

Вам потрібно встановити пакет python2-develабоpython3-devel , залежно від версії Python, яку ви використовуєте.

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

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

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

Ви також можете перевірити мою іншу відповідь на ще кілька варіантів встановлення пакетів Cygwin з командного рядка.


22

У API AWS (centOS) його

yum install python27-devel

Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією - ви завжди можете коментувати свої власні публікації, і як тільки у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію .
Wtower

2
@Wtower Так, це дає відповідь.
Тадеуш Копець

1
Це дійсно дає відповідь. Хоча вам доведеться замінити версію на те, що вам потрібно.
Ганеш Крішнан

1
це допомогло подолати мої проблеми при спробі pip install cryptographyна Amazon linux екземпляр.
Райан Тук

Це було корисною відповіддю, хоча на Amazon Linux можна встановити python-devel або python2-devel, це єдиний, який насправді працював для мене під час запуску встановлення pip всередині virtualenv
Kristofor Carle

21

Для мене це змінило на це:

#include <python2.7/Python.h>

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

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


4
Усі інші відповіді говорять вам про те, щоб щось встановити. Цей працював на мене. Чому це не найкраща відповідь?
noɥʇʎԀʎzɐɹƆ

1
@ uoɥʇʎPʎzɐɹC Можливо тому, що він не працюватиме під python3?
Луї

Краще встановити lib на, gcc -I/usr/lib/python2.7 etcа не жорсткий код, щоб включати дзвінки.
м3нда

1
@ noɥʇʎԀʎzɐɹƆ Тому що це має працювати без зміни коду. Вам часто потрібно скласти невласний вам код, наприклад, якусь зовнішню залежність, і найгірше, що ви можете зробити - це змінити цей код.
Девід Ференчі Рогожан

@DawidFerenczy Understod.
noɥʇʎԀʎzɐɹƆ

19

Переконайтеся, що файли розробників 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) 


14

У моєму випадку те, що було виправлено в Ubuntu, було встановлення пакетів libpython-all-dev(або libpython3-all-devякщо ви використовуєте Python 3).


2
python-all-devв моєму випадку, але досить близько.
Дейв С.

1
@Oriol Nieto, дуже дякую python-all-dev також вирішив це питання для мене.
shrawan_lakhe

14

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


1
Для мене чудово працював і 3,5 (.2). Явна установка правильного пакета розробників для вашої версії Python - це хороша річ.
Сет

13

Це не та сама ситуація, але вона працює і для мене, і тепер я можу використовувати 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/

11

Я також зіткнувся з цією помилкою, коли я встановлював coolprop в ubuntu.

Для ubuntu 16.04 з python 3.6

sudo apt-get install python3.6-dev

Якщо ніколи це не працює, спробуйте встановити / оновити gcclib.

sudo apt-get install gcc

1
omg, я боровся з цим так довго, тому що я python3-devбагато разів бігав і постійно отримував ту ж помилку, але не знав про це python3.6-dev!! Дякую!!
Blairg23

10

спробуйте файл 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# 

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


10

Мені вдалося вирішити цю проблему і генерувати файл .so за одну команду

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


8

Для 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- оточення-на-centos-7, а потім змогло створити mod_wsgi та налагодити його роботу з python3.6 virtualenv


5

Якщо ви використовуєте Python 3.6 на Amazon Linux (заснований на RHEL, але відповіді RHEL, наведені тут, не спрацювали):

sudo yum install python36-devel

4

Ця помилка сталася, коли я намагався встановити 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не знайденого при з’єднанні cdds.

Нарешті, те, що працювало, було виправити середовище розробки для 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типовій формі.


Не впевнений, чому існує -1, але це проблема на сьогодні для python3.6 з CentOS, оскільки python36-devel недоступний. Вам потрібно буде встановити його за вказаною вище адресою.
Бабу Аруначалам

4

Зрозуміло, python-devабо libpython-all-devце перше, що потрібно ( apt) install, але якщо це не допомагає, як у моєму випадку, я радимо вам встановити сторонні пакети функціонального інтерфейсу до 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.


sudo pip3 install cffi (# for python3)
Магнус Мелвін

3

Він часто з’являється при спробі видалити python3.5та встановити python3.6.

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

Вирішити за допомогою python3.6-devмодуля установки .


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


2

Іноді навіть після встановлення python-dev помилка зберігається, Перевірте наявність помилки, якщо вона "gcc" відсутня.

Спочатку завантажте, як зазначено в https://stackoverflow.com/a/21530768/8687063 , після чого встановіть gcc

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

sudo apt-get install gcc

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

sudo yum install gcc

Для dnf (Fedora ...):

sudo dnf install gcc

Для блискавки (openSUSE ...):

sudo zypper in gcc

Для apk (Alpine ...):

sudo apk gcc

1

Це означає, що Python.hза замовчуванням у вашому компіляторі немає маршрутів. Ви встановили це в масштабах всієї системи чи локально? Яка ваша ОС?

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.