Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在阻塞原始输入时如何退出CLI?_Python_Windows_Blocking_Command Line Interface_Raw Input - Fatal编程技术网

Python:在阻塞原始输入时如何退出CLI?

Python:在阻塞原始输入时如何退出CLI?,python,windows,blocking,command-line-interface,raw-input,Python,Windows,Blocking,Command Line Interface,Raw Input,我有一个GUI程序,它也可以通过CLI控制(用于监控)。CLI使用原始输入在while循环中实现。 如果我通过GUI关闭按钮退出程序,它将挂起在原始输入中,直到收到输入后才会退出 如何在不输入输入的情况下立即中止原始输入 我在WinXP上运行它,但我希望它独立于平台,它也应该在Eclipse中工作,因为它是一个开发工具。Python版本是2.6 我搜索了stackoverflow几个小时,我知道这个主题有很多答案,但真的没有平台无关的解决方案来拥有非阻塞CLI阅读器吗 如果没有,克服这个问题的最

我有一个GUI程序,它也可以通过CLI控制(用于监控)。CLI使用原始输入在while循环中实现。 如果我通过GUI关闭按钮退出程序,它将挂起在原始输入中,直到收到输入后才会退出

如何在不输入输入的情况下立即中止原始输入

我在WinXP上运行它,但我希望它独立于平台,它也应该在Eclipse中工作,因为它是一个开发工具。Python版本是2.6

我搜索了stackoverflow几个小时,我知道这个主题有很多答案,但真的没有平台无关的解决方案来拥有非阻塞CLI阅读器吗

如果没有,克服这个问题的最佳方法是什么


谢谢

根据您使用的GUI工具包,找到一种方法将事件侦听器连接到关闭窗口操作并进行调用


作为参考,在Linux上调用是有效的。

这可能不是最好的解决方案,但您可以使用,它有一个函数
thread.interrupt\u 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()

我调用sys.exit(),但问题是exit会等待原始输入结束,这在我按下另一个键之前不会发生。@christian啊,你在Windows上(只需再次阅读问题)。将更新答案。非常感谢,这样就可以了。但是,真的没有平台无关的解决方案来拥有非阻塞CLI阅读器吗?@christian我不是什么Windows开发人员,所以我不能肯定。但是,如果
sys.exit()
对您不起作用,那么就没有其他内置的Python函数。“不按其他键从原始输入中退出”这意味着什么?你能解释一下你的意思吗?文件的结尾是一个键。Control-C是杀死程序的关键。您担心的“附加”密钥是什么?请具体说明。要退出该程序,我可以在CLI中输入'quit'或通过GUI关闭它。如果我通过GUI退出程序,CLI将挂起在原始输入中,直到我在CLI中输入内容。如何在不需要输入输入的情况下立即中止原始输入?@S.洛特:我编辑了这个问题,请告诉我现在是否清楚。“我可以在CLI中输入'quit'或通过GUI关闭它”?这听起来像是一个非常糟糕的设计。您应该摆脱CLI,将正在进行的任何命令响应业务作为GUI的适当部分来实现。您只需要一个简单的可编辑文本小部件。但CLI+非CLI用户界面会导致灾难。为什么要这样做?主要是出于历史原因,程序和GUI已经完成,然后需要CLI,所以我在控制台中实现了它,认为这是最简单的方法。我会考虑的。如果我是对的,在原始输入完成之前不能处理异常。因此,它仍然是一个需要的输入,在此之后,可以处理异常。我已经尝试从另一个线程抛出异常。可能它在windows上不起作用,因为此代码在linux上工作(如果是这样,那么请忘记我所说的)。您是对的,使用“thread.interrupt_main()”它在windows上也工作。谢谢