簡體   English   中英

在python中訪問子進程的標准輸出

[英]Access standard output of a sub process in python

如何在將子進程發送到主進程之前訪問它們的標准輸出? 我正在使用 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()否則,不會將任何內容寫入隊列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM