2011-04-25 23 views
1

我有一個簡單的Python腳本,用於將字符發送到COM3上的設備。 (這是Windows XP上運行) 設備接收人物罰款,但腳本結束時,或者我稱之爲如何在Python中重寫PySerial的「__del__」方法?

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

它設置DTR線串行口上高,重置設備。

通過這個困惑,我在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() 

回答

3

當然,請便並覆蓋它。您可以創建一個Serial的子類並指定一個無所作爲__del__()方法並使用子類而不是Serial,或者使用del語句從實際的Serial類(猴子修補)中刪除該方法。前一種方法是首選,但如果您沒有任何控制權的代碼正在使用串行端口,則可能需要第二種方法。當然,確保__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模塊,但得到它運行的是一個比較困難的,如果你不具備專業知識Ç)

當然,改變__del__()方法不調用ser.close()是不會幫你給的代碼很多,因爲你自己打電話給ser.close()。 :-)

+0

我剛剛嘗試過猴子修補,並且它拋出一個錯誤。 子類化沒有拋出錯誤,但設備仍然在接收DTR信號,即使刪除了最後一個「ser.close」。 – 2011-04-25 20:10:11

+0

我剛剛註釋掉'set_DTR'函數,現在所有工作都正在進行。 謝謝你的幫助! – 2011-04-25 20:26:58

2

你有沒有試過類似的東西?

MySerial = serial.Serial 

def dummy_del(obj): 
    pass 

MySerial.__del__ = dummy_del 

ser = MySerial()