lỗi nghiêm trọng: Python.h: Không có tệp hoặc thư mục như vậy


1193

Tôi đang cố gắng xây dựng thư viện dùng chung bằng tệp mở rộng C nhưng trước tiên tôi phải tạo tệp đầu ra bằng lệnh bên dưới:

gcc -Wall utilsmodule.c -o Utilc

Sau khi thực hiện lệnh, tôi nhận được thông báo lỗi này:

utilsmodule.c: 1: 20: lỗi nghiêm trọng: Python.h: Không có quá trình biên dịch tệp hoặc thư mục như vậy bị chấm dứt.

Tôi đã thử tất cả các giải pháp được đề xuất qua internet nhưng vấn đề vẫn còn tồn tại. Tôi không có vấn đề với Python.h. Tôi quản lý để xác định vị trí các tập tin trên máy của tôi.

Câu trả lời:


2235

Có vẻ như bạn chưa cài đặt đúng các tệp tiêu đề và thư viện tĩnh cho python dev. Sử dụng trình quản lý gói của bạn để cài đặt chúng trên toàn hệ thống.

Dành cho apt( Ubuntu, Debian ... ):

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

Dành cho yum( CentOS, RHEL ... ):

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

Dành cho dnf( Fedora ... ):

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

Dành cho zypper( openSUSE ... ):

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

Dành cho apk( Alps ... ):

# 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

Dành cho apt-cyg( Cygwin ... ):

apt-cyg install python-devel   # for python2.x installs
apt-cyg install python3-devel  # for python3.x installs

21
Hãy thử locate Python.hvà xem nếu bạn đã có tệp trước khi bạn làm tất cả điều này. Nếu bạn có thể tìm thấy tệp nằm trong đó, phần lớn câu trả lời này sẽ hoạt động: stackoverflow.com/a/19344978/4954434 (Đây có thể chỉ là sự cố đường dẫn)
Jithin Pavithran

2
@ Hack-R và những người khác nếu bạn đã cài đặt Python 2.6 2.7, "python-devel" sẽ chỉ cài đặt các thư viện dev cho 2.6. Để buộc nó cài đặt các thư viện 2.7, hãy sử dụngsudo yum install python27-devel
Doktor J

15
Tôi đang sử dụng python3.6 vào ngày 14.04 apt-get install python3.6-devlàm việc cho tôi.
bit

9
làm việc tốt với tôi (ubfox 14.04) nhưng phải chỉ định số phiên bản hoàn chỉnhsudo apt-get install python3.6-dev
Landrykapela

17
Tương tự như vậy với sudo apt-get install python3.7-dev.
kas

346

Trên Ubuntu, tôi đang chạy Python 3 và tôi phải cài đặt

sudo apt-get install python3-dev

Nếu bạn muốn sử dụng phiên bản Python không được liên kết với python3, hãy cài đặt gói python3.x-dev được liên kết. Ví dụ:

sudo apt-get install python3.5-dev

32
Tôi đã chạy lệnh sudo apt-get install python3.4-devcho Python3.4 của tôi và điều này đã giải quyết vấn đề của tôi.
Aaron Lelevier

4
@Rawrgulmuffins tốt, nó phụ thuộc vào phiên bản python bạn đang sử dụng. Trong trường hợp của tôi, tôi đã sudo apt-get install python2.7-devkhắc phục sự cố
RockScience

6
Tôi muốn thêm một điều nữa vào câu trả lời này - nếu bạn có nhiều phiên bản Python 3.x, python3-devsẽ cài đặt các phụ thuộc cho phiên bản được liên kết với python3lệnh. Vì vậy, nếu bạn muốn cài đặt cho một phiên bản cụ thể, hãy sử dụng phiên bản đầy đủ như - python3.x-dev.
xyres

3
Điều này đã giúp với python 3.6.3 trên Ubuntu 14.04sudo apt-get install python3.6-dev
mã hóa

Nếu chạy phiên bản Python trong môi trường ảo khác với Python hệ thống của bạn thì đây.
SuperShoot

75

Đối với Python 3.7Ubuntu nói riêng, tôi cần

sudo apt install libpython3.7-dev

. Tôi nghĩ rằng tại một số điểm tên đã được thay đổi từ pythonm.n-devnày.

cho Python 3.6, tương tự:

sudo apt install libpython3.6-dev

