#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()