błąd krytyczny: Python.h: Brak takiego pliku lub katalogu

1189

Próbuję zbudować bibliotekę współdzieloną przy użyciu pliku rozszerzenia C, ale najpierw muszę wygenerować plik wyjściowy za pomocą poniższej komendy:

gcc -Wall utilsmodule.c -o Utilc

Po wykonaniu polecenia pojawia się następujący komunikat o błędzie:

utilsmodule.c: 1: 20: błąd krytyczny: Python.h: Żadna taka kompilacja pliku lub katalogu nie została zakończona.

Wypróbowałem wszystkie sugerowane rozwiązania przez Internet, ale problem nadal występuje. Nie mam z tym problemu Python.h. Udało mi się zlokalizować plik na moim komputerze.

Mohanad Y.
źródło

Odpowiedzi:

2232

Wygląda na to, że nie zainstalowałeś poprawnie plików nagłówkowych i bibliotek statycznych dla Python Dev. Użyj menedżera pakietów, aby zainstalować je w całym systemie.

W przypadku apt( Ubuntu, Debian ... ):

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

Dla yum( CentOS, RHEL ... ):

sudo yum install python-devel   # for python2.x installs
sudo yum install python3-devel   # for python3.x installs

Dla dnf( Fedora ... ):

sudo dnf install python2-devel  # for python2.x installs
sudo dnf install python3-devel  # for python3.x installs

Dla zypper( openSUSE ... ):

sudo zypper in python-devel   # for python2.x installs
sudo zypper in python3-devel  # for python3.x installs

Dla apk( Alpine ... ):

# 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

Dla apt-cyg( Cygwin ... ):

apt-cyg install python-devel   # for python2.x installs
apt-cyg install python3-devel  # for python3.x installs
wim
źródło
21
Spróbuj locate Python.hto zrobić, zanim już to zrobisz. Jeśli znajdziesz plik znajdujący się, przeważnie ta odpowiedź będzie działać: stackoverflow.com/a/19344978/4954434 (Może to być tylko problem ze ścieżką)
Jithin Pavithran
2
@ Hack-R i inne, jeśli masz zainstalowany Python 2.6 i 2.7, „python-devel” zainstaluje tylko biblioteki programistyczne dla 2.6. Aby zmusić go do zainstalowania bibliotek 2.7, użyjsudo yum install python27-devel
Doktor J
15
Używam python3.6 na 14.04 apt-get install python3.6-devpracował dla mnie.
bitów
9
działało dobrze dla mnie (ubuntu 14.04), ale musiałem podać pełny numer wersjisudo apt-get install python3.6-dev
landrykapela,
17
Podobnie z sudo apt-get install python3.7-dev.
kas
344

Na Ubuntu działałem w Pythonie 3 i musiałem zainstalować

sudo apt-get install python3-dev

Jeśli chcesz użyć wersji Pythona, która nie jest połączona z python3, zainstaluj powiązany pakiet python3.x-dev. Na przykład:

sudo apt-get install python3.5-dev
FreshPow
źródło
32
Uruchomiłem polecenie sudo apt-get install python3.4-devdla mojego Python3.4 i to rozwiązało mój problem.
Aaron Lelevier
4
@Rawrgulmuffins dobrze zależy od używanej wersji Pythona. W moim przypadku sudo apt-get install python2.7-devnaprawiono problem
RockScience
6
Dodałbym jeszcze jedną rzecz do tej odpowiedzi - jeśli masz wiele wersji Python 3.x, python3-devzainstaluję zależności dla tej wersji, która jest połączona z python3poleceniem. Jeśli chcesz zainstalować konkretną wersję, użyj pełnej wersji, takiej jak - python3.x-dev.
xyres
3
Pomogło to w python 3.6.3 na Ubuntu 14.04sudo apt-get install python3.6-dev
codestruggle
Jeśli uruchamiasz wersję Pythona w środowisku wirtualnym innym niż systemowy Python, to.
SuperShoot
74

W szczególności dla Python 3.7 i Ubuntu potrzebowałem

sudo apt install libpython3.7-dev

. Myślę, że w pewnym momencie nazwy zostały zmienione z pythonm.n-devna to.

w przypadku Pythona 3.6 podobnie:

