2011-08-16 75 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")