繁体   English   中英

读取子进程标准输出,同时将其保存在缓冲区中

[英]Read subprocess stdout while maintaining it in the buffer

是否可以读取子进程的stdout但在程序结束时仍保持整个process.communicate()

例如,我有一个 python 脚本,它在Popen子进程中启动 c# 应用程序并检查它实时生成的日志文件以确定 state 它在其中,但某些错误和某些错误不会转储到stdout中导致进程挂起。 我希望能够检测到 output 并且在这些情况下能够终止该进程。

这在执行process.stdout.readline()时很容易,但在程序结束时,我失去了以本机格式转储整个标准输出的能力,因为缓冲区在读取后被刷新。 是否可以保持该缓冲区?

或者至少以本机格式将读取的行保存在变量中?

您可以逐行读取标准输出,对其进行处理并将其保存到列表或缓冲区中,以便以后使用该缓冲区。 在此示例中,处理只是print ,但您可以根据需要进行更改。 我还假设您只想在后台收集 stderr,因此创建了一个单独的线程。

import subprocess as subp
import threading
import io

def _pipe_read_thread(stream, output):
    output.write(stream.read())
    stream.close()

def proc_runner(cmd):
    stdout_lines = []
    stdout_buf = io.BytesIO()
    stderr_buf = io.BytesIO()
    p = subp.Popen(cmd, stdout=subp.PIPE, stderr=subp.PIPE)
    stderr_t = threading.Thread(target=_pipe_read_thread,
        args=(p.stderr, stderr_buf))
    stderr_t.start()
    for line in p.stdout:
        print(line)
        stdout_buf.write(line)
    returncode = p.wait()
    stderr_t.join()
    stdout_buf. seek(0)
    stderr_buf.seek(0)
    return returncode, stdout_buf, stderr_buf

returncode, stdout, stderr = proc_runner(['ls', '-a'])
print('=============================')
print(stdout.read())
print('=============================')
print(stderr.read())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM