Запись stdout при интерпретации новых строк - PullRequest
0 голосов
/ 01 марта 2020

Я вызываю системную программу из моего скрипта, используя subprocess.Popen, и записываю stdout и stderr в файл журнала. Однако вся возвращаемая информация находится в одной строке, символы \n и \t не интерпретируются. Есть ли модуль, чтобы обернуть их в моем файле журнала?

import logging
import subprocess as sp

# build list for cmd
logging.info('Command to run: {}'.format(cmd_list))
cmd = sp.Popen(cmd_list, stdout=sp.PIPE, stderr=sp.STDOUT)
stdout, stderr = cmd.communicate()
logging.info(stdout)
# output is INFO:root:b"Welcome to MAGMA v1.07b (linux/s)\nUsing flags:\n\t--annotate...

1 Ответ

2 голосов
/ 01 марта 2020

Python logged str(stdout), но stdout - это поток байтов, поэтому вы получили полное представление bytes, начинающееся с b', а обратная строка sh экранирована символом новой строки. Вы должны сначала расшифровать его. Использование кодировки по умолчанию в вашей системе должно работать

>>> import logging
>>> logging.basicConfig()
>>> import subprocess as subp
>>> cmd = subp.Popen(["ls"], stdout=subp.PIPE, stderr=subp.STDOUT)
>>> stdout, stderr = cmd.communicate()
>>> logging.warning(stdout)

ПРЕДУПРЕЖДЕНИЕ: root: b'a.py \ nb.py \ n c .py \ ne.py \ nf.py \ ng .py \ nh.py \ ni.py \ nj.py \ nl.py \ n__pycache __ \ n '

>>> logging.warning(stdout.decode())
WARNING:root:a.py
b.py
c.py
e.py
f.py
g.py
h.py
i.py
j.py
l.py
__pycache__
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...