2016-11-21 2 views
0

У меня есть проект django, и я хотел бы проверить и проверить все, выполнив ./manage.py shell, который порождает оболочку ipython.IPython: выполнение функции после ctrl + d keypress

В некоторых проектах у меня есть потоки, которые бегут в фоновом режиме и делают вещи. Иногда, когда в сеансе ipython, мне нужно запустить один из этих потоков. Обычно я забываю join() нить до Я нажимаю ctrl+d, чтобы выйти из корпуса, в этот момент ipython блоков.

Я попытался зарегистрировать метод очистки с atexit.register, но это не сработало, потому что оно называется слишком поздно.

import time 
import atexit 
from threading import Thread 


def test(): 
    for x in xrange(30): 
     print "x = %s" % x 
     time.sleep(1) 

th = Thread(target = test) 

def stop(): 
    global th 
    print "ATEXIT: stop" 
    if th.is_alive(): 
     th.join() 

atexit.register(stop) 

Я положил, что в файле test.py

$ ipython 
In [1]: %run "test.py" 

In [2]: ctrl+d pressed                                      
ATEXIT: stop 

Как вы можете видеть функцию, зарегистрированный atexit была выполнена. Однако, если я начну нить:

$ ipython 
In [1]: %run "test.py" 

In [2]: th.start() 
x = 0 
x = 1 
.... 
In [3]: ctrl+d pressed 
x = 2 
x = 3 
..... 
x = 29 
ATEXIT: stop 

Итак, что мне нужно, это способ выполнения stop() после жму ctrl+d. Я нашел этот поток Override ipython exit function - or add hooks in to it, но я не знаю, как установить крючок из интерактивной оболочки, и, кроме того, кажется, что крючок устарел. Как я могу выполнить код после нажатия ctrl+d?

+0

http://stackoverflow.com/questions/18114560/python-catch-ctrl-c-command-prompt-really-want-to-quit-y-n-resume-executi Это, вероятно, отвечает на ваш вопрос. – Douglas

+0

@ Дуглас: Пойду поближе, спасибо. – Pablo

+0

@ Дуглас: не совсем то, что я ищу. Я хочу выполнить некоторый код, когда я нажимаю 'ctrl + d' * внутри * сеанса' ipython', чтобы я мог 'join()' мои потоки. – Pablo

ответ

0

Я нашел (возможно) ответ здесь: How can I capture 'Ctrl-D' in python interactive console?

Я не знаю, если он отличается от IPython, но Ctrl-D должен поднять EOFError. Попробуйте этот код:

try: 
    raw_input() 
except EOFError: 
    pass 

Если это не работает с iPython, скажите, пожалуйста.

+0

Спасибо, я присмотрюсь, когда вернусь с работы. – Pablo

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

  • Нет связанных вопросов^_^