结束无限循环

Ble*_*oul 32 python infinite-loop while-loop

我目前有代码基本上运行无限循环来从用户收集数据.根据文本文件的内容不断更新字典/列表.以供参考:

while (True):
    IDs2=UpdatePoints(value,IDs2)
    time.sleep(10)
Run Code Online (Sandbox Code Playgroud)

基本上,我的问题是我不知道什么时候我希望它结束​​,但在此循环运行之后我想使用收集的信息,而不是因为崩溃我的程序而丢失它.是否有一种简单,优雅的方式可以随时退出while循环?像按键盘上的某个按键会很棒.

Ste*_*ard 74

您可以尝试将该代码包装在try/except块中,因为键盘中断只是例外:

try:
    while True:
        IDs2=UpdatePoints(value,IDs2)
        time.sleep(10)
except KeyboardInterrupt:
    print('interrupted!')
Run Code Online (Sandbox Code Playgroud)

然后你可以用CTRL-C退出循环.

  • 尝试......除了...块不仅仅是"不应该发生的东西".事实上,["Python通常推荐EAFP政策"](http://legacy.python.org/dev/peps/pep-0463/)(更容易请求宽恕而不是许可) (5认同)
  • 我必须说,这是我见过的try / except块的更整洁的用法之一。我可以尝试使用此模式进行调试。 (2认同)

Tri*_*tan 16

你可以使用例外.但是你应该只为不应该发生的事情使用异常.所以不是为了这个.

这就是我推荐信号的原因:

import sys, signal
def signal_handler(signal, frame):
    print("\nprogram exiting gracefully")
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)
Run Code Online (Sandbox Code Playgroud)

你应该把它放在程序的开头,当你在程序的任何地方按ctrl + c时它会正常关闭

代码说明:

你导入syssignals.然后你创建一个在退出时执行的函数.sys.exit(0)用退出代码0停止编程(代码说,一切都很顺利).

当程序通过ctrl-c或终端中的kill命令获取SIGINT时,程序将正常关闭.

  • 当 try-except 没有时,这对我有用。不知道为什么,恐怕我没有时间调查。 (2认同)

ean*_*son 5

我认为最简单的解决方案是在按下中断键时捕获KeyboardInterrupt,并使用它来确定何时停止循环.

except KeyboardInterrupt:
    break
Run Code Online (Sandbox Code Playgroud)

查找此异常的缺点是,它可能会阻止用户在循环仍在运行时终止程序.