2013-10-17 32 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

相關問題