0

我有一个对象。

这个对象有一个connect()方法可以产生一个 pexpect 进程。

产生的进程是一个自定义串行接口。启动时,此工具会打印要连接的串行设备菜单,如下所示:

libftdi 设备 (0): A6005jpt
libftdi 设备 (1):acFX9DQf
串口设备(一):/dev/cu.Bluetooth-PDA-Sync
按字母选择设备(^D 中止):

connect()根据给定的设备名称(例如“acFX9DQf”)确定要传递的数字:(self.connection 是预期生成的)

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 设备 (0): A6005jpt
匹配设备线!
libftdi 设备 (1):acFX9DQf
匹配设备线!
匹配所需的 USB 串行...
串口设备(一):/dev/cu.Bluetooth-PDA-Sync
按字母选择设备(^D 中止):1

......那么,我的一个connect()电话会出乎意料地做......

libftdi 设备 (0): A6005jpt
匹配设备线!
libftdi 设备 (1):acFX9DQf
串口设备(一):/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例外。基于“匹配设备线!”的位置 消息在输出中,我的假设是spawn实例在测试匹配时有多行。当 pexpect 编译正则表达式时,它设置re.DOTALL,因此.*包括换行符和附加行。这会导致测试USBSERIAL_DEVICE_NAME失败,循环继续下一次迭代。下一次调用expect块,因为没有额外的输入并且你得到一个超时。

要解决此问题,您可以传入您自己编译的正则表达式(它将缺少re.DOTALL标志)或更改.*它,使其明确与换行符不匹配(例如\S*)。

至于为什么将匹配组存储在变量中似乎可以解决问题,我只能猜测这会引入一个微妙的时间变化,阻止调用expect一次接收多行输入。

于 2011-05-26T06:32:36.893 回答