如何在将子进程发送到主进程之前访问子进程的stdout?我正在使用multiprocessing.Pool模块来生成子进程池。访问python中的子进程的标准输出
3
A
回答
8
主进程和子进程共享相同的标准输入和标准输出文件描述符。他们无法控制其他人写给他们的东西。你可以做的唯一的事情是用主流程可以控制的其他东西代替stdin
和stdout
。举个例子,你可以继承一个虚拟文件对象像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()
,否则不会写入队列。
相关问题
- 1. 如何监视python中的子进程与标准输出?
- 2. 写入标准输入和读取标准输出的子进程python 3.4
- 3. 将子进程的标准输出重定向到父进程标准输入
- 4. 防止子进程的子进程写入标准输出
- 5. Python标准输出和子
- 6. 进程通信中的管道标准输入/标准输出。
- 7. 获取派生进程的标准输出/标准错误在子进程
- 8. 写入到标准输入并从标准输出中读取长时间运行的子进程中的python
- 9. Python子进程.Popen无法使用标准输出
- 10. 从Python子进程读取标准输出
- 11. Python子进程标准输出不读取
- 12. Python:从后台子进程获取标准输出
- 13. 如何读取VB6中的子进程的标准输出?
- 14. 同时读取子进程标准输出和标准错误
- 15. 的Linux 3.0:与管道标准输入执行子进程/标准输出
- 16. 在Python中的流标准输出/标准输出
- 17. 将父进程的控制台(标准输出,标准错误等)输出重定向到子进程(反向)
- 18. 获取node.js中所有嵌套子进程的标准输出
- 19. 处理溢出标准输出的子进程
- 20. Python中的进程 - 获取非终止进程的标准输出
- 21. python子流程输出到标准输出
- 22. Python运行守护进程子进程和读取标准输出
- 23. 使用python中的子进程重定向标准输出速度非常慢
- 24. 为外部程序包产生的Python子进程捕获标准输出
- 25. 的Python - 捕捉实时多POPEN子进程的标准输出到文件
- 26. Python脚本 - 如何启动一个子进程并将该进程的标准输出传递到Python脚本的标准输出
- 27. 将文件用作标准输入和标准输出进行子流程
- 28. 重定向进程标准输入和标准输出到netcat
- 29. 入门从tcpdump的标准输出子进程终止它
- 30. 如何异步获取子进程的标准输出数据?
也许这可以帮助你:http://stackoverflow.com/questions/7714868/python-multiprocessing-how-can-i-reliably-redirect-stdout-from-a-child-process – Udy
@Udy问题你引用看起来像一个特定于Windows的stdout重定向问题。此外,他们正试图将stdout重定向到一个文件。另一方面,我想修改子进程的stdout。 – KT100
是真的。但这将帮助:http://stackoverflow.com/questions/4227808/how-can-i-send-python-multiprocessing-process-output-to-a-tkinter-gui – Udy