第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

讀取子進(jìn)程標(biāo)準(zhǔn)輸出,同時將其保存在緩沖區(qū)中

讀取子進(jìn)程標(biāo)準(zhǔn)輸出,同時將其保存在緩沖區(qū)中

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

1 回答

?
慕沐林林

TA貢獻(xiàn)2016條經(jīng)驗 獲得超9個贊

您可以逐行讀取標(biāo)準(zhǔn)輸出,對其進(jìn)行處理并將其保存到列表或緩沖區(qū)中,并在以后使用緩沖區(qū)。在此示例中,處理只是print,但您可以根據(jù)需要進(jìn)行更改。我還假設(shè)您只想在后臺收集 stderr,因此創(chuàng)建了一個單獨的線程。


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


查看完整回答
反對 回復(fù) 2022-12-20
  • 1 回答
  • 0 關(guān)注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號