Hier ist mein Problem:Python: subprocess STDOUT Erhalten Sie während der Speicher Anmeldung
- ich einen Code zu schreiben, ich versuche, die durch einen Teilprozess Job genommen Speicher anzumelden und die stdout dieser Job zur gleichen Zeit erhalten .
Um dies zu tun, nenne ich das Python-Skript mit subprocess:
res = Popen (args, shell = False, stderr = STDOUT, stdout = PIPE)
die Um Erinnerung, ich bekomme den Job mit res.pid. Dann bekomme ich den Speicher mit psutil:
p = psutil.Process (pid)
mem_usage = p.memory_full_info()
Ich mag wäre es in der folgenden Art und Weise kombinieren :
die
- Code ausführen
jede Sekunde, melden Sie den Speicher in mem_usage
Melden Sie den stderr in einer Liste von Strings
ich das versucht:
while res.poll() is None:
(total_rss_Mo, total_vms_Mo, total_uss_Mo) = get_mem(pid)
print "MEM ",total_rss_Mo, total_vms_Mo, total_uss_Mo
# Wait a bit before next memory scam
time.sleep(1)
stderr, stdout = res.communicate()
Das Ergebnis ist nicht, was ich erwarte. Die ersten 20er Jahre, es funktioniert, aber dann geht der Job zu schlafen und endet nie:
MEM 7.77734375 152.52734375 4.30078125
MEM 290.49609375 1299.66015625 284.265625
MEM 436.53515625 1372.29296875 427.77734375
MEM 443.61328125 1633.8125 434.921875
MEM 544.26171875 1732.52734375 535.40625
MEM 548.59765625 1737.015625 539.89453125
MEM 552.765625 1741.01953125 543.8984375
MEM 552.51953125 1741.01953125 543.8984375
MEM 552.5703125 1741.01953125 543.8984375
MEM 552.55078125 1741.01953125 543.8984375
MEM 552.7265625 1741.01953125 543.8984375
MEM 455.63671875 1643.8828125 446.76171875
MEM 455.63671875 1643.8828125 446.76171875
MEM 455.63671875 1643.8828125 446.76171875
MEM 455.63671875 1643.8828125 446.76171875
MEM 455.63671875 1643.8828125 446.76171875
Es scheint, dass die stderr Puffer voll ist und den Job in Warteschleife. Wie kann ich das stderr/stdout bekommen und meinen Speicher gleichzeitig notieren? Wenn ich versuche, die stdout in einer Schleife zu lesen, setzt die Schleife bis zum Ende des Jobs und ich kann den Speicher während der Jobausführung nicht mehr einloggen:
while True:
line = res.stdout.readline()
if not line or line == "":
break
print line
Danke für Ihre Hilfe,
Akira
Warum nicht die Ausgangsleseschleife in die Speicherschleife legen? h. in jeder Iteration, lese die Ausgabe bis eine leere Zeile, dann überprüfe den Speicher. – FamousJameous
Welcher Job läuft gerade, wenn der Puffer stderr voll ist? – lolopop
Zum lolopop: Der Job ist ein Bildsimulator für ein Weltraumteleskop. Es spuckt eine ziemlich große Anzahl von Zeilen aus, die beschreiben, was es tut. To FamousJameous: Wo immer ich die Ausgabe lesen Schleife, es liest weiter und nie aus der Schleife, bis der Job beendet ist. So bekomme ich kein Speicherprotokoll. \ n Ich möchte nur die Ausgangslinien lesen, die bis zu diesem Punkt produziert wurden und dann die Schleife verlassen. Ich könnte dann den Speicher protokollieren und danach die Ausgabe überprüfen. –