私はオブジェクトを持っています。
このオブジェクトには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
私の問題はなくなります!繰り返し実行できますが、問題は発生しません。例外も何もありません。
一体、ここで何が起こっているのですか?この問題をどこから始めればよいかさえわかりません。