2010-01-29 15 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 

Quello che voglio fare è avviare un eseguibile solo una volta, ma su ogni iterazione voglio reindirizzare l'output del processo su un altro file. Quello che sta accadendo è che i file vengono creati nel percorso diverso, ma l'output viene reindirizzato al file che viene creato per la prima volta.Come reindirizzare lo stdout per un sottoprocesso?

Nota: MyReset() inizializza il processo (eseguibile) ai valori predefiniti dopo la prima iterazione.

La seguente riga modifica lo stdout del processo in un nuovo file?

proc.stdout = proc_log 

risposta

6

Come unwind detto, non è possibile modificare il descrittore di file in cui il processo figlio scrive il suo output.

Quello che puoi fare, è leggere l'output dal processo figlio nel tuo script python e poi riscriverlo in qualunque file tu voglia. Ad esempio:

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

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

obivously, avrete bisogno di capire come il controllo dovrebbe comportarsi nella vostra applicazione, vale a dire si può fare la scrittura dal thread principale, quando dovrebbe il ritorno thread principale da StartProc() in quel caso, o devi scrivere da un altro thread in modo che il thread principale possa tornare immediatamente da StartProc().

4

Non è possibile. Una volta avviato il processo, il suo stdout non può essere modificato dall'esterno. È necessario entrare nello "spazio" del processo con i suoi descrittori di file.

Se si dispone di un modo (in MyReset() credo) per parlare con il processo in esecuzione, forse è possibile progettare un modo per passare un nuovo nome file per (ri) aprire come stdout, in questo modo.

1

ci sono problemi sottili/bug in pitone legate alla subprocess.PIPE: http://bugs.python.org/issue1652

A quanto pare questo è stato risolto in python3 +, ma non in pitone 2.7 e più anziani. Per questo è necessario utilizzare: code.google.com/p/python-subprocess32/

Problemi correlati