[英]How can I capture the output of a child process spawned by a piped process?
我想不斷監視管道進程並在其進入時打印其stdout
和stderr
(我對退出后立即全部獲取全部輸出不感興趣)。 問題在於,管道處理產生了另一個子進程,並且使用原始進程的管道無法訪問該產生的進程的stdout
和stderr
。
也就是說,我想以這種方式運行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.