在python中使用multiprocessing.Process類時,是否有辦法記錄給定進程的stdout輸出?多處理的日誌輸出。進程
49
A
回答
40
最簡單的方法可能是覆蓋sys.stdout
。稍微修改例如,從the multiprocessing manual:
from multiprocessing import Process
import os
import sys
def info(title):
print title
print 'module name:', __name__
print 'parent process:', os.getppid()
print 'process id:', os.getpid()
def f(name):
sys.stdout = open(str(os.getpid()) + ".out", "w")
info('function f')
print 'hello', name
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
q = Process(target=f, args=('fred',))
q.start()
p.join()
q.join()
並運行它:
$ ls m.py $ python m.py $ ls 27493.out 27494.out m.py $ cat 27493.out function f module name: __main__ parent process: 27492 process id: 27493 hello bob $ cat 27494.out function f module name: __main__ parent process: 27492 process id: 27494 hello fred
10
您可以設置sys.stdout = Logger()
其中Logger
是一個類(馬上,或者檢測積累,直到\n
),其write
方法調用logging.info
(或要登錄任何其他方式)。 An example of this in action.
我不知道你所說的「給定」的過程(誰給了它,什麼與所有其它...?區別開來)的意思,但如果你的意思是你知道你要挑出什麼進程那麼你可以將它的target
函數(只有那個)或run
方法覆蓋在Process
子類中 - 包裝成執行此sys.stdout「重定向」的包裝 - 並保留其他流程。
也許如果你指出了一點我可以幫助更詳細... ...?
10
只有兩件事情我想補充到@馬克Rushakoff答案。調試時,我發現它真的有用到我的open()
呼叫buffering
參數更改爲0。
sys.stdout = open(str(os.getpid()) + ".out", "a", buffering=0)
否則,瘋狂,因爲當tail -f
荷蘭國際集團輸出文件的結果可能是verrry間歇性的。 buffering=0
爲tail -f
很好。
爲了完整起見,請自己幫忙併重新定向sys.stderr
。
sys.stderr = open(str(os.getpid()) + "_error.out", "a", buffering=0)
此外,爲了方便起見,可能轉儲到如果你希望一個獨立的進程類,
class MyProc(Process):
def run(self):
# Define the logging in run(), MyProc's entry function when it is .start()-ed
# p = MyProc()
# p.start()
self.initialize_logging()
print 'Now output is captured.'
# Now do stuff...
def initialize_logging(self):
sys.stdout = open(str(os.getpid()) + ".out", "a", buffering=0)
sys.stderr = open(str(os.getpid()) + "_error.out", "a", buffering=0)
print 'stdout initialized'
相關問題
- 1. 日誌進程輸出
- 2. 批處理文件 - 輸出當前cmd輸出到日誌?
- 3. PHP自定義錯誤處理程序日誌輸出
- 4. django日誌處理程序
- 5. Kafka日誌處理流程
- 6. Hadoop處理多個節點的日誌
- 7. 多處理中的Python日誌
- 8. 多處理過程中間輸出
- 9. 如何開始處理輸出到日誌文件?
- 10. Python 3:使用多處理隊列進行日誌記錄
- 11. 試圖理解崩潰日誌輸出
- 12. AWS日誌輸出
- 13. 去日誌記錄到多個輸出
- 14. Boto3日誌處理程序錯誤
- 15. Git日誌輸出日誌文件
- 16. 使用Sensu處理程序進行Elasticsearch時,日誌被覆蓋
- 17. 將自定義函數輸出添加到Python日誌記錄處理程序
- 18. Spring批處理:如何處理多行日誌文件
- 19. Heroku的輸出日誌中
- 20. DBUnit中的日誌輸出
- 21. 處理溢出標準輸出的子進程
- 22. Python多處理進程號
- 23. 使用日誌處理程序時出現500錯誤
- 24. 快速處理apache日誌
- 25. Rails守護進程不輸出任何日誌信息
- 26. Python日誌記錄從多個進程重定向標準輸出
- 27. 將日誌控制檯輸出到日誌文件Java日誌程序
- 28. Python多線程+多處理BrokenPipeError(子進程不退出?)
- 29. 不同進程的日誌
- 30. 處理許多控制檯的輸出
這是精闢簡單。 – Cerin 2014-02-17 03:08:20