我正在寻找一种方法来阻止脚本在用户输入时运行,而又不会在屏幕上显示混乱的异常输出,也不会重新引发异常。
我喜欢sys.exit()
方法,它可以完全实现我在运行python3 myscript.py
时想要的功能,但是如果我以交互方式运行函数,这也会杀死我的代表,这是我要避免的。
一个例子是:
def wait_input(message,timeout):
print (message)
i, o, e = select.select( [sys.stdin], [], [], timeout )
if (i):
return sys.stdin.readline().strip()
else:
return ""
def user_checkpoint(question, accepted_answers=("y","yes") ):
answer = wait_input(question,3600).lower()
if answer not in accepted_answers:
print('Abort')
somethinglike.sys.exit()
> user_checkpoint('keep running?')
n
Abort
>
重要:请注意,我在Abort之后仍然处于替换状态,如果我确实在代码中使用sys.exit()则不会发生。
答案 0 :(得分:0)
很显然,可以判断Python是否处于交互模式,如Tell if Python is in interactive mode所示。那么,如何呢?
def is_interactive():
try:
return sys.ps1 and True
except AttributeError:
return False
def user_checkpoint(question, accepted_answers=("y","yes") ):
answer = wait_input(question,3600).lower()
if answer not in accepted_answers:
print('Abort')
if is_interactive():
sys.tracebacklimit = 0 # edit 1
raise KeyboardInterrupt
else:
sys.exit()
编辑2:
这是另一种可行的方法,来自Capture keyboardinterrupt in Python without try-except:使用自定义上下文管理器。
class CleanExit():
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, exc_tb):
if exc_type is KeyboardInterrupt:
return True
return exc_type is None
with CleanExit():
print('hi')
a = input() # Ctrl-C here
print(a)