6
ty: rơi nước mắt:
valem

1
ồ Sau 30 phút tìm kiếm và cài đặt tất cả các loại công cụ, câu trả lời này thực sự đã giải quyết được vấn đề
Vyacheslav Tsivina

!!!!! Tất nhiên đây là giải pháp phù hợp với tôi khi sử dụng Python 3.7 và Ubuntu 18.04.
Villamejia

cảm ơn <3 <3 <3
Cà phê inTime

1
nó cũng hoạt động với python 3.6 ... nhưngsudo apt install libpython3.6-dev
Morteza Afshari

70

Hai điều bạn phải làm.

Cài đặt gói phát triển cho Python, trong trường hợp Debian / Ubuntu / Mint, nó được thực hiện bằng lệnh:

sudo apt-get install python-dev

Điều thứ hai là bao gồm các tệp không theo mặc định trong đường dẫn bao gồm, cũng không phải thư viện Python được liên kết với thực thi theo mặc định. Bạn cần thêm các cờ này (thay thế phiên bản của Python cho phù hợp):

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

Nói cách khác, lệnh biên dịch của bạn phải là:

gcc -Wall -I/usr/include/python2.7 -lpython2.7  utilsmodule.c -o Utilc 

Tôi có phải thêm cờ cho mỗi tệp được bao gồm trong tệp mở rộng C không ??
Mohanad Y.

1
Nếu bạn đang sử dụng một phiên bản Python khác, ví dụ 3.3: sudo apt-get install python3.3-dev
FreshPow

Tôi khuyên bạn nên sử dụng pkg-configthay vì thô -I: stackoverflow.com/a/21531170/895245
Ciro Santilli 病毒 审查 六四 事件

47

Nếu bạn đang sử dụng Raspberry Pi:

sudo apt-get install python-dev

35

trên Fedora chạy cái này cho Python 2:

sudo dnf install python2-devel

và cho Python 3:

sudo dnf install python3-devel

1
Trên Mint 18.2 (dựa trên Ubuntu), nó đã được apt-get install python-dev.
Deleet

30

Nếu bạn đang sử dụng độc tố để chạy thử nghiệm trên nhiều phiên bản Python, bạn có thể cần cài đặt thư viện dev của Python cho từng phiên bản Python mà bạn đang thử nghiệm.

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

27

Giải pháp cho Cygwin

Bạn cần cài đặt gói python2-develhoặcpython3-devel tùy thuộc vào phiên bản Python bạn đang sử dụng.

Bạn có thể nhanh chóng cài đặt nó bằng cách sử dụng 32 bit hoặc 64 bit setup.exe (tùy thuộc vào cài đặt của bạn) từ Cygwin.com .

Ví dụ (sửa đổi setup.exetên tệp và phiên bản chính của Python nếu bạn cần):

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

Bạn cũng có thể kiểm tra câu trả lời khác của tôi để biết thêm một vài tùy chọn để cài đặt các gói của Cygwin từ dòng lệnh.


22

Trong API AWS (centOS), API của nó

yum install python27-devel

Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào .
Wtower

2
@Wtower Có, nó cung cấp một câu trả lời.
Tadeusz Kopec

1
Nó cung cấp một câu trả lời. Mặc dù bạn phải thay thế phiên bản cho những gì bạn cần.
Ganesh Krishnan

1
điều này đã giúp khắc phục các vấn đề của tôi khi cố gắng pip install cryptographytrên một phiên bản linux của amazon.
Ryan Tuck

Đây là một câu trả lời hữu ích, trong khi có thể cài đặt python-devel hoặc python2-devel trên Amazon Linux, đây là cách duy nhất thực sự hiệu quả với tôi khi chạy cài đặt pip bên trong virtualenv
Kristofor Carle

21

Đối với tôi, thay đổi nó để làm việc này:

#include <python2.7/Python.h>

Tôi đã tìm thấy tệp /usr/include/python2.7/Python.hvà vì /usr/includeđã có trong đường dẫn bao gồm, python2.7/Python.hnên sẽ là đủ.

Thay vào đó, bạn cũng có thể thêm đường dẫn bao gồm từ dòng lệnh - gcc -I/usr/lib/python2.7(cảm ơn @ erm3nda).


