gpt4 book ai didi

python - 在python中访问子进程的标准输出

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:50 27 4
gpt4 key购买 nike

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

最佳答案

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

关于python - 在python中访问子进程的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19420211/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com