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

Ich möchte eine ausführbare Datei nur einmal starten, aber bei jeder Iteration möchte ich die Prozessausgabe in eine andere Datei umleiten. Was passiert, ist, dass Dateien in dem anderen Pfad erstellt werden, aber die Ausgabe wird zu der Datei umgeleitet, die zum ersten Mal erstellt wird.Wie umleiten Stdout für einen Subprozess?

Hinweis: MyReset() initialisiert den Prozess (ausführbare Datei) auf die Standardwerte nach der ersten Iteration.

Wird die folgende Zeile den Prozess stdout in neue Datei ändern?

proc.stdout = proc_log 

Antwort

6

Wie gesagt, Sie können den Dateideskriptor nicht ändern, in den der untergeordnete Prozess seine Ausgabe schreibt.

Sie können die Ausgabe des untergeordneten Prozesses in Ihrem Python-Skript lesen und dann in die gewünschte Datei zurückschreiben. ZB:

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

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

Obivously, müssen Sie, um herauszufinden, wie die Steuerung in Ihrer Anwendung verhalten soll, also können Sie die Schrift aus dem Haupt-Thread zu tun, wenn sollte die Haupt-Thread Rückkehr aus StartProc() in diesem Fall oder Müssen Sie das Schreiben von einem anderen Thread tun, damit der Haupt-Thread sofort von StartProc() zurückkehren kann.

4

Sie können nicht. Sobald der Prozess gestartet ist, ist seine Stdout nichts, was Sie von außen ändern können. Sie müssen in diesen Prozess 'Raum, um mit seinen Dateideskriptoren zu mist zu bekommen.

Wenn Sie einen Weg haben (in MyReset() ich denke), mit dem laufenden Prozess zu sprechen, vielleicht können Sie einen Weg, um einen neuen Dateinamen übergeben, damit es als sein stdout öffnen, auf diese Weise.

1

Es gibt subtile Probleme/Bugs in Python zu subprocess.PIPE bezogen werden: http://bugs.python.org/issue1652

Anscheinend wurde in python3 + festgelegt, aber nicht in Python 2.7 und älter. Dazu müssen Sie Folgendes verwenden: code.google.com/p/python-subprocess32/