Python 在输出前打印pexpect是一行\r\n而不是实际的CR/LF输出

Python 在输出前打印pexpect是一行\r\n而不是实际的CR/LF输出,python,python-3.x,newline,ping,pexpect,Python,Python 3.x,Newline,Ping,Pexpect,我会提前道歉,我是Python3的新手,一直在理解实际输出,而不是我期望得到的 这是我的密码: import pexpect ping = pexpect.spawn('ping -c 5 8.8.8.8') result = ping.expect([pexpect.EOF, pexpect.TIMEOUT]) print(ping.before) 实际输出是以b开头的单行,\r\n而不是实际的换行 我期望: PING 8.8.8.8 (8.8.8.8

我会提前道歉,我是Python3的新手,一直在理解实际输出,而不是我期望得到的

这是我的密码:

    import pexpect
    ping = pexpect.spawn('ping -c 5 8.8.8.8')
    result = ping.expect([pexpect.EOF, pexpect.TIMEOUT])
    print(ping.before)
实际输出是以b开头的单行,\r\n而不是实际的换行

我期望:

    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=78.1 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=76.5 ms
    64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=76.2 ms
    64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=76.8 ms
    64 bytes from 8.8.8.8: icmp_seq=5 ttl=128 time=77.0 ms
但我的输出是一条巨大的线:

    b'PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.\r\n64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=78.1 ms\r\n64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=76.5 ms\r\n64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=76.2 ms\r\n64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=76.8 ms\r\n64 bytes from 8.8.8.8: icmp_seq=5 ttl=128 time=77.0 ms\r\n\r\n--- 8.8.8.8 ping statistics ---\r\n5 packets transmitted, 5 received, 0% packet loss, time 4004ms\r\nrtt min/avg/max/mdev = 76.214/76.951/78.149/0.683 ms\r\n'

有人知道吗

这里的问题是,您的输出是以字节字符串的形式出现的——在Python中也称为字节类型。当与源于应用程序外部的数据/内容交互时,经常会遇到这种数据类型。从本质上讲,Python在试图解释缓冲区中的数据时,并不确切知道要使用什么编码标准。Python不会试图猜测,而是让开发人员决定如何解释字节字符串中包含的原始数据。这允许与每个字符使用一个以上字节的字符编码系统兼容,例如UTF-16和UTF-32。然而,这也意味着开发人员必须先将数据从字节转换为str,然后才能在应用程序中与这些数据交互

在您的情况下,您可能应该将数据解释为UTF-8。要执行此操作,请将当前打印行替换为:

print(ping.before.decode('utf-8', 'ignore'))
为了澄清该命令,我们正在与bytes对象交互以调用decode。。。方法,我们提供解码方法,首先是我们希望数据被解释为的字符编码编解码器,其次是我们希望使用的错误处理方法的名称。解码的错误处理方法有很多可能的值,但有两种常见的方法是忽略和严格,严格是默认的处理程序

ignore处理程序本质上告诉decode方法,如果遇到无法解释/解码的值,它应该默默地丢弃该值并继续解码其余的值

另一方面,strict告诉decode方法它应该停止所有处理并引发一个错误,特别是UnicodeError


您可以在的Python文档页面上阅读更多关于编码/解码错误处理选项的信息。

这里的问题是您的输出是以字节字符串的形式出现的,在Python中也称为字节类型。当与源于应用程序外部的数据/内容交互时,经常会遇到这种数据类型。从本质上讲,Python在试图解释缓冲区中的数据时,并不确切知道要使用什么编码标准。Python不会试图猜测,而是让开发人员决定如何解释字节字符串中包含的原始数据。这允许与每个字符使用一个以上字节的字符编码系统兼容,例如UTF-16和UTF-32。然而,这也意味着开发人员必须先将数据从字节转换为str,然后才能在应用程序中与这些数据交互

在您的情况下,您可能应该将数据解释为UTF-8。要执行此操作,请将当前打印行替换为:

print(ping.before.decode('utf-8', 'ignore'))
为了澄清该命令,我们正在与bytes对象交互以调用decode。。。方法,我们提供解码方法,首先是我们希望数据被解释为的字符编码编解码器,其次是我们希望使用的错误处理方法的名称。解码的错误处理方法有很多可能的值,但有两种常见的方法是忽略和严格,严格是默认的处理程序

ignore处理程序本质上告诉decode方法,如果遇到无法解释/解码的值,它应该默默地丢弃该值并继续解码其余的值

另一方面,strict告诉decode方法它应该停止所有处理并引发一个错误,特别是UnicodeError


您可以在的Python文档页面上阅读更多关于编码/解码错误处理选项的信息。

先生,您是个天才。它工作得很好。该片段直接来自思科网络工程师课程的PRNE编程。但这是一个自定节奏的在线游戏,你不能问任何问题。所以他的工作方式和我上面介绍的一样完美,所以我猜他一定使用了不同的2.x版本?与我上周在Ubuntu上安装的东西相反。再次感谢您。这是斯宾塞协助的结果。正如预期的那样,格式完美。PING 8.8.8.8.8.8 5684字节的数据。从8.8.8.8开始64字节:从8.8.8.8开始64字节:从8.8.8.8开始64字节:从8.8.8开始64字节:从8.8.8.8开始64字节:从8.8.8开始64字节:从8.8.8.8开始64字节:从8.8.8.8开始83.5毫秒:从8.8开始64字节:从8.8开始64字节:从8.2毫秒
ckets传输,5个接收,0%数据包丢失,时间4005ms rtt最小值/平均值/最大值/mdev=77.844/80.092/83.505/1.896毫秒您真是个天才。它工作得很好。该片段直接来自思科网络工程师课程的PRNE编程。但这是一个自定节奏的在线游戏,你不能问任何问题。所以他的工作方式和我上面介绍的一样完美,所以我猜他一定使用了不同的2.x版本?与我上周在Ubuntu上安装的东西相反。再次感谢您。这是斯宾塞协助的结果。正如预期的那样,格式完美。PING 8.8.8.8.8.8 5684字节的数据。从8.8.8.8开始的64字节:从8.8.8.8开始的64字节:从8.8.8.8开始的64字节:从8.8.8开始的64字节:从8.8.8.8开始的64字节:从8.8.8开始的64字节:从8.8.8.8开始的64字节:从8.8.8开始的64字节:从8.8开始的64字节:从8.8开始的79.2字节:从8开始的64字节:从8.8开始的64字节:从8.8开始的64字节:从8.8开始的64字节:从8.8开始的64字节开始的64字节:从8.8开始的64字节开始的64字节:从8.2字节开始的64字节开始的64字节:从8.5字节开始的数据包丢失:从8.8%开始的数据包开始的数据包开始的丢失,时间4005ms rtt min/avg/max/mdev=77.844/80.092/83.505/1.896 ms