簡體   English   中英

如何捕獲通過管道流程生成的子流程的輸出?

[英]How can I capture the output of a child process spawned by a piped process?

我想不斷監視管道進程並在其進入​​時打印其stdoutstderr (我對退出后立即全部獲取全部輸出不感興趣)。 問題在於,管道處理產生了另一個子進程,並且使用原始進程的管道無法訪問該產生的進程的stdoutstderr

也就是說,我想以這種方式運行python程序,因此管道進程是python解釋器,但是python解釋器會在另一個子進程中生成python程序的運行,因此我無法獲得該輸出(實際程序輸出)。 如果啟動程序時出錯,我可以得到它,因為它被打印到原始python解釋器的stderr 但是實際程序中的正常stdout對我來說卻丟失了。

我正在使用subprocess.Popen

編輯:一個評論者問了代碼示例,我不認為這會增加很多,但這里是我的代碼( PopenProcess是一種智能包裝類subrpocess.Popen但確實也沒什么特別的):

class BTask:
    def __init__(self, name, cmds, color = "NONE"):
        self.name = name
        self.cmds = cmds
        self.color = color
        self.proc = None

    def procreadline(self, sline):
        print(ANSI[self.color] + self.name + ANSI["ENDC"] + " > " + ANSI[self.color] + sline)

    def procreaderror(self, sline):
        print(ANSI[self.color] + self.name + ANSI["BRIGHTWHITE"] + " ! " + ANSI["BRIGHTRED"] + sline)

    def run(self):        
        print(ANSI["GREEN"])
        print("running task: {} {}".format(ANSI["BRIGHTGREEN"], self.name))
        pargs = []
        if len(self.cmds) > 1:
            pargs = self.cmds[1:]        
        print(ANSI[self.color])
        self.proc = PopenProcess(
            self.cmds[0],
            self.procreadline,
            read_error_callback = self.procreaderror,
            proc_args = pargs,
            ignore_cwd = True
            )

    def kill(self):
        print(ANSI["RED"])
        print("killing task: {} {}".format(ANSI["BRIGHTRED"], self.name))
        self.proc.kill()

    def is_alive():
        return self.proc.is_alive()

作為管道處理而不是

subprocess.Popen(['python', 'myprog.py'])

一個應該使用

subprocess.Popen(['python', '-u', 'myprog.py'])

然后就可以了。

問題出在緩沖輸出上,而-u開關將其關閉(允許無緩沖輸出)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM