фатальна помилка: 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.