4
Tất cả các câu trả lời khác nói với bạn để cài đặt một cái gì đó. Cái này làm việc cho tôi Tại sao đây không phải là câu trả lời hàng đầu?
noɥʇʎԀʎzɐɹƆ

1
@ uoɥʇʎPʎzɐɹC Có lẽ vì nó sẽ không chạy dưới python3?
Louis

Nó là tốt hơn để đặt lib tại gcc -I/usr/lib/python2.7 etcchứ không phải mã hóa cứng các cuộc gọi bao gồm.
m3nda

1
@ noɥʇʎԀʎzɐɹƆ Vì nó sẽ hoạt động mà không thay đổi mã. Bạn thường cần biên dịch một mã không thuộc sở hữu của bạn, ví dụ như một số phụ thuộc bên ngoài và điều tồi tệ nhất bạn có thể làm là sửa đổi mã đó.
David Ferenczy Rogožan

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

19

Đảm bảo rằng các tệp dev của Python đi kèm với HĐH của bạn.

Bạn không nên cứng mã thư viện và bao gồm các đường dẫn. Thay vào đó, hãy sử dụng pkg-config, nó sẽ đưa ra các tùy chọn chính xác cho hệ thống cụ thể của bạn:

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

Bạn có thể thêm nó vào dòng gcc của bạn :

gcc -Wall utilsmodule.c -o Utilc $(pkg-config --cflags --libs python2) 


14

Trong trường hợp của tôi, cái đã sửa nó trong Ubuntu là cài đặt các gói libpython-all-dev(hoặc libpython3-all-devnếu bạn sử dụng Python 3).


2
python-all-devtrong trường hợp của tôi, nhưng đủ gần.
Dave S.

1
@Oriol Nieto, Cảm ơn bạn rất nhiều. python-all-dev cũng giải quyết vấn đề cho tôi.
shINA_lakhe

14

Nếu bạn sử dụng virtualenv với python 3.6 (cạnh ngay bây giờ), hãy chắc chắn cài đặt python 3.6 dev sudo apt-get install python3.6-dev, nếu không, việc thực thi sudo python3-devsẽ cài đặt python dev 3.3.3-1, điều này sẽ không giải quyết được vấn đề.


1
Làm việc tuyệt vời cho tôi trên 3.5 (.2), ​​quá. Hoàn toàn cài đặt gói dev đúng cho phiên bản Python của bạn là một điều tốt.
Seth

13

Nó không giống như vậy, nhưng nó cũng hoạt động với tôi và bây giờ tôi có thể sử dụng SWIG với Python3.5 :

Tôi đã cố gắng biên dịch:

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

Với Python 2.7 hoạt động tốt, không phải với phiên bản 3.5 của tôi:

tồn tại_wrap.c: 147: 21: lỗi nghiêm trọng: Python.h: Không tồn tại quá trình biên dịch el archivo o el directorio chấm dứt.

Sau khi chạy trong bản cài đặt Ubuntu 16.04 của tôi:

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

Bây giờ tôi có thể biên dịch mà không gặp sự cố Python3.5:

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

11

Tôi cũng gặp phải lỗi này khi tôi đang cài đặt coolprop trong ubfox.

Đối với Ubuntu 16.04 với python 3.6

sudo apt-get install python3.6-dev

Nếu nó không hoạt động, hãy thử cài đặt / cập nhật gcclib.

sudo apt-get install gcc

1
ồ, tôi đã vật lộn với điều này từ lâu vì tôi đã chạy python3-devnhiều lần và liên tục gặp lỗi tương tự, nhưng không biết về python3.6-dev!! Cảm ơn!!
Blairg23

10

thử tập tin apt. Thật khó để nhớ tên gói nơi tệp bị thiếu nằm. Nó là chung chung và hữu ích cho bất kỳ tập tin gói.

Ví dụ:

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# 

Bây giờ bạn có thể làm cho một chuyên gia đoán xem nên chọn cái nào.


10

Tôi đã quản lý để giải quyết vấn đề này và tạo tệp .so trong một lệnh

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

8

Đối với các đồng chí OpenSuse ngoài kia:

sudo zypper install python3-devel


5

Nếu bạn đang sử dụng Python 3.6 trên Amazon Linux (dựa trên RHEL, nhưng các câu trả lời của RHEL được đưa ra ở đây không hoạt động):

sudo yum install python36-devel

4

