Python:如何在阻塞的raw_input中退出CLI?

2 投票
2 回答
2768 浏览
提问于 2025-04-16 09:22

我有一个图形用户界面(GUI)程序,应该可以通过命令行界面(CLI)来控制(用于监控)。这个命令行界面是通过一个循环来实现的,使用了raw_input函数。

如果我通过GUI的关闭按钮退出程序,程序会在raw_input那里卡住,直到有输入进来才会退出。

我想知道怎么能在不输入任何内容的情况下,立刻终止raw_input。

我是在WinXP上运行这个程序,但我希望它能够在不同的平台上都能用,也希望它能在Eclipse里运行,因为Eclipse是一个开发工具。我使用的Python版本是2.6。

我在StackOverflow上搜索了好几个小时,知道这个话题有很多答案,但真的没有一个跨平台的解决方案可以让命令行读取不被阻塞吗?

如果没有,那解决这个问题的最佳方法是什么呢?

谢谢!

2 个回答

1

根据你使用的图形界面工具包,找到一种方法来连接一个事件监听器,这个监听器会在关闭窗口时被触发,并且让它调用 win32api.TerminateProcess(-1, 0)

作为参考,在Linux系统上,调用 sys.exit() 就可以实现类似的功能。

2

这可能不是最好的解决办法,但你可以使用线程模块,里面有一个函数叫做thread.interrupt_main()。这样你就可以同时运行两个线程:一个是用来获取用户输入的,另一个则可以发送中断信号。上层线程会引发一个键盘中断的异常。

import thread
import time

def main():
    try:
        m = thread.start_new_thread(killable_input, tuple())
        while 1:
            time.sleep(0.1) 
    except KeyboardInterrupt:
        print "exception" 

def killable_input():
    w = thread.start_new_thread(normal_input, tuple())
    i = thread.start_new_thread(wait_sometime, tuple())


def normal_input():
    s = raw_input("input:")


def wait_sometime():
    time.sleep(4) # or any other condition to kill the thread
    print "too slow, killing imput"
    thread.interrupt_main()

if __name__ == '__main__':
    main()

撰写回答