2017-04-13 1 views
0

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

+0

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

+0

Welcher Job läuft gerade, wenn der Puffer stderr voll ist? – lolopop

+0

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. –

Antwort

0

Ich fand eine Lösung, indem ich die Speicherprotokollierung in einen separaten Thread setzte. Es kollidiert nicht mehr mit der Schleife, um das stdout/stderr des Subprozesses abzurufen.

Verwandte Themen