1

COM3上のデバイスにキャラクターを送信するように設定された単純なPythonスクリプトがあります。(これはWindows XPで実行されています)デバイスは文字を正常に受信しますが、スクリプトが終了すると、または

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

シリアルポートのDTRラインをHighに設定し、デバイスをリセットします。

これに戸惑い、PySerialのドキュメント(http://pyserial.sourceforge.net/)をざっと見てみると、モジュールには、Serialインスタンスが削除されたときに関数__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()
4

2 に答える 2

3

確かに、先に進んでそれをオーバーライドします。のサブクラスを作成してSerial何もしない__del__()メソッドを指定し、の代わりにサブクラスを使用するか、ステートメントを使用しSerialて実際のクラスからそのメソッドを削除Serial(モンキーパッチ)することができます。del前者の方法が推奨されますが、制御できないコードがシリアルポートを使用している場合は、2番目の方法が必要になることがあります。__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で記述されていない場合)、3番目のアプローチは、独自のコピーを作成し、それを行わないように編集することです。(これはCモジュールに対しても実行できますが、Cの専門知識がない場合は、実行するのが少し難しくなります。)

もちろん、__del__()メソッドを呼び出さないように変更しても、自分自身ser.close()を呼び出しているため、指定したコードではあまり役に立ちませんser.close()。:-)

于 2011-04-25T17:25:46.693 に答える
2

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

MySerial = serial.Serial

def dummy_del(obj):
    pass

MySerial.__del__ = dummy_del

ser = MySerial()
于 2011-04-25T17:27:30.220 に答える