печать pexpect перед выводом представляет собой одну строку с \ r \ n вместо фактического вывода CR / LF - PullRequest
0 голосов
/ 12 октября 2019

Я заранее извинюсь, что я новичок в 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'

У кого-нибудь есть идеи?

1 Ответ

2 голосов
/ 12 октября 2019

Проблема здесь в том, что вы выводите данные в виде байтовой строки, также известной как тип bytes в Python. Этот тип данных часто встречается при взаимодействии с данными / контентом, созданным за пределами приложения. По сути, Python не знает окончательно, какой стандарт кодирования использовать при попытке интерпретировать данные в буфере. Вместо того, чтобы пытаться угадать это, Python предоставит разработчику решать, как интерпретировать необработанные данные, содержащиеся в байтовой строке. Это обеспечивает совместимость с системами кодирования символов, которые используют более одного байта на символ (например, UTF-16 и UTF-32 ). Однако это также означает, что разработчики должны преобразовать данные из bytes в str, прежде чем они смогут взаимодействовать с такими данными в своих приложениях.

В вашем случае вам, скорее всего, следует интерпретировать данные как UTF-8. Для этого вы должны заменить текущую строку печати на:

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

Чтобы прояснить эту команду, мы взаимодействуем с объектом bytes , чтобы вызвать метод decode(...), и мысначала предоставляем метод декодирования с кодеком кодировки символов, который мы хотели бы интерпретировать как данные, а во-вторых, с названием подхода к обработке ошибок, который мы хотим использовать. Подход к обработке ошибок для декодирования имеет множество возможных значений, но есть два общих подхода: ignore и строгий , с строгим в качестве обработчика по умолчанию.

Обработчик ignore , по сути, сообщает методу декодирования, что, если он сталкивается со значением, которое он не может интерпретировать / декодировать, он должен молча отбросить это значение и продолжить декодирование оставшихся значений.

С другой стороны, строгий сообщает методу декодирования, что он должен остановить всю обработку и вызвать ошибку (в частности, UnicodeError ).

Вы можете прочитать большео параметрах кодирования / декодирования ошибок на странице документации Python для Обработка ошибок кодека .

...