【问题标题】:Access standard output of a sub process in python在python中访问子进程的标准输出
【发布时间】:2013-10-17 07:00:01
【问题描述】:

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

【问题讨论】:

标签: python multiprocessing


【解决方案1】:

主进程和子进程都共享相同的标准输入和标准输出文件描述符。他们无法控制其他人写给他们的内容。您唯一能做的就是将子进程中的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(),否则不会将任何内容写入队列。

【讨论】:

  • 孩子的输出被重定向到MyStringIO对象,然后通过队列将数据发送到主进程。然后主进程执行它需要的所有处理并将其输出到sys.stdout(正如我在更新的答案中所解释的,它由连接到终端的所有进程共享)
猜你喜欢
  • 2014-12-12
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2016-12-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多