Жизненные характеристики объекта 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.