使用诅咒模块的无限循环快速退出Python程序的最佳方法是什么?
我尝试在循环的末尾添加nodelay()方法,并将其与此结合起来:
if screen.getch() == ord('q'):
break然而,在循环的一次迭代中进行所有函数调用需要2-3秒。由于这个应用程序,比每5秒更频繁地运行循环是没有意义的。这意味着,为了使我退出程序的方式工作,我有时不得不按下'q‘,保持2-8秒。
我的代码如下所示:
import curses
import time
def main(screen):
refresh_rate = 5
screen.nodelay(1)
# Infinite loop. Displays information and updates it
# every (refresh_rate) # of seconds
while True:
# Makes several http requests
# and passes responses through multiple functions
# Escape infinite loop
if screen.getch() == ord('q'):
break
# Wait before going through the loop again
time.sleep(refresh_rate)
if __name__ == "__main__":
curses.wrapper(main)我的另一个解决方案是将with替换为:
loop = 1
while loop:
#Loop code
if screen.getch() == ord('q'):
loop = -1这样,就没有必要按下并持有'q‘退出程序。但在按一次“Q”键后,它仍然需要8秒的时间才能退出。
由于明显的原因,这似乎不是退出程序的最佳方式。我很确定应该有一个更好(更快)的解决方案。
除此之外,这个程序运行得很好。这是两个文件,超过300行,所以我只是张贴的相关部分的代码与我的尝试解决方案。
发布于 2016-10-06 08:58:33
考虑到您已经没有延迟,通常的方法是使用时间较短(20-50毫秒)的凝固汽油,并设定5秒的目标,在多次(10-25)重复getch/凝固汽油循环之后运行这些函数。
混合诅咒和标准I/O并不是很好,除非你在两者之间切换时小心地冲洗东西。
发布于 2016-10-06 02:40:14
可能发生的情况是,您的'q'在getch()和sleep调用之间出现。假设getch()只需执行一小部分秒,并且sleep锁定程序5秒,那么很可能在任何时候按下键都会等待。
退出任何python脚本的最简单方法是按Ctrl-C --它会产生一个KeyBoardInterrupt异常,可以这样处理:
try:
while True:
do_something()
except KeyboardInterrupt:
pass当然,如果这是一个面向用户的应用程序,这可能是不够的.但是,没有完整的事件循环和允许它们退出的UI,任何生产应用程序都不可能运行。
最后,如果您想要另一种方式来完成您已经在做的事情,您可以使用:
import sys
sys.stdin.read(1)一次读取用户输入的1拜。如果我是你,我会选择Ctrl-C路线。
https://stackoverflow.com/questions/39886252
复制相似问题