干净地退出python3函数而不离开repl

时间:2019-12-06 11:46:30

标签: python python-3.x read-eval-print-loop

我正在寻找一种方法来阻止脚本在用户输入时运行,而又不会在屏幕上显示混乱的异常输出,也不会重新引发异常。 我喜欢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()则不会发生。

1 个答案:

答案 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)