sudo apt install libpython3.6-dev
ijoseph
źródło
6
ty: tearsofjoy:
valem
1
łał. Po około 30 minutach wyszukiwania i instalacji wszelkiego rodzaju rzeczy ta odpowiedź faktycznie rozwiązała problem
Wiaczesław Tsivina
!!!!! Oczywiście było to dla mnie właściwe rozwiązanie, używając Pythona 3.7 i Ubuntu 18.04.
villamejia
dzięki <3 <3 <3
Coffee inTime
to działa również dla Pythona 3.6 ... alesudo apt install libpython3.6-dev
Morteza Afshari
70

Dwie rzeczy, które musisz zrobić.

Zainstaluj pakiet programistyczny dla Pythona, w przypadku Debian / Ubuntu / Mint odbywa się to za pomocą polecenia:

sudo apt-get install python-dev

Po drugie, pliki dołączane nie są domyślnie w ścieżce dołączania, a biblioteka Pythona nie jest domyślnie połączona z plikiem wykonywalnym. Musisz dodać te flagi (odpowiednio zastąp wersję Pythona):

-I/usr/include/python2.7 -lpython2.7 

Innymi słowy, Twoim poleceniem kompilacji powinno być:

gcc -Wall -I/usr/include/python2.7 -lpython2.7  utilsmodule.c -o Utilc 
vartec
źródło
czy muszę dodawać flagi dla każdego pliku zawartego w pliku rozszerzenia C?
Mohanad Y.
1
Jeśli używasz innej wersji Python, na przykład 3.3: sudo apt-get install python3.3-dev
FreshPow
Polecam użycie pkg-configzamiast surowego -I: stackoverflow.com/a/21531170/895245
Ciro Santilli 15 病毒 审查 六四 事件 法轮功
47

Jeśli używasz Raspberry Pi:

sudo apt-get install python-dev
Malachi Bazar
źródło
35

na Fedorze uruchom to dla Pythona 2:

sudo dnf install python2-devel

i dla Python 3:

sudo dnf install python3-devel
ravi.zombie
źródło
1
Na Mint 18.2 (oparty na Ubuntu) tak było apt-get install python-dev.
Deleet
30

Jeśli używasz programu toksycznego do uruchamiania testów na wielu wersjach Pythona, może być konieczne zainstalowanie bibliotek programistycznych Pythona dla każdej wersji testowanego Pythona.

sudo apt-get install python2.6-dev 
sudo apt-get install python2.7-dev 
etc.
Christian Long
źródło
27

Rozwiązanie dla Cygwin

Musisz zainstalować pakiet python2-devellubpython3-devel , w zależności od używanej wersji Pythona.

Możesz go szybko zainstalować za pomocą 32-bitowego lub 64-bitowego setup.exe (w zależności od instalacji) z Cygwin.com .

Przykład ( setup.exew razie potrzeby zmodyfikuj nazwę pliku i główną wersję Pythona):

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

Możesz także sprawdzić moją drugą odpowiedź, aby uzyskać kilka dodatkowych opcji instalacji pakietów Cygwin z wiersza poleceń.

David Ferenczy Rogožan
źródło
22

W AWS API (centOS) jego

yum install python27-devel
Yespbs
źródło
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem - zawsze możesz komentować własne posty, a gdy będziesz mieć wystarczającą reputację , będziesz mógł komentować każdy post .
Wtower,
2
@Wtower Tak, zawiera odpowiedź.
Tadeusz Kopec
1
To daje odpowiedź. Chociaż musisz zastąpić wersję tym, czego potrzebujesz.
Ganesh Krishnan
1
pomogło to przezwyciężyć moje problemy z pip install cryptographyinstancją Linux-a Amazon.
Ryan Tuck
To była pomocna odpowiedź, chociaż możliwe jest zainstalowanie Python-devel lub python2-devel na Amazon Linux, to jedyna, która faktycznie działała dla mnie, gdy uruchomiłem instalację pip wewnątrz wirtualnej wersji
Kristofor Carle
21

Dla mnie zmiana na tę działała:

#include <python2.7/Python.h>

Znalazłem plik /usr/include/python2.7/Python.h, a ponieważ /usr/includejest już w ścieżce dołączania, python2.7/Python.hpowinien wystarczyć.

Możesz także dodać ścieżkę dołączania z wiersza poleceń - gcc -I/usr/lib/python2.7(dzięki @ erm3nda).

