2009-10-01 121 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