当我按下 ctrl-c 时,屏幕上会弹出提示,我输入 no,因为我想继续运行该程序,但无论如何该程序都会退出。我哪里错了?这个功能甚至可能吗?
from functools import wraps
import sys
class CleanExit(object):
def __init__(self, *args, **kw):
# You can supply an optional function
# to be called when the KeyboardInterrupt
# takes place.
# If the function doesn't require any arguments:
# @CleanExit(handler=func)
# If the function requires arguments:
# @CleanExit('foo', handler=handle)
self.kw = kw
self.args = args
self.handler = kw.get('handler')
def __call__(self, original_func):
decorator_self = self
@wraps(original_func)
def wrappee(*args, **kwargs):
try:
original_func(*args,**kwargs)
except KeyboardInterrupt:
if self.handler:
self.handler(*self.args)
else:
sys.exit(0)
return wrappee
def handle():
answer = raw_input("Are you sure you want to exit?").lower().strip()
if 'y' in answer:
sys.exit(0)
@CleanExit(handler=handle)
def f():
while 1: pass
f()
您的问题是您在处理函数后没有做任何事情来继续该函数 - 因此您的代码处理中断,然后无论如何退出。如果处理程序像这样成功退出,您可以递归地重新输入 wrappee:
def __call__(self, original_func):
decorator_self = self
@wraps(original_func)
def wrappee(*args, **kwargs):
try:
original_func(*args,**kwargs)
except KeyboardInterrupt:
if self.handler:
self.handler(*self.args)
wrappee(*args, **kwargs)
else:
sys.exit(0)
return wrappee
现在这应该有效。请注意,这有点顽皮,因为 Python 无法优化尾调用,因此如果您KeyboardInterrupt
经常使用sys.getrecursionlimit()
,Python 将耗尽堆栈帧并崩溃。
编辑:那太愚蠢了——仔细想想,这个函数对于手动递归来说是如此微不足道,它甚至可能都不算数。
def __call__(self, original_func):
decorator_self = self
@wraps(original_func)
def wrappee(*args, **kwargs):
while True:
try:
original_func(*args,**kwargs)
except KeyboardInterrupt:
if self.handler:
self.handler(*self.args)
else:
sys.exit(0)
return wrappee
也应该工作得很好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句