首页 > 解决方案 > 在解释换行符时记录标准输出

问题描述

我正在使用脚本从我的脚本中调用一个系统程序,并在日志文件中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...

标签: pythonsubprocess

解决方案


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__

推荐阅读