干净地退出python3函数,不离开副本

问题描述 投票:1回答:1

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

python python-3.x read-eval-print-loop
1个回答
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(object):
    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():
    input() 
© www.soinside.com 2019 - 2024. All rights reserved.