解释换行符时记录标准输出

问题描述 投票:0回答:1

我正在使用subprocess.Popen从脚本中调用系统程序,并将stdoutstderr捕获到日志文件中。但是,所有返回的信息都位于一行中,且未解释\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...
python subprocess
1个回答
1
投票

Python记录了str(stdout),但是stdout是字节流,因此您获得了以bytes开头的整个b'表示形式,并使用反斜杠转义了换行符。您需要先对其进行解码。在系统上使用默认编码应该有效]

>>> 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 \ nc.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__
© www.soinside.com 2019 - 2024. All rights reserved.