Bàn phím Python ngắt Ctrl + C

>>>>> greg [g] wrote:

>g> Philip Semanchuk đã viết.
>>> thử.
>>> sem. thu được[] # Người dùng nhấn Ctrl + C trong khi quá trình này đang chờ
>>> ngoại trừ.
>>> print "********* Tôi bắt được rồi. "

>>> Thay vào đó, lỗi Bàn phím bị gián đoạn được truyền đến trình thông dịch
>>> và quá trình này bị hủy như thể thử/ngoại trừ hoàn toàn không có.

>g> Không chắc chính xác chuyện gì đang xảy ra, nhưng tôi nghĩ mình có thể đoán được.
>g> Python cài đặt một trình xử lý tín hiệu cho Ctrl-C để đặt cờ
>g> trong trình thông dịch. Cứ mỗi quá nhiều mã byte được thực thi,
>g> cờ sẽ được kiểm tra và KeyboardInterrupt được nâng lên nếu
>g> được đặt.

>g> Vì vậy, có thể có độ trễ ngắn giữa tín hiệu Ctrl-C
>g> được nhận và KeyboardInterrupt được nâng lên, đồng thời
>g> seems that this delay results in it happening after the
>g> try-except has exited.

Tôi nghĩ bạn đang tiếp cận nguyên nhân của vấn đề.
Câu trả lời của bạn đã khơi dậy suy nghĩ sau đây trong đầu tôi.

