2009-10-01 4 views

Odpowiedz

40

Najprostszym sposobem może być po prostu przesłonięcie sys.stdout. Nieznacznie modyfikując przykład z 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() 

i uruchomienie go:

 
$ 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

To genialnie proste. – Cerin

10

Można ustawić sys.stdout = Logger() gdzie Logger to klasa, której write sposób (bezpośrednio lub gromadząc aż \n zostanie wykryty) wywołuje logging.info (lub jakikolwiek inny sposób chcesz się zalogować). An example of this in action.

Nie jestem pewien, co masz na myśli przez "dany" proces (kto go dał, co odróżnia go od wszystkich innych ...?), Ale jeśli masz na myśli to wiesz, jaki proces chcesz wyróżnić sposób, w jaki go tworzysz, możesz zawinąć jego funkcję target (i tylko taką) - lub run, którą nadpisujesz w podklasie Process - w wrapper, który wykonuje to przekierowanie "sys.stdout" - i pozostawiać same inne procesy.

Może, jeśli przyswoisz sobie trochę specyfikację, mogę pomóc bardziej szczegółowo ...?

10

Są tylko dwie rzeczy, które mogę dodać do @Mark Rushakoff odpowiedź. Podczas debugowania, znalazłem to bardzo przydatne, aby zmienić parametr moich open() połączeń buffering 0.

sys.stdout = open(str(os.getpid()) + ".out", "a", buffering=0) 

inaczej, szaleństwa, bo gdy tail -f ing plik wyjściowy wyniki mogą być verrry przerywany. buffering=0 dla tail -f ing great.

I dla kompletności, zrób sobie przysługę i przekieruj także sys.stderr.

sys.stderr = open(str(os.getpid()) + "_error.out", "a", buffering=0) 

Ponadto, dla wygody można zrzucić że do osobnej klasy proces, jeśli chcesz,

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