繁体   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