2013-12-25 6 views
3

ссылаюсь к этому так question, мне нужно, чтобы запустить консольное приложение Cmd, который будет использовать витую структуру Python для сетевых запросов, на следующем примере:Использование модуля Cmd внутри Python витой нити

from cmd import Cmd 
from twisted.internet import reactor 

class CommandProcessor(Cmd): 
    def do_quit(self, line): 
     print 'bye bye !' 
     return True 

    def do_hello(self, line): 
     print 'world' 

if __name__ == "__main__": 
    reactor.callInThread(CommandProcessor().cmdloop) 
    reactor.run() 

Все мелко но при выполнении команды quit консоль висит до тех пор, пока я не нажму Ctrl + c, и то же самое, если я нажму Ctrl + c перед выполнением , закройте, консоль также зависает до тех пор, пока я не исполнил команду , оставив команду.

Кажется, что реактор все еще работает, когда я выхожу из командного процессора . Cmdloop, если это проблема, мне нужен способ остановить реактор всякий раз, когда заканчивается нить.

ответ

2

Позвоните по номеру reactor.stop, чтобы закрыть витую петлю событий. CommandProcess.do_quit выполняется в отдельной ветке; reactor.stop должна быть вызвана с помощью reactor.callFromThread


Добавить reactor.callFromThread(reactor.stop) в do_quit методом.

def do_quit(self, line): 
    print 'bye bye !' 
    reactor.stop() # <------ 
    return True 
+0

Даже с * reactor.stop() * проблема по-прежнему, набрав quit, вы не получите консоль, она будет зависать, пока я не нажму Ctrl + c. –

+0

@FouratZOUARI, Это сработало для меня. (по крайней мере, в окне 7, python 2.7.6 64 бит) – falsetru

+0

(скрученный 13.1.0) – falsetru

Смежные вопросы