2009-10-01 5 views

Respuesta

40

La manera más fácil podría ser sobrescribir sys.stdout. Modificando ligeramente un ejemplo de 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() 

y ejecutarlo:

 
$ 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

Esto es simple y brillante. – Cerin

10

Puede configurar sys.stdout = Logger() donde Logger es una clase cuyo método write (inmediatamente, o acumulando hasta que un \n se detecta) llama logging.info (o cualquier otra forma en que desea iniciar la sesión). An example of this in action.

No estoy seguro de lo que quiere decir con un proceso "dado" (¿quién lo dio, qué lo distingue de todos los demás ...?), Pero si quiere decir que sabe qué proceso desea destacar En el momento en que lo instancia, puede ajustar su función target (y solo) - o el método run que está anulando en una subclase Process - en un contenedor que realiza esta "redirección" sys.stdout - y deja otros procesos solo.

¿Tal vez si esclavo las especificaciones un poco puedo ayudar con más detalle ...?

10

Sólo hay dos cosas que me gustaría añadir a la respuesta @ Marcos Rushakoff. Al depurar, lo encontré realmente útil para cambiar el parámetro buffering de mis open() llamadas a 0.

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

De lo contrario, locura, porque cuando tail -f ing el archivo de salida los resultados pueden ser muuuy intermitente. buffering=0 para tail -f ing great.

Y para completar, hazte un favor y redirige sys.stderr también.

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

También, por conveniencia es posible volcar eso en una clase de proceso separado si así lo desea,

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

Cuestiones relacionadas