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

1

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

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

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

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

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

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

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

import serial
ser = serial.Serial()
ser.port = 2      #actually COM3
ser.baudrate = 9600
ser.open()
ser.write("Hello")
ser.close()
Теги:
serial-port
override
pyserial

2 ответа

3
Лучший ответ

Конечно, продолжайте и переопределите его. Вы можете создать подкласс Serial и указать метод do-nothing __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() самостоятельно.: -)

  • 0
    Я только что попробовал Исправление Обезьяны, и это выдало Ошибка. Подклассы не выдавали ошибку, но устройство все еще получает сигнал DTR, даже с последним удаленным ser.close .
  • 0
    Я только что set_DTR функцию set_DTR , и теперь все работает. Спасибо за помощь!
2

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

MySerial = serial.Serial

def dummy_del(obj):
    pass

MySerial.__del__ = dummy_del

ser = MySerial()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню