gpt4 book ai didi

Python subprocess.call() 为每个 stdout 和 stderr 行添加前缀

转载 作者:行者123 更新时间:2023-11-28 16:45:51 24 4
gpt4 key购买 nike

我正在使用 python 运行一些 shell 脚本、RScript、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 代码有点像这些程序的包装器。

最佳答案

不是向 subprocess.call()stdoutstderr 参数提供文件,而是创建一个 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)

请注意,communicate() 会阻塞,直到子进程退出。您可能希望直接使用子进程的流,以便获得更多实时日志记录,但您必须自己处理并发和缓冲区填充状态。

关于Python subprocess.call() 为每个 stdout 和 stderr 行添加前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13935012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com