簡體   English   中英

在 output 之前打印 pexpect 是帶有 \r\n 而不是實際 CR/LF output 的單行

[英]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-16UTF-32 )兼容。 然而,這也意味着開發人員必須先將數據從bytes轉換為str ,然后才能在應用程序中與此類數據進行交互。

在您的情況下,您可能應該將數據解釋為 UTF-8。 為此,您可以將當前的打印行替換為:

print(ping.before.decode('utf-8', 'ignore'))

為了澄清該命令,我們正在與字節object 交互以調用decode(...)方法,我們首先為 decode 方法提供我們希望數據被解釋為的字符編碼編解碼器,然后提供我們要使用的錯誤處理方法的名稱。 解碼的錯誤處理方法有許多可能的值,但兩種常見的方法是ignorestrict ,其中strict是默認處理程序。

忽略處理程序本質上告訴解碼方法,如果遇到無法解釋/解碼的值,它應該默默地丟棄該值並繼續解碼剩余的值。

另一方面, strict告訴 decode 方法它應該停止所有處理並引發錯誤(特別是UnicodeError )。

您可以在 Python 文檔頁面上閱讀有關編解碼器錯誤處理的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM