python - 当匹配旧输出中的字符串时,pexpect python 模块的expect方法会中断

标签 python gdb stdout interactive pexpect

我正在尝试使用 pexpect 远程使用 gdb。这是我当前的代码:

child = pexpect.spawn("ssh <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="463429293206777f746877707e6875687776" rel="noreferrer noopener nofollow">[email protected]</a> \"gdb\"")
child.logfile = sys.stdout
child.expect("password:")
child.sendline("xxxx")
child.expect("(gdb)")
child.sendline("attach 9813")
child.expect("(gdb)")
child.sendline("info registers")
child.expect("(gdb)")
child.sendcontrol('c')

这是我的控制台输出的一部分:

(...)
GNU gdb (GDB) 7.4.1-debian
(...)
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 9813
info registers
test@test-virtual-machine:~$

虽然我期望这样的事情:

(...)
GNU gdb (GDB) 7.4.1-debian
(...)
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 9813
<Attaching...>
(gdb) info registers
<Registers info displayed...>
(gdb) <Ctrl+C is done>
test@test-virtual-machine:~$

因此,问题似乎是在匹配第一个 (gdb) 并发送第一个命令 attach 9813 后,pexpect 并不期望第二个 (gdb) 行发送新命令info registers。它再次看到第一个(gdb),进行匹配,然后发送第二个命令,而无需等待直到第一个命令被执行(直到我们附加到所需的进程)。

如何让它只分析以下输出?不匹配之前的输出两次? 我看到了这样的 ftp 服务器示例:

child = pexpect.spawn('ftp ftp.openbsd.org')
child.expect('(?i)name .*: ')
child.sendline('anonymous')
child.expect('(?i)password')
child.sendline('<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2f5f4a575f4a4c5b6f5c405a5d4c4a49405d484a01414a5b" rel="noreferrer noopener nofollow">[email protected]</a>')
child.expect('ftp> ')
child.sendline('cd /pub/OpenBSD/3.7/packages/i386')
child.expect('ftp> ')
child.sendline('bin')
child.expect('ftp> ')
child.sendline('prompt')

据我了解,这里 pexpect 设法按要求的顺序对 ftp> 使用react并连续发送命令。我的代码似乎很相似。

我也尝试过刷新标准输出,但没有成功。

最佳答案

GDB 似乎有时会在命令输出之前再次显示提示。您正在匹配第一个提示,发送命令,然后在显示结果之前立即匹配“过早”提示。这意味着最后的 Control-C 在显示“信息寄存器”的结果之前发送,但脚本的其余部分似乎可以工作。

解决方案是在发送下一个命令之前匹配任何预期的输出。

关于python - 当匹配旧输出中的字符串时,pexpect python 模块的expect方法会中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24881362/

相关文章:

Python 在 Mac OSX 上找不到 distutils_path

python - 如何将此代码从 matlab 转换为 python?

xcode - .gdbinit 配置文件与 Xcode 调试冲突

linux - 在 nc 连接和括号中的命令中使用来自管道命令的标准输出

r - 如何在R中关闭管道连接之前从管道连接获取输出?

c++ - 将 header 中声明的 QTextStream 设置为标准输出

python - 计算嵌套列表中元素的递归函数的大 O

gdb - 在 GDB 中打印 `errno` 名称而不是值

python - 如何使用 gdb.lookup_type 查找本地类型定义

python - ETL 过程中数据库中的重复记录问题