Mal wieder subprocess...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

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ß
Grüßle.
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?
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

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ß
Grüßle.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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