如何在將子進程發送到主進程之前訪問子進程的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