Python subprocess.call und subprocess.Popen stdout

So bemerkte ich subprocess.call während es wartet, bis der Befehl beendet ist, bevor er mit dem Python-Skript fortfährt, ich habe keine Möglichkeit, das Stdout zu bekommen, außer mit subprocess.Popen . Gibt es irgendwelche alternativen Funktionsaufrufe, die warten würden, bis es fertig ist? (Ich habe auch versucht, Popen.wait )

HINWEIS: Ich versuche es zu vermeiden

 result = subprocess.Popen([commands..., self.tmpfile.path()], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = result.communicate() print out+"HIHIHI" 

Meine Ausgabe:

 HIHIHI 

HINWEIS: Ich versuche, wine damit zu rennen.

  • Wie läuft man mehrere Dateien in mehreren Terminal-Fenstern mit Python
  • Python-Unterprozeß readlines () hängt
  • Fang Stdout in Echtzeit aus Unterprozeß
  • Python-Unterprozeß lesen
  • Python - wie man Shell-Befehle mit Pipe ausführt?
  • Wie man ssh von Subprocess-Modul aufruft, damit es SSH_ASKPASS Variable verwendet
  • Python subprocess hide stdout und warte darauf, zu vervollständigen
  • Verwenden von Python, um ausführbare Datei auszuführen und die Benutzereingabe auszufüllen
  • 4 Solutions collect form web for “Python subprocess.call und subprocess.Popen stdout”

    Ich benutze das folgende Konstrukt, obwohl Sie vielleicht vermeiden wollen shell=True . Dies gibt Ihnen die Ausgabe und Fehlermeldung für jeden Befehl und den Fehlercode auch:

     process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # wait for the process to terminate out, err = process.communicate() errcode = process.returncode 
     subprocess.check_output(...) 

    Ruft den Prozess auf, erhebt sich, wenn sein Fehlercode ungleich Null ist und andernfalls seinen Stdout zurückgibt. Es ist nur eine kurze Abkürzung, also musst du dich keine Sorgen um PIPE und Sachen machen.

    Wenn Ihr Prozess gibt eine riesige Stdout und kein Stderr, communicate() könnte der falsche Weg zu gehen aufgrund von Speicherbeschränkungen.

    Stattdessen,

     process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # wait for the process to terminate for line in process.stdout: do_something(line) errcode = process.returncode 

    Könnte der Weg gehen.

    process.stdout ist ein dateiähnliches Objekt, das man als beliebiges anderes Objekt behandeln kann, hauptsächlich:

    • Sie können read() von ihr read()
    • Du kannst readline() von ihm und
    • Du kannst darüber hinweg iterieren.

    Letzteres ist, was ich oben tue, um seinen Inhalt Zeile für Zeile zu erhalten.

    Ich würde so etwas probieren:

     #!/usr/bin/python from __future__ import print_function import shlex from subprocess import Popen, PIPE def shlep(cmd): '''shlex split and popen ''' parsed_cmd = shlex.split(cmd) ## if parsed_cmd[0] not in approved_commands: ## raise ValueError, "Bad User! No output for you!" proc = Popen(parsed_command, stdout=PIPE, stderr=PIPE) out, err = proc.communicate() return (proc.returncode, out, err) 

    … Mit anderen Worten: shlex.split () macht die meiste Arbeit. Ich würde nicht versuchen, die Shell-Kommandozeile zu analysieren, Rohrleitungsbetreiber zu finden und eigene Pipeline einzurichten. Wenn du das machst, dann musst du grundsätzlich einen kompletten Shell-Syntax-Parser schreiben und du wirst am Ende eine Menge Sanitär machen.

    Natürlich hebt dies die Frage, warum nicht nur Popen mit der Shell = True (Keyword) Option verwenden? Dies wird Ihnen erlauben, einen String (keine Aufspaltung oder Parsing) an die Shell und immer noch sammeln die Ergebnisse zu behandeln, wie Sie es wünschen. Mein Beispiel hier wird keine Pipelines, Backticks, Dateideskriptor Umleitung, etc., die in den Befehl sein könnte verarbeiten, werden sie alle als wörtliche Argumente auf den Befehl erscheinen. Also ist es immer noch sicherer, dann mit Shell zu laufen = True … Ich habe ein dummes Beispiel für die Überprüfung des Befehls gegen irgendeine Art von "genehmigtem Befehl" Wörterbuch oder Set — durch es würde mehr Sinn, das zu normalisieren in ein Absoluter Pfad, es sei denn, Sie beabsichtigen zu verlangen, dass die Argumente normalisiert werden, bevor die Befehlszeichenfolge an diese Funktion übergeben wird.

    Python ist die beste Programmiersprache der Welt.