簡體   English   中英

連續捕獲子流程的輸出

[英]Continuously capture output from subprocess.Popen

我想捕獲一個名為的進程的輸出

cmd = "doit input={input} conf={conf} output_dir={dir} gpu={gpu} --db-file .doit_gpu{gpu_id}.db".format(**kwargs)
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)

不斷地。 此過程調用將其結果作為字典字符串打印在控制台中的函數。 例如:

{'subprocess_1': [<some data>]}
# then after some time
{'subprocess_2': [<some data>]}
# and some seconds later
{'subprocess_3': [<some data>]}

我希望能夠連續捕獲輸出並將其立即重定向到我之前初始化的另一個詞典。

process_table = {}

因此,這是整個過程完成后字典的外觀:

process_table = {
    {'subprocess_1': [<some data>]},
    {'subprocess_2': [<some data>]},
    {'subprocess_3': [<some data>]}
}

這里的關鍵點(這就是為什么我似乎沒有找到任何相關問題的原因)是,應該在子流程完成之后立即更新process_table ,而不僅是在整個流程完成之后。 這就是為什么這個答案在這里 是不夠的

for line in process.stdout:
    print("this is the output:", line,)

我已經找到解決問題的方法。 一個簡單的

sys.stdout.flush()

在執行的程序(即我的doit腳本)中,立即打印出子流程輸出,我可以將它們保存到process_table

for line in process.stdout:
    subprocess_output = json.loads(line.decode("utf-8"))
    process_table.update(subprocess_output)

暫無
暫無

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

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