У меня есть объект.
Этот объект имеет метод connect()
, который запускает процесс pexpect.
Процесс, который порожден, представляет собой пользовательский последовательный интерфейс. При запуске этот инструмент печатает меню последовательных устройств для подключения, например, так:
libftdi device (0): A6005jpt
libftdi device (1): acFX9DQf
Serial device (a) : /dev/cu.Bluetooth-PDA-Sync
Select a device by its letter (^D to abort):
My connect()
определяет, какое число передать на основе заданного имени устройства (например, 'acFX9DQf'): (self.connection является источником появления pexpect)
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()
обрабатывал процесс несколько раз в моей основной логике, а иногда, один из таких случаев, 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 device (0): A6005jpt
MATCHED A DEVICE LINE!
libftdi device (1): acFX9DQf
MATCHED A DEVICE LINE!
MATCHED THE DESIRED USBSERIAL...
Serial device (a) : /dev/cu.Bluetooth-PDA-Sync
Select a device by its letter (^D to abort): 1
... тогда один из моих connect()
вызовов неожиданно сделает ....
libftdi device (0): A6005jpt
MATCHED A DEVICE LINE!
libftdi device (1): acFX9DQf
Serial device (a) : /dev/cu.Bluetooth-PDA-Sync
Select a device by its letter (^D to abort): MATCHED A DEVICE LINE!
<<EXCEPTION>>
Но, если я исправлю свой код так:
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
Мои проблемы уходят! Я могу запустить его несколько раз, и никаких проблем не возникнет - никаких исключений, ничего.
Так что, черт возьми, здесь происходит? Я даже не уверен, с чего начать.