我有个目标。在
此对象有一个生成pexpect进程的connect()
方法。在
生成的进程是一个自定义串行接口。启动时,此工具将打印要连接的串行设备的菜单,如下所示:
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):
Myconnect()
根据给定的设备名(例如“acFX9DQf”)确定要传递的号码:(自我连接是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()
意外地决定抛出一个^{
例如,当我将以下调试语句添加到逻辑中时,如下所示:
^{pr2}$…对于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
我的问题解决了!我可以反复运行它,不会出现任何问题-没有例外,没有什么。在
那么这到底是怎么回事?我甚至不知道从哪里开始这个问题。在
我猜你得到了一个} ,因此{}包括新行和附加行。这将导致针对
TIMEOUT
异常。基于“匹配设备线!”消息在输出中,我的假设是spawn
实例在测试匹配时有多行。当pexpect编译regex时,sets ^{USBSERIAL_DEVICE_NAME
的测试失败,循环将继续其下一次迭代。下一个对expect
的调用将阻塞,因为没有其他输入,并且您将得到一个超时。在要解决这个问题,您可以传入自己编译的regex(这将缺少
re.DOTALL
标志)或更改.*
,使其与换行符显式不匹配(例如\S*
)。在至于为什么将匹配的组存储在变量中似乎可以解决问题,我只能猜测这引入了一个微妙的时间变化,它阻止对
expect
的调用同时接收多行输入。在相关问题 更多 >
编程相关推荐