0

私はオブジェクトを持っています。

このオブジェクトにはconnect()、pexpect プロセスを生成するメソッドがあります。

生成されるプロセスは、カスタム シリアル インターフェイスです。このツールを起動すると、次のように、接続するシリアル デバイスのメニューが出力されます。

libftdi デバイス (0): A6005jpt
libftdi デバイス (1): acFX9DQf
シリアルデバイス (a) : /dev/cu.Bluetooth-PDA-Sync
文字でデバイスを選択します (中止するには ^D):

Myconnect()は、指定されたデバイス名に基づいて渡す​​番号を決定します (例: 'acFX9DQf'): (self.connection は pexpect spawn です)

USBSERIAL_DEVICE_NAME = "acFX9DQf"    

try:
    while self.connection.expect(['libftdi device \(([0-9])\): (.*)','Serial device']) == 0:
        if self.connection.match.group(2).strip() == USBSERIAL_DEVICE_NAME:
            # do stuff
except:
    # do stuff

さて、私の問題は、私connect()/kill()プロセスがメインロジックで複数回実行され、そのうちの1つで予期せず例外connect()をスローすることがあるということです。pexpect.TIMEOUT

たとえば、次のデバッグ ステートメントをロジックに追加すると、次のようになります。

USBSERIAL_DEVICE_NAME = "acFX9DQf"

try:
    while self.connection.expect(['libftdi device \(([0-9])\): (.*)','Serial device'], timeout=10) == 0:
        print "MATCHED A DEVICE LINE!"
        if self.connection.match.group(2).strip() == USBSERIAL_DEVICE_NAME:
            print "MATCHED THE DESIRED USBSERIAL..."

...次の多くの呼び出しに対してこの出力を取得しますconnect()

libftdi デバイス (0): A6005jpt
デバイスラインが一致しました!
libftdi デバイス (1): acFX9DQf
デバイスラインが一致しました!
目的の USBSERIAL に一致しました...
シリアルデバイス (a) : /dev/cu.Bluetooth-PDA-Sync
文字でデバイスを選択します (中止するには ^D): 1

...すると、私のconnect()呼び出しの 1 つが予期せず実行されます....

libftdi デバイス (0): A6005jpt
デバイスラインが一致しました!
libftdi デバイス (1): acFX9DQf
シリアルデバイス (a) : /dev/cu.Bluetooth-PDA-Sync
文字でデバイスを選択してください (中止するには ^D): MATCHED A DEVICE LINE!

<<例外>>

しかし、コードを次のように修正すると:

try:
    while self.connection.expect(['libftdi device \(([0-9])\): (.*)','Serial device'], timeout=10) == 0:
        devicename = self.connection.match.group(2).strip()
        if devicename == USBSERIAL_DEVICE_NAME:
            # do stuff

私の問題はなくなります!繰り返し実行できますが、問題は発生しません。例外も何もありません。

一体、ここで何が起こっているのですか?この問題をどこから始めればよいかさえわかりません。

4

1 に答える 1

1

TIMEOUT例外が発生していると思います。「MATCHED A DEVICE LINE!」の場所に基づいています。私の仮説は、spawnインスタンスが一致をテストするときに複数の行があるということです。pexpect が正規表現をコンパイルすると、 が設定re.DOTALLされるため.*、改行と追加の行が含まれます。これにより、テストUSBSERIAL_DEVICE_NAMEが失敗し、ループが次の反復を続行します。expect追加の入力がなく、タイムアウトが発生するため、ブロックへの次の呼び出し。

これを修正するには、独自のコンパイル済み正規表現 (re.DOTALLフラグがない) を渡すか、.*明示的に改行と一致しないように を変更します (例: \S*)。

一致したグループを変数に格納すると問題が解決するように見える理由については、これにより、呼び出しがexpect一度に複数行の入力を受信できなくなる微妙なタイミングの変更が導入されると推測できます。

于 2011-05-26T06:32:36.893 に答える