Seite 1 von 1

Mal wieder subprocess...

Verfasst: Samstag 9. Januar 2010, 04:07
von theliquidwave
Hi.
Also ich möchte unter Linux folgenden Befehl per subprocess um die Rückgabe zu erhalten - die Ausführung _muss_ zwingend blockiert werden. Der Code hier öffnet den Kram irgendwie 2x hintereinander und die Ausgabe erfolgt auf dem Screen (in PUTTY).

Ich möchte also gerne - wenn möglich - die Rückgabe von einem Befehl der blockt (hier z.B. "screen -list") in einer Variable speichern.

Hier ist emin Code der nicht funktioniert:

Code: Alles auswählen

def getBlockingCommandReturn(call):
    handle = subprocess.Popen(call, shell=True, stdout=subprocess.PIPE)
    handle.wait() # blocking
    return handle.communicate()[0] # stdout

ret = getBlockingCommandReturn(("screen", "-list"))

if "srcds" in ret:
    pass #...
Bin dankbar für Hilfe!

Gruß

Verfasst: Samstag 9. Januar 2010, 06:09
von BlackJack
@Chrisber: Nimm einfach das `wait()` in Zeile 3 raus. Da wartest Du auf das Ende des Prozesses. Der ist aber erst zuende, wenn er durchgelaufen ist, und alle Ausgaben aus dem Puffer abgenommen werden. Das machst Du mit dem `communicate()` aber erst *nachdem* Du auf's Ende des Prozesses gewartet hast, was aber nie erreicht wird…

Das funktioniert nur wenn die Ausgaben die Puffer nicht komplett füllen, ist also alles andere als garantiert.

`communicate()` blockiert ja.

Was macht eigentlich das ``shell=True`` da?

Verfasst: Samstag 9. Januar 2010, 13:47
von theliquidwave
Hi.
Ach so - dann ist es ja kein Wunder. Danke für die Erklärung.
Das shell muss ich noch machen, um einen Shellaufruf zu "simulieren" - wozu ist denn der Parameter sonst da?

Edit: Perfekt - ohne den shell-Parameter und das .wait() geht alles super. Dankeschön!

Gruß

Verfasst: Samstag 9. Januar 2010, 14:36
von cofi
Chrisber hat geschrieben:Das shell muss ich noch machen, um einen Shellaufruf zu "simulieren" - wozu ist denn der Parameter sonst da?
Subprocess Documentation hat geschrieben:On Unix, with shell=False (default): In this case, the Popen class uses os.execvp() to execute the child program. args should normally be a sequence. A string will be treated as a sequence with the string as the only item (the program to execute).

On Unix, with shell=True: If args is a string, it specifies the command string to execute through the shell. If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional shell arguments.