我设置了一个简单的 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()
最佳答案
当然,继续并覆盖它。您可以创建 Serial
的子类并指定一个什么都不做的 __del__()
方法并使用子类而不是 Serial
,或者删除它使用 del
语句从实际的 Serial
类(monkey-patching)中获取方法。前一种方法是首选,但如果您无法控制的代码正在使用串行端口,则第二种方法可能是必需的。当然,要确保 __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()
。 :-)
关于python - 如何在 Python 中覆盖 PySerial 的 "__del__"方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5780830/