Python: Как выйти из CLI, когда застрял в блокировке raw_input? - PullRequest
1 голос
/ 04 января 2011

У меня есть программа с графическим интерфейсом, которая также должна управляться через CLI (для мониторинга). CLI реализован в цикле while с использованием raw_input. Если я выйду из программы через кнопку закрытия GUI, она зависнет в raw_input и не выйдет, пока не получит ввод.

Как я могу немедленно прервать raw_input без ввода ввода?

Я запускаю его на WinXP, но я хочу, чтобы он был независимым от платформы, он также должен работать в Eclipse, поскольку это инструмент разработчика. Версия Python 2.6.

Я искал stackoverflow в течение нескольких часов и знаю, что есть много ответов на эту тему, но действительно ли не существует независимого от платформы решения, имеющего неблокирующее устройство чтения CLI?

Если нет, то как лучше всего решить эту проблему?

Спасибо

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Возможно, это не лучшее решение, но вы можете использовать модуль потока , который имеет функцию thread.interrupt_main(). Таким образом, можно запустить два потока: один с вашим методом raw_input и один, который может дать сигнал прерывания. Поток верхнего уровня вызывает исключение KeyboardInterrupt.

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()
1 голос
/ 04 января 2011

В зависимости от того, какой инструментарий GUI вы используете, найдите способ подключить прослушиватель событий к действию закрытия окна и заставить его вызвать win32api.TerminateProcess(-1, 0).

Для справки,в Linux работает sys.exit().

...