我目前的代码基本上运行一个无限的while循环来收集用户的数据。根据文本文件的内容不断更新字典/列表。供参考:
while (True):
IDs2=UpdatePoints(value,IDs2)
time.sleep(10)
基本上,我的问题是我不知道什么时候我希望这个结束,但是在这个循环运行之后我想要使用收集的信息,而不是因为崩溃我的程序而丢失它。是否有一种简单,优雅的方式可以随时退出while循环?像按键盘上的某个按键会很棒。
答案 0 :(得分:65)
您可以尝试在try / except块中包装该代码,因为键盘中断只是例外:
try:
while True:
IDs2=UpdatePoints(value,IDs2)
time.sleep(10)
except KeyboardInterrupt:
print('interrupted!')
然后你可以用CTRL-C退出循环。
答案 1 :(得分:13)
您可以使用例外。但是你应该只为不应该发生的事情使用异常。所以不是为了这个。
这就是我推荐信号的原因:
import sys, signal
def signal_handler(signal, frame):
print("\nprogram exiting gracefully")
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
你应该把它放在程序的开头,当你在程序中的任何地方按ctrl + c它会正常关闭
代码说明:
您导入sys
和signals
。
然后你创建一个在退出时执行的函数。 sys.exit(0)
使用退出代码0停止编程(代码表示一切顺利)。
当程序通过ctrl-c或终端中的kill命令获取SIGINT时,程序将正常关闭。
答案 2 :(得分:4)
我认为最简单的解决方案是在KeyboardInterrupt时捕获interrupt key is pressed,并使用它来确定何时停止循环。
except KeyboardInterrupt:
break
查找此异常的缺点是,它可能会阻止用户在循环仍在运行时终止程序。
答案 3 :(得分:1)
我使用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 - C 键盘中断功能将异常切换为try循环使while循环无效,从而使脚本可以完成数据保存协议,而不会导致整个脚本突然停止。
希望这会有所帮助!
答案 4 :(得分:0)
如果您正在Google Colab或Jupyter中的IPYNB文件上运行,我建议在循环中使用try, except
语法,例如:
while True:
try:
IDs2=UpdatePoints(value,IDs2)
time.sleep(10)
except KeyboardInterrupt:
break
except:
continue
最后一个except
是任何其他错误(如果发生),循环将恢复
答案 5 :(得分:-3)
您可以在 Python 中捕获 KeyboardInterrupt
错误:
try:
while 1>0:
IDs2=UpdatePoints(value,IDs2)
time.sleep(10)
except KeyboardInterrupt:
print('While loop ended!')
另外,不要说:
while True:
看起来更专业:
while 1>0:
要阅读有关 Python 错误处理(尝试、除外等)的更多信息:
<块引用>https://www.w3schools.com/python/python_try_except.asp
或:
<块引用>https://www.w3schools.com/python/gloss_python_try_finally.asp