Python:如何在阻塞的raw_input中退出CLI?
我有一个图形用户界面(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()