1 回答
TA贡献2016条经验 获得超9个赞
您可以逐行读取标准输出,对其进行处理并将其保存到列表或缓冲区中,并在以后使用缓冲区。在此示例中,处理只是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())
添加回答
举报