开发者

How do I override PySerial's "__del__" method in Python?

I have a simple Python script set up to send Characters to a device on COM3. (This is running on Windows XP) The device receives the Characters fine, but when the script ends, or I call

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

It sets the DTR Line on th开发者_如何学Goe serial port High, Resetting my Device.

Perplexed by this, I poked around in the PySerial Documentation (http://pyserial.sourceforge.net/) and found that the Module has a __del__ method, which calls the ser.close() function when the Serial instance is deleted.

Is there anyway to Override this __del__ method?

(I would prefer to not have to disconnect the Reset Line of my device from the DTR line)

Below is the basic code I am using:

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


Sure, go ahead and override it. You can either create a subclass of Serial and specify a do-nothing __del__() method and use the subclass instead of Serial, or delete that method from the actual Serial class (monkey-patching) using the del statement. The former method is preferred but the second may be necessary if code you don't have any control over is using the serial port. Be sure the __del__() method doesn't do anything else important before overriding it, of course.

Subclassing:

import serial

class mySerial(serial.Serial):
    def __del__(self):
        pass

ser = mySerial()
# rest of script the same

Monkey-patching:

import serial

del serial.Serial.__del__

If you have Python source for this module (i.e. it is not written in C), a third approach would be to create your own copy of it and just edit it not to do that. (You can also do this for C modules, but getting it running is a bit more difficult if you don't have C expertise.)

Of course, changing the __del__() method to not call ser.close() isn't going to help much in the code you give, since you're calling ser.close() yourself. :-)


Have you tried something like this?

MySerial = serial.Serial

def dummy_del(obj):
    pass

MySerial.__del__ = dummy_del

ser = MySerial()
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