У меня есть проект 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
?
http://stackoverflow.com/questions/18114560/python-catch-ctrl-c-command-prompt-really-want-to-quit-y-n-resume-executi Это, вероятно, отвечает на ваш вопрос. – Douglas
@ Дуглас: Пойду поближе, спасибо. – Pablo
@ Дуглас: не совсем то, что я ищу. Я хочу выполнить некоторый код, когда я нажимаю 'ctrl + d' * внутри * сеанса' ipython', чтобы я мог 'join()' мои потоки. – Pablo