2009-10-01 114 views

回答

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 

+0

这是精辟简单。 – Cerin 2014-02-17 03:08:20

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=0tail -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' 

Heres a corresponding gist