Thực tế có hai trường hợp ngoại lệ xảy ra. Một là Ctrl-C, như
bạn nói chính xác, có thể sẽ bị trì hoãn cho đến khi có dấu `kiểm tra' trong
trình thông dịch [xem thêm David Beazley . Cái còn lại là ngoại lệ được tạo trong mã IPC
GIL]. The other one is the exception that is generated in the IPC code
bằng cách trả về NULL. Điều này nên được bắt bởi mệnh đề ngoại trừ.

Là cuộc gọi đến sem. nhận bản phát hành và yêu cầu lại GIL, tôi nghĩ
việc xử lý tín hiệu sẽ được thực hiện ngay lập tức. Điều này khiến ngoại lệ
KeyboardInterrupt xảy ra ngay lập tức. e. để làm gián đoạn
việc xử lý ngoại lệ khác.

>g> Bạn có thể thử sử dụng tín hiệu. signal[] để cài đặt trình xử lý
>g> cho Ctrl-C mà không làm gì trong phần xung quanh
>g> sem. nhận cuộc gọi[]. Điều đó sẽ ngăn cờ KeyboardInterrupt
>g> được đặt, nhưng tín hiệu sẽ vẫn xuất hiện
>g> ở cấp độ Unix, vì vậy hệ thống sẽ gọi .

đề nghị của bạn dường như làm việc

nhập posix_ipc
nhập tín hiệu

sem = posix_ipc. Semaphore[Không, posix_ipc. O_CREX]
tín hiệu. tín hiệu [tín hiệu. SIGINT, lambda sig, khung. Không]
trạng thái = []
thử.
trạng thái. append["Đang thử"]


sem. thu được [] # Người dùng nhấn Ctrl + C trong khi điều này đang chờ

trạng thái. append["Đã mua"]
ngoại trừ.
trạng thái. append["Tôi bắt được rồi. "]
trạng thái in

sem. close[]
sem. bỏ liên kết[]

bản in. ['Đang thử', 'Tôi bắt được rồi. ']

Tôi cũng đã thử một số biến thể khác, bắt được KeyboardInterrupt ở
các vị trí khác nhau.

Cái này in. ['Đang thử', 'Ngắt bàn phím']
Điều này gợi ý cho tôi rằng việc xử lý ngoại lệ đầu tiên bị hủy bỏ bởi
việc xử lý Ctrl-C.

nhập posix_ipc

sem = posix_ipc. Semaphore[Không, posix_ipc. O_CREX]

status = []
thử.
hãy thử.
trạng thái. append["Đang thử"]


sem. thu được [] # Người dùng nhấn Ctrl + C trong khi điều này đang chờ

trạng thái. append["Đã mua"]
ngoại trừ.
trạng thái. append["Tôi bắt được rồi. "]
ngoại trừ Ngắt bàn phím.
trạng thái. append["Keyboard Interrupt"]
trạng thái in

sem. close[]
sem. bỏ liên kết[]

Và cái này in. ['Đang thử', 'Tôi bắt được rồi. ']

nhập posix_ipc

sem = posix_ipc. Semaphore[Không, posix_ipc. O_CREX]

status = []
thử.
trạng thái. append["Đang thử"]


thử.
sem. thu được[] # Người dùng nhấn Ctrl + C trong khi quá trình này đang chờ

trạng thái. append["Acquired"]
ngoại trừ KeyboardInterrupt.
trạng thái. append["Ngắt"]
ngoại trừ.
trạng thái. append["Tôi bắt được rồi. "]
trạng thái in

sem. close[]
sem. bỏ liên kết[]

Tôi thực sự hơi ngạc nhiên khi việc bổ sung try/ngoại trừ
KeyboardInterrupt giúp giải quyết vấn đề nhưng dường như trình xử lý ngoại lệ
không .

Ghép hai lần thử thành một với hai mệnh đề ngoại trừ sẽ không hữu ích vì
thực sự có hai trường hợp ngoại lệ cần được xử lý.

Tôi cũng đã thêm bản in theo dõi trong trình xử lý ngoại lệ bên ngoài và nó
trỏ đến sem. có được dòng.

Kết luận của tôi là nếu có hai ngoại lệ cùng một lúc, thì
trình xử lý ngoại lệ bên trong sẽ bị gián đoạn bởi ngoại lệ kia thậm chí
trước . Và chỉ cái bên ngoài
thực sự được thực thi. Điều này giải thích hành vi mà OP mô tả.

Tôi nghĩ bạn chỉ có thể có hai ngoại lệ cùng lúc nếu ít nhất
một trong số đó là tín hiệu.
--
Piet van Oostrum
URL. http. //pietvanoostrum. com [PGP 8DAE142BE17999C4]
Email riêng tư. số Pi. @vanoostrum. tổ chức

Trong khi thực thi chương trình, trình thông dịch Python sẽ kiểm tra mọi ngắt một cách thường xuyên. Khi người dùng hoặc lập trình viên bấm nhầm hoặc cố ý nhấn phím ctrl – c hoặc phím del trong Python, trình thông dịch sẽ đưa ra ngoại lệ KeyboardInterrupt

Ngoại lệ KeyboardInterrupt, cách nó được tạo ra và cách nó được xử lý trong Python đều được đề cập trong bài viết trước. Ngoại lệ KeyboardInterrupt, như tên gọi của nó, là một ngoại lệ đơn giản được tạo ra khi một chương trình bị gián đoạn bởi bàn phím của người dùng. Điều quan trọng đối với bất kỳ lập trình viên nào, dù mới hay đã có kinh nghiệm, là nắm bắt mọi dạng ngoại lệ để xử lý chúng một cách thích hợp và tạo chương trình nhanh chóng [có thể xử lý mọi loại tình huống như vậy]

Tại sao lỗi ngắt bàn phím Python?

Lỗi ngắt bàn phím . when you try to stop a running program by pressing ctrl+c or ctrl+z in a command line or interrupting the kernel in Jupyter Notebook.

Tín hiệu nào là ngắt bàn phím?

Trong điện toán, ngắt bàn phím có thể đề cập đến. Trường hợp đặc biệt của tín hiệu [máy tính], một điều kiện [thường được triển khai dưới dạng ngoại lệ] thường được tạo bởi bàn phím trong giao diện người dùng văn bản . Một ngắt phần cứng được tạo ra khi nhấn hoặc nhả một phím, hãy xem bộ điều khiển bàn phím [máy tính]

Chủ Đề