2011-08-16 114 views

回答

20
import sys 
try: 
    # your code 
except KeyboardInterrupt: 
    sys.exit(0) # or 1, or whatever 

是最簡單的方式,假設你還是想你的時候退出得到一個Ctrl + c

如果你想陷阱它沒有一個try /除外,您可以使用signal module使用recipe like this,但似乎爲我工作在Windows ..

+0

鑑於信號是SIGINT,退出狀態爲0是根本錯誤的。理想情況下,必須保留返回的退出狀態,就好像沒有發現異常一樣。評論「或1」不夠好;期望**的**退出碼爲1。 –

+0

@A-B-B如果用Ctrl-C退出程序不是退出程序的標準非錯誤方式,則退出代碼爲1。如果此退出方式表示成功,則表示預期退出代碼爲零。僅僅因爲這樣使用Ctrl-C可能不是一個好主意,並不意味着人們不會這樣做(並且我已經使用過這樣的程序)。 – agf

+0

當然,但在您的答案中包含退出代碼0作爲默認選擇仍然看起來如此。 –

1

搭上了IT/except塊:

while True: 
    try: 
     print "This will go on forever" 
    except KeyboardInterrupt: 
     pass 
2
try: 
    your_stuff() 
except KeyboardInterrupt: 
    print("no traceback") 
0

不另外請注意,在默認情況下解釋以狀態碼128 +退出平臺上的SIGINT值(在大多數系統上爲2)。

import sys, signal 

    try: 
     # code... 
    except KeyboardInterrupt: # Suppress tracebacks on SIGINT 
     sys.exit(128 + signal.SIGINT) # http://tldp.org/LDP/abs/html/exitcodes.html 
+0

如果放棄說shell命令'sleep 10',退出代碼的確在我的系統上是130。然而,在''KeyboardInterrupt'在Python中引發的退出代碼只是1.考慮[這個關閉的錯誤](https://bugs.python.org/issue14229)。因此,我相信答案是不一致的。 –

25

試試這個:

import signal 
signal.signal(signal.SIGINT, lambda x,y: sys.exit(0)) 

這樣你就不需要在異常處理程序包的一切。

+0

鑑於'SIGINT'被觸發,退出狀態0是根本錯誤的。理想情況下,必須保留返回的退出狀態,就好像沒有發現異常一樣。 –

+0

不完全理解lambda;你能否在這裏解釋「x,y:」的用法,而不僅僅是「x:」? – Locane

+0

@Locane這是因爲[this](https://docs.python.org/3.7/library/signal.html#signal.signal),基本上signal.signal的第二個參數是一個函數'處理程序',需要兩個參數。 爲了清晰起見,x和y可以像這樣重命名爲:signal.signal(signal.SIGINT,lambda signal_number,current_stack_frame:sys.exit(0))' – oidualc

-4
import sys 
try: 
    print("HELLO") 
    english = input("Enter your main launguage: ") 
    print("GOODBYE") 
except KeyboardInterrupt: 
    print("GET LOST")