如何解决为什么strip修复此pexpect脚本?
| 我有一个对象。 该对象具有一个“ 0”方法,该方法会生成一个pexpect过程。 产生的过程是自定义串行接口。启动时,此工具会打印一个要连接的串行设备菜单,如下所示: libftdi设备(0):A6005jpt libftdi设备(1):acFX9DQf 串行设备(a):/dev/cu.Bluetooth-PDA-Sync 通过字母选择设备(^ D终止): 我的``0''根据给定的设备名称(例如\'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
现在,我的问题是我在主逻辑中多次执行了“ 0” /“ 4”过程,有时,其中之一,“ 0”决定意外地抛出“ 6”异常。
例如,当我在逻辑中添加以下调试语句时,如下所示:
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串行...
串行设备(a):/dev/cu.Bluetooth-PDA-Sync
通过字母选择设备(^ D中止):1
...然后,我的connect()
通话之一将意外地...
libftdi设备(0):A6005jpt
匹配设备线!
libftdi设备(1):acFX9DQf
串行设备(a):/dev/cu.Bluetooth-PDA-Sync
通过字母选择一个设备(^ D中止):匹配设备行!
<<例外>>
但是,如果我将代码修改为:
try:
while self.connection.expect([\'libftdi device \\(([0-9])\\): (.*)\',timeout=10) == 0:
devicename = self.connection.match.group(2).strip()
if devicename == USBSERIAL_DEVICE_NAME:
# do stuff
我的问题消失了!我可以重复运行它,不会出现任何问题-没有例外,没有任何问题。
那么到底发生了什么呢?我什至不知道从哪里开始这个问题。
解决方法
我猜你正在得到一个11英镑的例外。根据输出“ MATCHED A DEVICE LINE!”消息的位置,我的假设是
spawn
实例测试匹配项时有多行。当pexpect编译正则表达式时,它会设置re.DOTALL
,因此.*
包括换行符和其他行。这导致针对ѭ15的测试失败,并且循环继续进行下一个迭代。下一次对expect
的调用将被阻止,因为没有其他输入,您将超时。
要解决此问题,您可以传入自己的已编译正则表达式(缺少re.DOTALL
标志)或更改.*
,使其显式与换行符不匹配(例如\\S*
)。
至于为什么将匹配的组存储在变量中似乎可以解决问题,我只能猜测这引入了微妙的时序变化,从而阻止了对expect
的调用一次接收多行输入。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。