/ / PythonでPySerialの“ __del__”メソッドをオーバーライドするにはどうすればいいですか? - python、シリアルポート、上書き、pyserial

PySerialのPythonで "__del__"メソッドをオーバーライドするにはどうすればよいですか? - Python、シリアルポート、オーバーライド、pyserial

COM3上のデバイスに文字を送信するように設定された単純なPythonスクリプトがあります。 (これは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の場合は3

もちろん、先に進んで上書きしてください。どちらかのサブクラスを作成することができます Serial 何もしない __del__() メソッドの代わりにサブクラスを使用します。 Serialまたは実際のメソッドからそのメソッドを削除します。 Serial クラス(モンキーパッチ)を使って del ステートメント。前者の方法が優先されますが、制御できないコードがシリアルポートを使用している場合は、2番目の方法が必要になることがあります。 __del__() methodは、オーバーライドする前に、他に重要なことは何もしません。

サブクラス化

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)で書かれていません、3番目のアプローチはそれのあなた自身のコピーを作成しそれをしないようにそれを編集することです。 (Cモジュールでもこれを行うことができますが、Cの専門知識がない場合は、実行するのが少し難しいです。)

もちろん、 __del__() 呼び出さないメソッド ser.close() 「あなたが呼ぶので、あなたが与えるコードの中で多くの手助けをするつもりはない」 ser.close() あなた自身。 :-)


回答№2については2

このようなことを試しましたか?

MySerial = serial.Serial

def dummy_del(obj):
pass

MySerial.__del__ = dummy_del

ser = MySerial()