【问题标题】:Python Curses: Exiting a program fastPython 诅咒:快速退出程序
【发布时间】:2016-10-06 01:46:51
【问题描述】:

使用 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)

我的另一个解决方案是将 while True 替换为:

loop = 1
while loop:

    #Loop code

if screen.getch() == ord('q'):
    loop = -1

这样,就不需要按住“q”退出程序了。但按“q”一次后仍可能需要长达 8 秒的时间才能退出。

出于显而易见的原因,这似乎不是退出程序的最佳方式。我很确定应该有更好(更快)的解决方案。

除此之外,该程序运行良好。这是 2 个超过 300 行的文件,所以我只发布了代码的相关部分以及我尝试的解决方案。

【问题讨论】:

    标签: python ncurses python-curses


    【解决方案1】:

    鉴于您已经拥有 nodelay,通常的方法是使用短时间(20-50 毫秒)的 napms,并解决您的 5 秒目标,在多次 (10-25) 次重复后运行函数getch/napms 循环。

    除非您在两者之间切换时注意刷新内容,否则混合使用 curses 和标准 I/O 并不能很好地工作。

    【讨论】:

    • 这正是我想要的!必须将循环放在一个单独的函数中才能工作,因为从 getch/napms 循环中断显然不会从主循环中断。所以我用return替换了getch/napms循环中的break。谢谢。
    【解决方案2】:

    可能发生的情况是您的'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 路线。

    【讨论】:

    • 我不想在这个应用程序中使用Ctrl-C。但是感谢您展示如何处理KeyBoardInterrupt。我将它添加到我的代码中以防万一。
    猜你喜欢
    • 2018-05-08
    • 2018-12-21
    • 1970-01-01
    • 2012-04-08
    • 2019-12-14
    • 2014-04-23
    • 2013-11-22
    • 2023-03-26
    • 2017-03-19
    相关资源
    最近更新 更多