Lỗi này xảy ra khi tôi cố cài đặt ctds trên CentOS 7 với Python3.6. Tôi đã làm tất cả các thủ thuật được đề cập ở đây bao gồm yum install python34-devel. Vấn đề đã Python.hđược tìm thấy trong /usr/include/python3.4m but not in /usr/include/python3.6m. Tôi đã cố gắng sử dụng --global-optionđể trỏ đến bao gồm dir ( pip3.6 install --global-option=build_ext --global-option="--include-dirs=/usr/include/python3.4m" ctds). Điều này dẫn đến lpython3.6mkhông tìm thấy khi liên kết ctds.

Cuối cùng, những gì đã làm việc là sửa môi trường phát triển cho Python3.6 cần sửa với các bao gồm và 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 cần có trong đường dẫn bao gồm của bạn cho gcc. Bất kỳ phiên bản nào của python đều được sử dụng, ví dụ nếu là 3.6, thì nó /usr/include/python3.6m/Python.hthường ở trong đó .


Không chắc chắn tại sao có -1 nhưng đây là một vấn đề cho đến ngày hôm nay đối với python3.6 với CentOS vì python36-devel không khả dụng. Bạn sẽ cần phải cài đặt nó từ URL ở trên.
Babu Arunachalam

4

Chắc chắn python-devhoặc libpython-all-devlà điều đầu tiên ( apt) install, nhưng nếu điều đó không giúp ích gì cho trường hợp của tôi, tôi khuyên bạn nên cài đặt các gói Giao diện Chức năng nước ngoài bằng cách sudo apt-get install libffi-devsudo pip install cffi .

Điều này sẽ giúp đỡ đặc biệt là nếu bạn thấy lỗi là / từ c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory.


sudo pip3 cài đặt cffi (# cho python3)
Magnus Melwin

3

Nó thường xuất hiện khi bạn cố gắng gỡ bỏ python3.5và cài đặt python3.6.

Vì vậy, khi sử dụng python3(which python3 -V=> python3.6) để cài đặt một số gói yêu cầu python3.5tiêu đề sẽ xuất hiện lỗi này.

Giải quyết bằng cách cài đặt python3.6-devmô-đun.


3
  1. Bạn phải cài đặt các tệp phát triển Python trên hệ điều hành của mình nếu Python được cung cấp cùng với hệ điều hành của bạn không đi kèm với chúng. Nhiều câu trả lời cho câu hỏi này cho thấy vô số cách có thể đạt được trên các hệ thống khác nhau.

  2. Khi bạn đã làm như vậy, vấn đề là nói cho trình biên dịch biết vị trí của chúng và cách biên dịch chống lại chúng. Python đi kèm với một chương trình được gọi là python-config. Để biên dịch, bạn cần --includesđầu ra và để liên kết một chương trình với thư viện Python (nhúng Python vào chương trình của bạn) --ldflagsđầu ra. Thí dụ:

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

Các python-configchương trình có thể được đặt theo tên của các phiên bản Python - trên Debian, Ubuntu ví dụ này có thể được đặt tên python3-confighay python3.6-config.


2

Đôi khi ngay cả sau khi cài đặt python-dev, lỗi vẫn tồn tại, Kiểm tra lỗi nếu nó bị thiếu 'gcc'.

Tải xuống đầu tiên như đã nêu trong https://stackoverflow.com/a/21530768/8687063 , sau đó cài đặt gcc

Đối với apt (Ubuntu, Debian ...):

sudo apt-get install gcc

Dành cho yum (CentOS, RHEL ...):

sudo yum install gcc

Dành cho dnf (Fedora ...):

sudo dnf install gcc

Đối với zypper (openSUSE ...):

sudo zypper in gcc

Đối với apk (Alps ...):

sudo apk gcc

1

Điều này có nghĩa Python.hlà không có trong đường dẫn mặc định của trình biên dịch của bạn. Bạn đã cài đặt nó trên toàn hệ thống hoặc cục bộ? HĐH của bạn là gì?

Bạn có thể sử dụng -I<path>cờ để chỉ định một thư mục bổ sung nơi trình biên dịch của bạn sẽ tìm kiếm các tiêu đề. Bạn có thể sẽ phải theo dõi -L<path>để gcc có thể tìm thấy thư viện mà bạn sẽ liên kết bằng cách sử dụng -l<name>.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.