在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