2013-10-17 33 views
3

如何在将子进程发送到主进程之前访问子进程的stdout?我正在使用multiprocessing.Pool模块来生成子进程池。访问python中的子进程的标准输出

+0

也许这可以帮助你:http://stackoverflow.com/questions/7714868/python-multiprocessing-how-can-i-reliably-redirect-stdout-from-a-child-process – Udy

+0

@Udy问题你引用看起来像一个特定于Windows的stdout重定向问题。此外,他们正试图将stdout重定向到一个文件。另一方面,我想修改子进程的stdout。 – KT100

+0

是真的。但这将帮助:http://stackoverflow.com/questions/4227808/how-can-i-send-python-multiprocessing-process-output-to-a-tkinter-gui – Udy

回答

8

主进程和子进程共享相同的标准输入和标准输出文件描述符。他们无法控制其他人写给他们的东西。你可以做的唯一的事情是用主流程可以控制的其他东西代替stdinstdout。举个例子,你可以继承一个虚拟文件对象像StringIO和重定向数据,孩子们通过Queue写入此对象的父:

import sys 
from multiprocessing import Queue, Pool, current_process 
from StringIO import StringIO 

class MyStringIO(StringIO): 
    def __init__(self, queue, *args, **kwargs): 
     StringIO.__init__(self, *args, **kwargs) 
     self.queue = queue 
    def flush(self): 
     self.queue.put((current_process().name, self.getvalue())) 
     self.truncate(0) 

def initializer(queue): 
    sys.stderr = sys.stdout = MyStringIO(queue) 

def task(num): 
    print num 
    sys.stdout.flush() 
    return num ** 2 

q = Queue() 
pool = Pool(3, initializer, [q]) 

for _ in pool.map(task, range(5)): 
    proc, out = q.get() 
    print proc, "got", out 

这应打印像这样:

PoolWorker-1 got 0 
PoolWorker-1 got 3 
PoolWorker-1 got 4 
PoolWorker-2 got 1 
PoolWorker-3 got 2 

不要忘记在task的末尾拨打sys.{stdout,stderr}.flush(),否则不会写入队列。

+0

孩子的输出被重定向到'然后MyStringIO对象通过队列将数据发送到主进程。然后主进程完成它需要的所有处理,并将其输出到'sys.stdout'(这正如我在我更新的答案中解释的那样,由连接到终端的所有进程共享) – kouk

+0

什么代码?我没有看到你的问题。 – kouk

相关问题