Почему разрывы строк Python 3 \ n не работают с выводом print и подпроцесса Popen? - PullRequest
0 голосов
/ 07 ноября 2018

Python 3.7.1: вызов grep с подпроцессом. Открывается для извлечения ошибок из файла журнала. При печати на экране разрывы строк \ n не обрабатываются.

Пример

a = subprocess.Popen(["grep", "ERR", "errors.log"], stdout=subprocess.PIPE)
print(a.stdout.read())

выход

ERR 1 ret: 31113\nERR 2 ret: 35523\nERR 3 ret: 3810 (etc.)

Не могу представить, почему разрывы строк не обрабатываются. Я ожидал бы это:

ERR 1 ret: 31113
ERR 2 ret: 35523
ERR 3 ret: 3810
(etc.)

Расчесывал сеть для ответов, но не повезло. Спасибо: ^)

Ссылки:

Как бы я указать новую строку в Python?
Python Popen grep

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Popen стандартный вывод и ошибки байтов по умолчанию. Печать байтов не пытается печатать переводы строки как таковые, но вместо этого печатает их представление.

До версии 3.5 вы не можете использовать encoding, но вы, безусловно, можете декодировать вывод в строку, используя bytes.decode:

a = subprocess.Popen(["grep", "ERR", "errors.log"], stdout=subprocess.PIPE)
print(a.stdout.read().decode())

(decode может потребоваться аргумент в зависимости от содержимого файла)

0 голосов
/ 07 ноября 2018

Укажите кодировку для декодирования вывода подпроцесса. Я не могу сказать вам, с чем закодирован ваш errors.log файл, но попробуйте "utf-8":

a = Popen(["grep", "ERR", "errors.log"], stdout=subprocess.PIPE, encoding='utf-8')
...