【问题标题】:pexpect not passing entire byte string期望不传递整个字节字符串
【发布时间】:2015-07-05 01:06:54
【问题描述】:

我用 C 语言编写了一个简单的程序,它在缓冲区中接收一个字符串,然后以十六进制打印出缓冲区,如果在字符串中找到“\x04”,则 aborts():

#include <stdio.h>
#include <signal.h>

int main(void) {
    unsigned char buf[16] = {0};
    int i;

    printf("Name: ");
    fgets(buf, sizeof(buf), stdin);

    for(i = 0; i < sizeof(buf); i++)
    {
        printf("0x%02x ", buf[i]);
        if(buf[i] == 0x04)
            kill(getpid(), SIGABRT);
    }
    printf("\n");
}

如果我通过管道传递程序的输出,则此方法有效,例如 perl -e '打印 "\x08\x08\x04\x08"' | ./fget-test

但是我使用 pexpect 得到了错误的输出: 0x54 0xd0 0x08 0x0a 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

似乎 0x04 似乎永远无法通过?

这是我用于 pexpect 的 python 代码:

#!/usr/bin/python2.7
import pexpect
import sys
import os
import io

print "\x54\xd0\x04\x08\x0a\x0a"

c = pexpect.spawn('./fget-test')
c.setecho(False)
c.maxsize = 1

c.expect('Name:')
os.write(1, (b"\x54\xd0\x04\x08\x0a"))
os.write(c.fileno(), (b"\x54\xd0\x04\x08\x0a"))

print c.readline()

为什么在使用 pexpect 时 \0x04 永远不会成功?我意识到我可以使用 subprocess.Popen 但在这种情况下我不能,因为它是一个大型程序的小测试用例,可以帮助诊断实际发生的情况。当将 pexpect python 程序传送到 xxd 时,我可以清楚地看到“0x04”通过。

【问题讨论】:

  • 你应该使用c.sendline()而不是os.write(c.fileno())
  • 在这种情况下,c.write(c.fileno(), ..) 用于测试行为是否特定于 c.sendline() 或者是否无关紧要。 os.write() 被留下,因为我使用哪个并不重要,行为是一样的。
  • 是的。它不会改变结果(这就是为什么我将其发布为评论而不是答案)。您应该使用pexpect 提供的.sendline() API,该API 与其他pexpect 部件一起使用。

标签: python-2.7 pexpect


【解决方案1】:

似乎已经解决了这个问题。解决方案是导入 tty,然后在文件描述符上调用 tty.setraw。

【讨论】:

  • b'\x08' == b'\b'(退格字符)。解释可能是pexpect 分配了一个终端(伪tty),您不能通过终端传递任意二进制数据; some characters are special
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
相关资源
最近更新 更多