Charakterystyka życia obiektu Python

Uwaga: jeśli znasz jakikolwiek (nieprecyzyjny) kod biblioteki, który robi to, co chcę, oświeć programistę C / C ++, zaakceptuję to jako odpowiedź.

Mam zmienną globalną ustawioną na instancję następującej klasy. Jego celem jest umożliwienie mi ustawienia ręcznych punktów przerwania, aby umieścić je szybko i brudnoprintf punkty debugowania stylów w pająku do skrobania (szczególnie muszę przerwać, gdy spełnione są pewne kryteria, aby dostroić parser, są bardzo rzadkie anomalie danych wejściowych) - Dostosowane zto.

Os to 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)

Kiedy naciskam Ctrl-C i proces się rozwija, otrzymuję następujący wyjątek:

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

Chyba brakuje mi czegoś o mechanice życia obiektów? Jak zaradzić tej sytuacji. AFAIK wszelkie instancje klas powinny zostać zniszczone, zanim zaimportowany kod nie, nie? w odwrotnej kolejności deklaracji / definicji.

Zignorowałbym to, gdyby terminal nie został zepsuty po zakończeniu procesu: D

edytować:

Komentarz Deliana na temat odpowiedzi setha doprowadził mnie do zrozumienia, że ​​muszę użyć Cmain() jak funkcja, lub jakakolwiek inna funkcja / generator, która dominuje jako funkcja roota i inicjalizuje tam kontekst. W ten sposób, gdy proces spada__exit__ zostanie wywołana metoda menedżera kontekstu. I nie będę musiał przeprogramowywać strumienia terminala na każdymwait() połączenie.

Chociaż koszt przeprogramowania jest potencjalnie nieistotny, dobrze jest wiedzieć, w jaki sposób można by uzyskać te istotne semantyki C / C ++ w Pythonie.

edytuj 2:

Skręcony (którego używa złomowanie) staje się apetytem, ​​gdy miesza się z stdin. Musiałem rozwiązać problem z plikiem IO.

questionAnswers(2)

yourAnswerToTheQuestion