2017-08-29 43 views
0

输出我想捕捉这个过程被称为的输出与连续拍摄从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应该在子流程完成后立即更新,不仅在整个流程完成后。这就是为什么这个答案here不够

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

所以要清楚,你希望你的python脚本在等待每个子进程完成时阻塞,然后收集进程的stdout? – lancew

+0

是的。但是当它打印到'stdout'时,我想捕获输出并将其重定向到变量'process_table'。我使用两个线程,一个运行'process'和一个读'process_table',并用它做一些事情。 – Victor

回答

0

我已经找到了解决我的问题。 简单

sys.stdout.flush() 

在执行程序(即我DOIT脚本)立即打印子进程的输出,我可以将它们保存到process_table

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