Acceder a la salida estándar de un subproceso en python.

¿Cómo puedo acceder a la serie de procesos secundarios antes de enviarlos al proceso principal? Estoy usando multiproceso. Módulo de la plataforma para generar grupos de procesos secundarios.

El proceso principal y los hijos comparten todos los mismos descriptores de entrada estándar y de salida estándar. No tienen control sobre lo que el otro les escribe. Lo único que puedes hacer es reemplazar stdin y stdout en los niños con algo más que el proceso principal pueda controlar. Como ejemplo, puede subclasificar un objeto de archivo ficticio como StringIO y redirigir los datos que los hijos escriben en este objeto al padre a través de una 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 

Esto debería imprimir algo como esto:

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

No olvide llamar a sys.{stdout,stderr}.flush() al final de la task , de lo contrario, no se escribirá nada en la cola.