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.