我将很抱歉我是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中也称为bytes
类型。与源自应用程序外部的数据/内容进行交互时,经常会遇到此数据类型。本质上,在尝试解释缓冲区中的数据时,Python并不确定地确定要使用哪种编码标准。 Python不会尝试猜测,而是将其留给开发人员来决定如何解释字节字符串中包含的原始数据。这允许与每个字符使用多个字节的字符编码系统兼容(例如UTF-16和UTF-32)。但是,这也意味着开发人员必须先将数据从bytes
转换为str
,然后才能在应用程序中与此类数据进行交互。
在您的情况下,您应该将数据解释为UTF-8。为此,您可以将当前的打印行替换为:
print(ping.before.decode('utf-8', 'ignore'))
为了澄清该命令,我们正在与bytes对象进行交互以调用decode(...)
方法,并且我们首先为解码方法提供了字符编码编解码器,我们希望将数据解释为:第二个是我们要使用的错误处理方法的名称。解码的错误处理方法有很多可能的值,但是两种常见的方法是ignore和strict,其中strict是默认处理程序。
ignore处理程序实际上告诉解码方法,如果遇到无法解释/解码的值,则应静默丢弃该值并继续解码其余值。
另一方面,strict告诉解码方法应停止所有处理并引发错误(特别是UnicodeError)。
您可以在Codec Error Handling的Python文档页面上阅读有关编码/解码错误处理选项的更多信息。