[英]printing pexpect before output is a single line with \r\n instead of actual CR/LF output
我會提前道歉,我是 Python3 的新手,堅持理解實際的 output 而不是我期望收到的。
這是我的代碼:
import pexpect
ping = pexpect.spawn('ping -c 5 8.8.8.8')
result = ping.expect([pexpect.EOF, pexpect.TIMEOUT])
print(ping.before)
實際的 output 是以“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
但相反,我的 output 是一條巨大的線路:
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'
有人有什么主意嗎?
這里的問題是您的 output 是字節串的形式——也稱為 Python 中的bytes
類型。 在與源自應用程序外部的數據/內容交互時,經常會遇到這種數據類型。 本質上,Python 在嘗試解釋緩沖區中的數據時並不確定使用什么編碼標准。 Python 不會試圖猜測它,而是讓開發人員決定如何解釋字節字符串中包含的原始數據。 這允許與每個字符使用多於一個字節的字符編碼系統(例如UTF-16和UTF-32 )兼容。 然而,這也意味着開發人員必須先將數據從bytes
轉換為str
,然后才能在應用程序中與此類數據進行交互。
在您的情況下,您可能應該將數據解釋為 UTF-8。 為此,您可以將當前的打印行替換為:
print(ping.before.decode('utf-8', 'ignore'))
為了澄清該命令,我們正在與字節object 交互以調用decode(...)
方法,我們首先為 decode 方法提供我們希望數據被解釋為的字符編碼編解碼器,然后提供我們要使用的錯誤處理方法的名稱。 解碼的錯誤處理方法有許多可能的值,但兩種常見的方法是ignore和strict ,其中strict是默認處理程序。
忽略處理程序本質上告訴解碼方法,如果遇到無法解釋/解碼的值,它應該默默地丟棄該值並繼續解碼剩余的值。
另一方面, strict告訴 decode 方法它應該停止所有處理並引發錯誤(特別是UnicodeError )。
您可以在 Python 文檔頁面上閱讀有關編解碼器錯誤處理的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.