Как мне переопределить метод PySerial «__del__» в Python?

#python #serial-port #overriding #pyserial

#python #последовательный порт #переопределение #pyserial

Вопрос:

У меня есть простой скрипт на Python, настроенный для отправки символов на устройство на COM3. (Это работает в Windows XP) Устройство нормально принимает символы, но когда скрипт завершается, или я вызываю

 ser.close()      #ser is an instance of the `serial` method `Serial`
  

Он устанавливает значение строки DTR на последовательном порту High, перезагружая мое устройство.

Озадаченный этим, я покопался в документации PySerial (http://pyserial.sourceforge.net /) и обнаружил, что в модуле есть __del__ метод, который вызывает ser.close() функцию при удалении последовательного экземпляра.

Есть ли способ переопределить этот __del__ метод?

(Я бы предпочел не отключать строку сброса моего устройства от строки DTR)

Ниже приведен базовый код, который я использую:

 import serial
ser = serial.Serial()
ser.port = 2      #actually COM3
ser.baudrate = 9600
ser.open()
ser.write("Hello")
ser.close()
  

Ответ №1:

Конечно, продолжайте и переопределите его. Вы можете либо создать подкласс Serial и указать ничего не делающий __del__() метод и использовать подкласс вместо Serial , либо удалить этот метод из фактического Serial класса (обезьянье исправление) с помощью del инструкции. Первый метод предпочтительнее, но второй может быть необходим, если код, над которым вы не имеете никакого контроля, использует последовательный порт. Убедитесь, что __del__() метод не выполняет ничего другого важного, прежде чем переопределять его, конечно.

Создание подклассов:

 import serial

class mySerial(serial.Serial):
    def __del__(self):
        pass

ser = mySerial()
# rest of script the same
  

Обезьянье исправление:

 import serial

del serial.Serial.__del__
  

Если у вас есть исходный код Python для этого модуля (т. Е. он написан не на C), третьим подходом было бы создать его собственную копию и просто отредактировать, чтобы этого не делать. (Вы также можете сделать это для модулей C, но запустить его немного сложнее, если у вас нет опыта работы с C.)

Конечно, изменение __del__() метода на «не вызывать ser.close() » не сильно поможет в коде, который вы предоставляете, поскольку вы вызываете ser.close() сами. 🙂

Комментарии:

1. Я только что попробовал исправление Monkey, и оно выдало ошибку. При создании подкласса ошибка не возникла, но устройство по-прежнему получает сигнал DTR, даже с удалением последнего ser.close .

2. Я только что прокомментировал set_DTR функцию, и теперь все работает. Спасибо за вашу помощь!

Ответ №2:

Вы пробовали что-то подобное?

 MySerial = serial.Serial

def dummy_del(obj):
    pass

MySerial.__del__ = dummy_del

ser = MySerial()