52

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

while (True):
    IDs2=UpdatePoints(value,IDs2)
    time.sleep(10)

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

4

6 回答 6

104

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

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

然后您可以使用 CTRL-C 退出循环。

于 2013-09-25T01:54:16.267 回答
34

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

这就是为什么我推荐信号:

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

signal.signal(signal.SIGINT, signal_handler)

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

代码说明:

您导入syssignals. 然后你创建一个在退出时执行的函数。sys.exit(0)使用退出代码 0 停止编程(代码表示一切正常)。

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

于 2016-07-29T18:54:24.143 回答
5

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

except KeyboardInterrupt:
    break

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

于 2013-09-25T01:54:29.063 回答
2

我使用 python 来跟踪股票价格并在我的投资组合中提交自动买入/卖出命令。长话短说,我希望我的跟踪程序 ping 数据服务器以获取信息,并根据收集到的信息进行交易,但我还想保存股票数据以供将来参考,除了能够启动/停止程序每当我想。

最终为我工作的是以下内容:

trigger = True
while trigger == True:
 try:
  (tracking program and purchasing program conditions here)
 except:
  trigger = False

print('shutdown initialized')
df = pd.DataFrame...
save all the datas
print('shutdown complete')

等等

从这里开始,当程序处于永远循环中,从我的代理的 API 发送数据请求时,使用CTRL-keyboard Cinterrupt 函数将异常切换到 try 循环,这会使 while 循环无效,从而允许脚本完成数据保存协议没有使整个脚本突然停止。

希望这可以帮助!

结果

于 2019-02-11T22:14:53.810 回答
0

try, except如果您在 Google Colab 或 Jupyter 中的 IPYNB 文件上运行,我建议在循环中使用该语法,例如:

while True:
    try:
       IDs2=UpdatePoints(value,IDs2)
       time.sleep(10)
    except KeyboardInterrupt:
       break
    except:
       continue

最后一个except是针对任何其他错误,如果发生循环将恢复

于 2020-06-24T12:03:16.867 回答
-4

KeyboardInterrupt您可以在 Python中捕获错误:

try:
    while 1>0:
        IDs2=UpdatePoints(value,IDs2)
        time.sleep(10)
except KeyboardInterrupt:
    print('While loop ended!')

另外,不要说:

while True:

使用起来看起来更专业:

while 1>0:

阅读更多关于 Python 错误处理(try、except 等)的信息:

https://www.w3schools.com/python/python_try_except.asp

或者:

https://www.w3schools.com/python/gloss_python_try_finally.asp

于 2021-01-21T07:12:01.143 回答