在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. Windows批处理脚本输出日志
- 3. 批处理文件 - 输出当前cmd输出到日志?
- 4. Iptables日志输出清理
- 5. PHP自定义错误处理程序日志输出
- 6. django日志处理程序
- 7. Kafka日志处理流程
- 8. ruby重定向多个进程输出到日志
- 9. 多处理中的Python日志
- 10. Hadoop处理多个节点的日志
- 11. Bash:处理日志文件输出的格式化
- 12. 顺序处理多线程输出
- 13. 多处理过程中间输出
- 14. Python 2.7多处理日志和循环
- 15. 如何开始处理输出到日志文件?
- 16. 输出到日志文件,并筛选批处理文件
- 17. Python 3:使用多处理队列进行日志记录
- 18. 试图理解崩溃日志输出
- 19. AWS日志输出
- 20. Boto3日志处理程序错误
- 21. Python日志记录处理程序
- 22. Git日志输出日志文件
- 23. 去日志记录到多个输出
- 24. 批处理启动进程锁定日志文件
- 25. 使用Sensu处理程序进行Elasticsearch时,日志被覆盖
- 26. 将自定义函数输出添加到Python日志记录处理程序
- 27. 处理守护进程的输入和输出
- 28. Spring批处理:如何处理多行日志文件
- 29. Python多进程处理进程名称
- 30. 处理溢出标准输出的子进程
这是精辟简单。 – Cerin 2014-02-17 03:08:20