我有一个 Python 脚本,可以在 Unix 机器上运行一些子进程命令。这些命令相对任意。一个例子是
docker build .
最终看起来像
subprocess.Popen(['docker', 'build', '.'])
我想在任意命令的每一行输出前面添加一个时间戳。从一些搜索中我能找到的最好答案是通过管道传递到这个:
| while IFS= read -r line; do printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$line"; done
但是这似乎不适用于子流程。有更好的办法吗?
您可以使用
pexpect
为每行输出添加时间戳(或执行任何日志记录可以执行的操作):
#! /usr/bin/env python
import logging
import pexpect
logging.basicConfig(filename='ts.log', encoding='utf-8', format='%(asctime)s %(levelname)-8s %(message)s', level=logging.DEBUG)
def run(cmd):
logging.info(cmd)
p = pexpect.spawn(cmd, encoding="utf-8")
while l := p.readline():
logging.info(l.strip())
run("ls -l")