使用curses模块的无限循环快速退出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)
我的另一个解决方案是将True替换为:
loop = 1
while loop:
#Loop code
if screen.getch() == ord('q'):
loop = -1
这样,无需按住“q”退出程序。但是按“q”一次后退出仍然需要8秒钟。
出于显而易见的原因,这似乎不是退出该计划的最佳方式。我很确定应该有一个更好(更快)的解决方案。
除此之外,该程序工作正常。这是2个超过300行的文件,所以我用我尝试过的解决方案发布了代码的相关部分。
答案 0 :(得分:1)
可能发生的是'q'
来自getch()
和sleep
来电之间的getch()
。鉴于sleep
执行时只需要几分之一秒,而Ctrl-C
会将程序锁定5秒,所以每当你按下一个键时你很可能会等待
退出任何python脚本的最简单方法是按KeyBoardInterrupt
- 它会产生一个try:
while True:
do_something()
except KeyboardInterrupt:
pass
异常,可以处理如下:
import sys
sys.stdin.read(1)
当然,如果这是一个面向用户的应用程序,那可能还不够。但是,如果没有完整的事件循环和允许它们退出的UI,任何生产应用程序都不可能运行。
最后,如果你想要另一种方式来做你已经做过的事情,你可以使用:
Ctrl-C
一次读取用户输入的1个字符。如果我是你,我会选择webpack.config.js
路线。
答案 1 :(得分:1)
鉴于你已经拥有了nodelay,通常的方法是使用一个小的(20-50毫秒)时间的napms,并解决你的5秒目标,在几次(10-25)重复之后运行这些函数。 getch / napms loop。
混合curses和标准I / O并不能很好地工作,除非你在两者之间切换时要注意事项。