sashoalm
źródło
4
Wszystkie pozostałe odpowiedzi mówią, aby coś zainstalować. Ten działał dla mnie. Dlaczego nie jest to najlepsza odpowiedź?
noɥʇʎԀʎzɐɹƆ
1
@ uoɥʇʎPʎzɐɹC Może dlatego, że nie będzie działał pod Python3?
Louis,
Lepiej jest ustawić lib na gcc -I/usr/lib/python2.7 etcniż zakodować na stałe wywołania włączenia.
m3nda
1
@ noɥʇʎԀʎzɐɹƆ Ponieważ powinien działać bez zmiany kodu. Często musisz skompilować kod, który nie jest Twoją własnością, na przykład pewne zależności zewnętrzne, a najgorsze, co możesz zrobić, to zmodyfikować ten kod.
David Ferenczy Rogožan
@DawidFerenczy Understod.
noɥʇʎԀʎzɐɹƆ
19

Upewnij się, że pliki deweloperskie Python są dostarczane wraz z systemem operacyjnym.

Nie należy na stałe kodować biblioteki i zawierać ścieżek. Zamiast tego użyj pkg-config, który wyświetli prawidłowe opcje dla twojego systemu:

$ pkg-config --cflags --libs python2 -I/usr/include/python2.7 -lpython2.7

Możesz dodać go do linii gcc :

gcc -Wall utilsmodule.c -o Utilc $(pkg-config --cflags --libs python2) 
sleblanc
źródło
16

Instalacja AWS EC2 z uruchomionym python34:

sudo yum install python34-devel

parsethis
źródło
14

W moim przypadku tym, co naprawiło to w Ubuntu, była instalacja pakietów libpython-all-dev(lub libpython3-all-devjeśli używasz Python 3).

Oriol Nieto
źródło
2
python-all-devw moim przypadku, ale wystarczająco blisko.
Dave S.
1
@Oriol Nieto, Dziękuję bardzo. python-all-dev również rozwiązał dla mnie problem.
shrawan_lakhe
14

Jeśli używasz virtualenv z pythonem 3.6 (teraz Edge), zainstaluj pasujące do niego python 3.6 dev sudo apt-get install python3.6-dev, w przeciwnym razie wykonanie sudo python3-devspowoduje zainstalowanie python dev 3.3.3-1, co nie rozwiąże problemu.

Guillaume Cisco
źródło
1
Świetnie działało również dla mnie w wersji 3.5 (.2). Jawne instalowanie odpowiedniego pakietu deweloperskiego dla twojej wersji Pythona jest dobrą rzeczą.
Seth
13

To nie jest ta sama sytuacja, ale działa również dla mnie i teraz mogę używać SWIG z Python3.5 :

Próbowałem skompilować:

gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/

Z Pythonem 2.7 działa dobrze, nie z moją wersją 3.5:

existe_wrap.c: 147: 21: błąd krytyczny: Python.h: Nie istnieje żadne archiwum lub kompilacja reżysera została zakończona.

Po uruchomieniu w mojej instalacji Ubuntu 16.04:

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

Teraz mogę kompilować bez problemów Python3.5:

gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
Hugo LM
źródło
11

Ten błąd również napotkałem, gdy instalowałem Coolprop w Ubuntu.

Dla Ubuntu 16.04 z python 3.6

sudo apt-get install python3.6-dev

Jeśli to nie zadziała, spróbuj zainstalować / zaktualizować gcclib.

sudo apt-get install gcc
Wreeecks
źródło
1
omg, walczyłem z tym tak długo, ponieważ biegałem python3-devwiele razy i ciągle otrzymywałem ten sam błąd, ale nie wiedziałem o tym python3.6-dev!! Dzięki!!
Blairg23,
10

spróbuj apt-file. Trudno zapamiętać nazwę pakietu, w którym znajduje się brakujący plik. Jest ogólny i przydatny dla wszystkich plików pakietów.

Na przykład:

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# 

Teraz możesz zgadnąć, który z nich wybrać.

Venfah Nazir
źródło
10

Udało mi się rozwiązać ten problem i wygenerować plik .so w jednym poleceniu

gcc -shared -o UtilcS.so
-fPIC -I/usr/include/python2.7 -lpython2.7  utilsmodule.c
Mohanad Y.
źródło
8

Dla towarzyszy OpenSuse:

sudo zypper install python3-devel
kmonsoor
źródło
5

Jeśli używasz Pythona 3.6 w Amazon Linux (oparty na RHEL, ale odpowiedzi RHEL podane tutaj nie działały):

