Python Curses:快速退出程序

时间:2016-10-06 01:46:52

标签: python ncurses python-curses

使用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行的文件,所以我用我尝试过的解决方案发布了代码的相关部分。

2 个答案:

答案 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并不能很好地工作,除非你在两者之间切换时要注意事项。