在不离开repl的情况下干净地退出python3函数

在不离开repl的情况下干净地退出python3函数,python,python-3.x,read-eval-print-loop,Python,Python 3.x,Read Eval Print Loop,我正在寻找一种方法来阻止脚本在用户输入时运行,而不会在屏幕上获得混乱的异常输出,也不会重新启动。 我喜欢sys.exit()方法,它在运行python3 myscript.py时完全达到了我想要的效果,但是如果以交互方式运行函数,这也会杀死我的repl,这是我想要避免的 例如: def wait_input(message,timeout): print (message) i, o, e = select.select( [sys.stdin], [], [], timeout

我正在寻找一种方法来阻止脚本在用户输入时运行,而不会在屏幕上获得混乱的异常输出,也不会重新启动。 我喜欢
sys.exit()
方法,它在运行
python3 myscript.py
时完全达到了我想要的效果,但是如果以交互方式运行函数,这也会杀死我的repl,这是我想要避免的

例如:

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
>

重要提示:请注意,中止后我仍处于repl状态,如果我在代码中实际使用sys.exit(),则不会发生这种情况。

显然,可以判断Python是否处于交互模式,如中所示。那么,这个呢:

def是交互式的()
尝试:
返回sys.ps1和True
除属性错误外:
返回错误
def用户检查点(问题,已接受的答案=(“是”):
答案=等待输入(问题,3600)。下限()
如果答案不在已接受的答案中:
打印(‘中止’)
如果是交互式的():
sys.tracebacklimit=0#编辑1
升起键盘中断
其他:
sys.exit()
编辑2:

下面是另一种可能有效的方法:使用自定义上下文管理器

class CleanExit():
定义输入(自我):
回归自我
定义退出(自身、exc类型、exc值、exc tb):
如果exc_类型为键盘中断:
返回真值
返回exc_类型为“无”
使用CleanExit():
打印('hi')
a=input()#此处按Ctrl-C键
印刷品(a)

显然,可以判断Python是否处于交互模式,如中所示。那么,这个呢:

def是交互式的()
尝试:
返回sys.ps1和True
除属性错误外:
返回错误
def用户检查点(问题,已接受的答案=(“是”):
答案=等待输入(问题,3600)。下限()
如果答案不在已接受的答案中:
打印(‘中止’)
如果是交互式的():
sys.tracebacklimit=0#编辑1
升起键盘中断
其他:
sys.exit()
编辑2:

下面是另一种可能有效的方法:使用自定义上下文管理器

class CleanExit():
定义输入(自我):
回归自我
定义退出(自身、exc类型、exc值、exc tb):
如果exc_类型为键盘中断:
返回真值
返回exc_类型为“无”
使用CleanExit():
打印('hi')
a=input()#此处按Ctrl-C键
印刷品(a)

谢谢Sammy,不幸的是,在这种情况下,
raise KEYBOARD INTERRUP
不会干净地退出tho:它仍然会抛出很多回溯文本,理想情况下我想隐藏这些文本,Sammy,不幸的是,在这种情况下,
raisekeyboardinterrupt
不会干净地退出,因为它仍然会抛出很多我希望隐藏的回溯文本