sudo yum install python36-devel
Yigal
źródło
4

Ten błąd wystąpił, gdy próbowałem zainstalować ctds na CentOS 7 z Python3.6. Zrobiłem wszystkie sztuczki wymienione tutaj, w tym yum install python34-devel. Problem Python.hzostał znaleziony w /usr/include/python3.4m but not in /usr/include/python3.6m. Próbowałem użyć, --global-optionaby wskazać dołączenie dir ( pip3.6 install --global-option=build_ext --global-option="--include-dirs=/usr/include/python3.4m" ctds). Spowodowało to, że lpython3.6mnie znaleziono podczas łączenia ctds.

Wreszcie to, co zadziałało, to naprawienie środowiska programistycznego dla Python3.6 musi zostać poprawione za pomocą dołączeń i bibliotek lib.

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 musi znajdować się w ścieżce dołączania dla gcc. Niezależnie od tego, która wersja Pythona jest używana, na przykład, jeśli jest to wersja 3.6, powinna ona być /usr/include/python3.6m/Python.hzwykle.

Babu Arunachalam
źródło
Nie jestem pewien, dlaczego istnieje -1, ale na dzień dzisiejszy jest to problem dla python3.6 z CentOS, ponieważ python36-devel nie jest dostępny. Będziesz musiał zainstalować go z powyższego adresu URL.
Babu Arunachalam
4

Jasne, python-devczy libpython-all-devsą pierwszą rzeczą ( apt) install, ale jeśli to nie pomoże, tak jak w moim przypadku, radzę zainstalować zagraniczne pakiety interfejsu funkcji przez sudo apt-get install libffi-devi sudo pip install cffi.

To powinno pomóc, zwłaszcza jeśli widzisz błąd jako / z c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory.

Olbrzymi
źródło
sudo pip3 install cffi (# for python3)
Magnus Melwin 16.09.17
3

Często pojawia się, gdy próbujesz usunąć python3.5i zainstalować python3.6.

Tak więc przy użyciu python3(który python3 -V=> python3.6) do zainstalowania niektórych pakietów wymagany python3.5nagłówek pojawi się ten błąd.

Rozwiąż za pomocą python3.6-devmodułu instalacyjnego .

dphans
źródło
3
  1. Musisz zainstalować pliki programistyczne Python w swoim systemie operacyjnym, jeśli Python dostarczony z systemem operacyjnym nie jest dostarczany z nimi. Wiele odpowiedzi na to pytanie pokazuje niezliczone możliwości osiągnięcia tego w różnych systemach.

  2. Gdy to zrobisz, problemem jest poinformowanie kompilatora, gdzie się znajdują i jak skompilować z nimi. Python jest dostarczany z programem o nazwie python-config. Do kompilacji potrzebne są dane --includeswyjściowe, a do połączenia programu z biblioteką Python (osadzanie Pythona w programie) dane --ldflagswyjściowe. Przykład:

    gcc -c mypythonprogram.c $(python3-config --includes)
    gcc -o program mypythonprogram.o $(python3-config --ldflags)

python-configProgram może być nazwany wersji Pythona - na Debianie, Ubuntu na przykład te mogą być nazwane python3-configlub python3.6-config.

Antti Haapala
źródło
2

Czasami nawet po zainstalowaniu Python-dev błąd nadal występuje, sprawdź, czy nie ma błędu „gcc”.

Najpierw pobierz zgodnie z https://stackoverflow.com/a/21530768/8687063 , a następnie zainstaluj gcc

W przypadku apt (Ubuntu, Debian ...):

sudo apt-get install gcc

Dla mniam (CentOS, RHEL ...):

sudo yum install gcc

W przypadku dnf (Fedora ...):

sudo dnf install gcc

W przypadku zyppera (openSUSE ...):

sudo zypper in gcc

Dla apk (Alpine ...):

sudo apk gcc
HimanshuGahlot
źródło
1

Oznacza to, że Python.hnie ma domyślnych ścieżek dołączania kompilatora. Czy zainstalowałeś go w całym systemie lub lokalnie? Jaki masz system operacyjny?

Można użyć -I<path>flagi, aby określić dodatkowy katalog, w którym kompilator powinien szukać nagłówków. Prawdopodobnie będziesz musiał to -L<path>zrobić, aby gcc mógł znaleźć bibliotekę, z którą będziesz się łączył -l<name>.

Kos
źródło