Почему strip () исправляет этот скрипт pexpect? - PullRequest
0 голосов
/ 26 мая 2011

У меня есть объект.

Этот объект имеет метод 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

Мои проблемы уходят! Я могу запустить его несколько раз, и никаких проблем не возникнет - никаких исключений, ничего.

Так что, черт возьми, здесь происходит? Я даже не уверен, с чего начать.

1 Ответ

1 голос
/ 26 мая 2011

Полагаю, вы получаете исключение TIMEOUT.Исходя из того, где "СОГЛАСОВАНО УСТРОЙСТВО ЛИНИЯ!"сообщение выводится, моя гипотеза состоит в том, что экземпляр spawn имеет несколько строк при проверке на совпадение.Когда pexpect компилирует регулярные выражения, он устанавливает re.DOTALL, поэтому .* включает в себя новую строку и дополнительные строки.Это приводит к сбою проверки USBSERIAL_DEVICE_NAME, и цикл продолжает свою следующую итерацию.Следующий вызов expect блоков, потому что нет никакого дополнительного ввода, и вы получаете тайм-аут.

Чтобы исправить это, вы можете передать свои собственные скомпилированные регулярные выражения (в которых отсутствует флаг re.DOTALL) или изменить.*, поэтому он явно не соответствует символу новой строки (например, \S*).

Что касается того, почему сохранение сопоставленной группы в переменной, кажется, исправляет вещи, я могу только догадываться, что это вводит тонкие временные рамкиизменение, запрещающее вызову на номер expect одновременное получение нескольких строк ввода.

...