亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

讀取子進程標準輸出,同時將其保存在緩沖區中

讀取子進程標準輸出,同時將其保存在緩沖區中

夢里花落0921 2022-12-20 11:01:09
是否可以讀取子進程stdout但在程序結束時仍然保持整體process.communicate()?例如,我有一個 python 腳本,它在Popen子進程中啟動 ac# app,并實時檢查它生成的日志文件以確定它所處的狀態,但某些錯誤不會轉儲到日志中,而是在其中,stdout并且某些錯誤會導致進程掛起。我希望能夠檢測到該輸出,并且在那些情況下能夠終止該進程。這在做的時候很容易,process.stdout.readline()但在程序結束時,我失去了以其本機格式轉儲整個標準輸出的能力,因為緩沖區在讀取后被刷新。是否可以維護該緩沖區?或者至少將讀取的行以其本機格式保存在變量中?
查看完整描述

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())


查看完整回答
反對 回復 2022-12-20
  • 1 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號