如何在Python中覆盖PySerial的“__del__”方法?

时间:2011-04-25 17:05:16

标签: python serial-port override pyserial

我设置了一个简单的Python脚本,用于将字符发送到COM3上的设备。 (这在Windows XP上运行) 设备接收字符很好,但是当脚本结束时,或者我打电话

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

它将串行端口上的DTR线设置为高,重置我的设备。

对此感到困惑,我在PySerial文档(http://pyserial.sourceforge.net/)中查了一下,发现模块有一个__del__方法,当删除Serial实例时调用ser.close()函数

是否有覆盖此__del__方法?

(我不希望断开设备的重置线与DTR线的连接)

以下是我使用的基本代码:

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

2 个答案:

答案 0 :(得分:3)

当然,继续并覆盖它。您可以创建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 :(得分:2)

你尝试过这样的事吗?

MySerial = serial.Serial

def dummy_del(obj):
    pass

MySerial.__del__ = dummy_del

ser = MySerial()