2010-01-29 20 views
6
def StartProc(dir, parm): 
    global proc  

    proc_log = open(dir + os.sep + "MyLog.txt","w") #new path for each file 

    if parm: 
     proc = subprocess.Popen(path, 0, None, subprocess.PIPE, proc_log, None) 
    else: 
     MyReset(proc)      #reset the process(proc) to its default values 
     proc.stdout = proc_log   #no effect 
     print "fptr ", proc.stdout 
    #endif 
#enddef 

prm = True 

for i in range(0, 5): 
    StartProc(i, prm) 
    prm = False 
#endfor 

Lo que quiero hacer es iniciar un ejecutable solo una vez, pero en cada iteración quiero redirigir la salida del proceso a un archivo diferente. Lo que está sucediendo es que los archivos se crean en la ruta diferente, pero la salida se redirige al archivo que se creó por primera vez.¿Cómo redirigir stdout para un subproceso?

Nota: MyReset() inicializa el proceso (ejecutable) a sus valores predeterminados después de la primera iteración.

¿La siguiente línea cambiará el proceso estándar al nuevo?

proc.stdout = proc_log 

Respuesta

6

Como dijo unwind, no puede cambiar el descriptor de archivo al que el proceso secundario está escribiendo su salida.

Lo que puede hacer es leer el resultado del proceso secundario en su secuencia de comandos python y luego escribirlo en el archivo que desee. Por ejemplo:

proc = subprocess.Popen(path, 0, None, subprocess.PIPE, subprocess.PIPE, None) 

for l in proc.stdout.readlines(): 
    output_file.write(l) 

obivously, tendrá que averiguar cómo debe comportarse de control en su aplicación, es decir, se puede hacer la escritura desde el hilo principal, cuando se debe el retorno principal hilo desde StartProc() en ese caso, o ¿tiene que hacer la escritura de otro hilo para que el hilo principal puede volver desde StartProc() inmediatamente.

4

No puede. Una vez que se inicia el proceso, su estándar no es nada que pueda cambiar desde el exterior. Necesita ingresar al espacio de ese proceso para analizar sus descriptores de archivos.

Si tiene una forma (en MyReset() creo) de hablar sobre el proceso en ejecución, quizás pueda diseñar una forma de pasar un nuevo nombre de archivo para que (re) abra como su stdout, de esa manera.

1

hay problemas sutiles/errores en Python relacionadas con subprocess.PIPE: http://bugs.python.org/issue1652

Al parecer, este fue fijado en python3 +, pero no en Python 2.7 y mayores. Para eso necesita usar: code.google.com/p/python-subprocess32/

Cuestiones relacionadas