Как переопределить метод PySerial "__del__" в Python? - PullRequest
1 голос
/ 25 апреля 2011

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

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

Он устанавливает линию DTR на последовательном порту Высокий, Сбрасывая мое Устройство.

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 25 апреля 2011

Конечно, идти вперед и переопределить его.Вы можете либо создать подкласс Serial и указать метод бездействия __del__() и использовать этот подкласс вместо Serial, либо удалить этот метод из фактического класса Serial (monkey-patching), используя 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().: -)

2 голосов
/ 25 апреля 2011

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

MySerial = serial.Serial

def dummy_del(obj):
    pass

MySerial.__del__ = dummy_del

ser = MySerial()
...