我正在使用python运行一些shell脚本,RScripts,python程序等。这些程序可能会运行很长时间,并可能会输出很多(日志记录)信息到stdout和stderr。我使用以下(Python 2.6)代码工作正常:
stdoutFile=open('stdout.txt', 'a')
stderrFile=open('stderr.txt', 'a')
subprocess.call(SHELL_COMMAND, shell=True, stdout=stdoutFile, stderr=stderrFile)
stdoutFile.close()
stderrFile.close()
这主要是记录到文件的信息,这些信息可以在很长一段时间内生成。因此我想知道是否可以在每行前加上日期和时间?
例如,如果我当前会记录:
Started
Part A done
Part B done
Finished
然后我希望它是:
[2012-12-18 10:44:23] Started
[2012-12-18 12:26:23] Part A done
[2012-12-18 14:01:56] Part B done
[2012-12-18 22:59:01] Finished
注意:修改我运行的程序不是和选项,因为这个python代码有点像这些程序的包装。
答案 0 :(得分:3)
不是将文件提供给stdout
的{{1}}和stderr
参数,而是直接创建subprocess.call()
对象并创建Popen
,然后读取这些管道在此管理器脚本中,并在写入所需的任何日志文件之前添加所需的任何标记。
PIPE
请注意,def flush_streams_to_logs(proc, stdout_log, stderr_log):
pipe_data = proc.communicate()
for data, log in zip(pipe_data, (stdout_log, stderr_log)):
# Add whatever extra text you want on each logged message here
log.write(str(data) + '\n')
with open('stdout.txt', 'a') as stdout_log, open('stderr.txt', 'a') as stderr_log:
proc = subprocess.Popen(SHELL_COMMAND, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while proc.returncode is None:
flush_streams_to_logs(proc, stdout_log, stderr_log)
flush_streams_to_logs(proc, stdout_log, stderr_log)
会阻塞,直到子进程退出。您可能希望直接使用子进程的流,以便获得更多的实时日志记录,但是您必须自己处理并发和缓冲区填充状态。