Có cách nào để giữ tracebacks từ mọc lên khi bạn nhấn tổ hợp phím Ctrl + c, ví dụ: tăng KeyboardInterrupt
trong một kịch bản Python?Di traceback bằng Python trên Ctrl-C
Trả lời
import sys
try:
# your code
except KeyboardInterrupt:
sys.exit(0) # or 1, or whatever
có phải là cách đơn giản nhất, giả sử bạn vẫn muốn thoát ra khi bạn nhận được Ctrl + c.
Nếu bạn muốn bẫy nó mà không có một thử/trừ, bạn có thể sử dụng một recipe like this sử dụng signal
module, ngoại trừ nó dường như không làm việc cho tôi trên Windows ..
Săn KeyboardInterrupt
:
try:
# do something
except KeyboardInterrupt:
pass
Catch nó với một thử/trừ khối:
while True:
try:
print "This will go on forever"
except KeyboardInterrupt:
pass
try:
your_stuff()
except KeyboardInterrupt:
print("no traceback")
Cũng lưu ý rằng theo mặc định các thông dịch viên thoát với mã trạng thái 128 + giá trị của SIGINT trên nền tảng của bạn (là 2 trên hầu hết các hệ thống).
import sys, signal
try:
# code...
except KeyboardInterrupt: # Suppress tracebacks on SIGINT
sys.exit(128 + signal.SIGINT) # http://tldp.org/LDP/abs/html/exitcodes.html
Nếu hủy bỏ nói lệnh shell 'sleep 10', mã thoát thực sự là 130 trên hệ thống của tôi. Tuy nhiên, mã thoát cho khi 'KeyboardInterrupt' được nâng lên trong Python đơn giản là 1. Hãy xem xét [lỗi đóng này] (https://bugs.python.org/issue14229). Như vậy, tôi tin câu trả lời là không phù hợp. –
Hãy thử điều này:
import signal
signal.signal(signal.SIGINT, lambda x,y: sys.exit(0))
Bằng cách này bạn không cần phải quấn tất cả mọi thứ trong một trình xử lý ngoại lệ.
Về cơ bản là sai khi thoát với trạng thái 0 cho rằng 'SIGINT' được kích hoạt. Trạng thái thoát được trả về phải được giữ nguyên lý tưởng, như thể ngoại lệ không bị bắt. –
Không hoàn toàn hiểu lambda; bạn có thể giải thích việc sử dụng "x, y:" ở đây thay vì chỉ "x:" không? – Locane
@Locane đó là vì [this] (https://docs.python.org/3.7/library/signal.html#signal.signal), về cơ bản đối số thứ hai của signal.signal là một hàm 'handler' có hai thông số. Để rõ ràng x và y có thể được đổi tên như thế này 'signal.signal (signal.SIGINT, lambda signal_number, current_stack_frame: sys.exit (0))' – oidualc
import sys
try:
print("HELLO")
english = input("Enter your main launguage: ")
print("GOODBYE")
except KeyboardInterrupt:
print("GET LOST")
Về cơ bản là sai khi thoát với trạng thái 0 do SIGINT được báo hiệu. Trạng thái thoát được trả về phải được giữ nguyên lý tưởng, như thể ngoại lệ không bị bắt. Nhận xét "hoặc 1" không đủ tốt; một ** mã thoát 1 được mong đợi **. –
@ A-B-B mã thoát của 1 được mong đợi nếu thoát khỏi chương trình bằng Ctrl-C không phải là cách tiêu chuẩn, không có lỗi khi thoát khỏi nó. Nếu phương thức thoát này biểu thị thành công, thì 0 là mã thoát được mong đợi. Chỉ vì nó có thể là một ý tưởng tồi để sử dụng Ctrl-C theo cách này không có nghĩa là mọi người không (và tôi đã sử dụng các chương trình làm). – agf
Chắc chắn, nhưng bao gồm một mã thoát là 0 như một sự lựa chọn mặc định trong câu trả lời của bạn vẫn có vẻ như không rõ. –