In diesem Szenario möchten Sie einen Shell-Befehl mithilfe des Subprocess-Moduls ausführen und dabei drei Befehle verbinden: echo, awk , sortieren und ihre Ausgabe an eine Ausgabedatei weiterleiten.
echo "input data" | awk -f script.awk | sort > outfile.txt
Mit subprocess.Popen können Sie haben:
import subprocess p_awk = subprocess.Popen(["awk","-f","script.awk"], stdin=subprocess.PIPE, stdout=file("outfile.txt", "w")) p_awk.communicate( "input data" )
Während sich diese Lösung mit der Verrohrung von awk zum Sortieren befasst, übersieht sie einen wichtigen Gesichtspunkt:
Wie in der akzeptierten Antwort vorgeschlagen, ist es vorteilhafter, das neu zu schreiben, anstatt awk und Pipes zu verwenden script.awk in Python. Dadurch entfallen awk, die Pipeline und die Notwendigkeit einer komplexen Unterprozessbehandlung.
Durch die Ausführung aller Vorgänge innerhalb von Python profitieren Sie mehrere Vorteile:
Das Erstellen von Pipelines in der Shell erfordert mehrere Forks und Dateideskriptormanipulationen. Während es in Python mithilfe von Low-Level-APIs möglich ist, ist es weitaus einfacher, die Pipeline-Erstellung an die Shell zu delegieren, indem:
awk_sort = subprocess.Popen( "awk -f script.awk | sort > outfile.txt", stdin=subprocess.PIPE, shell=True ) awk_sort.communicate( b"input data\n" )
Dieser Ansatz verwendet die Shell als Vermittler zum Erstellen der Pipeline und vereinfacht so den Python-Code.
Das obige ist der detaillierte Inhalt vonWie kann ich mehrere Prozesse in Python effizient verbinden und komplexe Rohrleitungen mit „subprocess.Popen' vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!