Жизненные характеристики объекта Python

Примечание. Если вы знаете какой-либо (не разработанный) библиотечный код, который делает то, что я хочу, просвещайте программиста на C / C ++, я приму это как ответ.

У меня есть глобальная переменная для экземпляра следующего класса. Его цель состоит в том, чтобы позволить мне установить некоторые точки ручного прерывания для быстрого и грязногоprintf точки отладки стиля в пауке-скрапе (мне особенно нужно нарушать, когда соблюдаются определенные критерии для настройки синтаксического анализатора, есть некоторые крайне редкие аномалии входных данных) - адаптировано изэтот.

ОС OS X 10.8.

import termios, fcntl, sys, os

class DebugWaitKeypress(object):
    def __init__(self):
        self.fd = sys.stdin.fileno()
        self.oldterm = termios.tcgetattr(self.fd)
        self.newattr = termios.tcgetattr(self.fd)
        self.newattr[3] = self.newattr[3] & ~termios.ICANON & ~termios.ECHO
        termios.tcsetattr(self.fd, termios.TCSANOW, self.newattr)

        self.oldflags = fcntl.fcntl(self.fd, fcntl.F_GETFL)
        fcntl.fcntl(self.fd, fcntl.F_SETFL, self.oldflags | os.O_NONBLOCK)

    def wait(self):
        sys.stdin.read(1)

    def __del__(self):
        print "called del"
        termios.tcsetattr(self.fd, termios.TCSAFLUSH, self.oldterm)
        fcntl.fcntl(self.fd, fcntl.F_SETFL, self.oldflags)

Когда я нажимаю Ctrl-C и процесс раскручивается, я получаю следующее исключение:

Exception AttributeError: "'NoneType' object has no attribute 'tcsetattr'" in <bound method DebugWaitKeypress.__del__ of <hon.spiders.custom_debug.DebugWaitKeypress object at 0x108985e50>> ignored

Думаю, я что-то упускаю из-за механики времени жизни объекта? Как исправить ситуацию. AFAIK любые экземпляры классов должны быть уничтожены раньше, чем импортированный код, не так ли? в обратном порядке объявления / определения.

Я просто проигнорировал бы это, если бы терминал не был испорчен после завершения процесса: D

edit:

Комментарий Делиана по поводу ответа Сета привел меня к пониманию, что мне нужно использовать Cmain() like function или любая другая функция / генератор, которая доминирует как корневая функция и инициализирует там контекст. Таким образом, когда процесс идет вниз__exit__ метод менеджера контекста будет вызван. И я не буду перепрограммировать поток терминала на каждомwait() вызов.

Хотя стоимость перепрограммирования потенциально нематериальна, полезно знать, как можно использовать эти важные семантики C / C ++ в python.

edit 2:

Twisted (который использует скрап) - апешит, когда возится со stdin. Поэтому мне пришлось решить проблему с файлом IO.

Ответы на вопрос(2)

Ваш ответ на вопрос