【问题标题】:exit python3 function cleanly without leaving repl干净地退出python3函数而不离开repl
【发布时间】:2020-03-31 09:52:57
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    显然,可以判断 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) 
    

    【讨论】:

    • 谢谢 Sammy,不幸的是在这种情况下 raise KeyboardInterrupt 不会干净地退出:它仍然会抛出很多我想隐藏的回溯文本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多