Ausgabe der Erfassung des Python-Unterprozesses
- Ausgabe der Erfassung des Python-Unterprozesses
-
Ansatz 1: Verwenden Sie
check_output
, um die Ausgabe vonsubprocess
in Python zu erfassen -
Ansatz 2: Verwenden Sie
Popen.communicate
, um die Ausgabe vonsubprocess
in Python zu erfassen
Das Hauptziel dieses Artikels ist es zu zeigen, wie die Ausgabe eines Subprocess
in Python erfasst, gespeichert und angezeigt werden kann.
Ausgabe der Erfassung des Python-Unterprozesses
Subprocess
ist ein eingebautes Python-Modul, das mit einer Installationsdatei von Python vorinstalliert ist. Es wird verwendet, um neue Codes und Anwendungen auszuführen, indem neue Prozesse erstellt werden, bei denen die angegebene Aufgabe (gemäß dem, was übergeben wurde) getrennt von ihrem Prozess ausgeführt wird.
Einer der Hauptvorteile der Verwendung von Subprocess
besteht darin, dass wir damit neue Programme aus dem Programm starten können, das wir gerade geschrieben haben.
Ein Beispiel für die Ausführung solcher Programme ist, wenn Sie ein Projekt aus dem Git-Repository klonen oder vielleicht eine C++-Compiler-Binärdatei ausführen möchten, die ihre spezifischen Aufgaben ausführt.
Stellen Sie sich vor, wir wollen ein in C++ geschriebenes Programm ausführen, dessen Code unten ist.
#include <iostream>
using namespace std;
int main() {
int rows = 5, count = 0, count1 = 0, k = 0;
for (int i = 1; i <= rows; ++i) {
for (int space = 1; space <= rows - i; ++space) {
cout << " ";
++count;
}
while (k != 2 * i - 1) {
if (count <= rows - 1) {
cout << i + k << " ";
++count;
}
else {
++count1;
cout << i + k - 2 * count1 << " ";
}
++k;
}
count1 = count = k = 0;
cout << endl;
}
return 0;
}
Welche offene Ausführung unabhängig voneinander die folgende Ausgabe ergibt:
Jetzt führen wir die kompilierte Binärdatei des mit Python geschriebenen Programms aus.
import subprocess
p2 = subprocess.Popen("program\\pyramid.exe")
print(p2)
Ausgang:
<Popen: returncode: None args: '....\\program\\pyramid.exe>
1
2 3 2
3 4 5 4 3
4 5 6 7 6 5 4
5 6 7 8 9 8 7 6 5
Wie im obigen Code zu sehen ist, ist es ziemlich offensichtlich, dass wir anstelle des Strings die Instanz von Popen
erhalten, was nicht der Idealfall ist, da wir die Ausgabe des Strings benötigen, um die Ausgabe zu verarbeiten oder für andere Zwecke.
Es muss beachtet werden, dass die Pyramidenausgabe, die wir sehen, nicht das Ergebnis des Druckens der Variablen namens p2
ist, sondern die Ausgabe des ausgeführten Programms mit Popen
.
Dieses Problem kann auf mehrere Arten angegangen werden, von denen einige unten beschrieben werden.
Ansatz 1: Verwenden Sie check_output
, um die Ausgabe von subprocess
in Python zu erfassen
Betrachten Sie den folgenden Code:
from subprocess import check_output
out = check_output(["program\\pyramid.exe"])
print(out)
Ausgang:
b' 1 \r\n 2 3 2 \r\n 3 4 5 4 3 \r\n 4 5 6 7 6 5 4 \r\n5 6 7 8 9 8 7 6 5 \r\n'
Die Ausgabe erfolgt in Byteform, die mit der Funktion decode()
einfach in einen String umgewandelt werden kann.
print(out.decode("utf-8"))
Ausgang:
Dies ist unsere gewünschte Ausgabe in der String-Variablen namens out
.
Die Funktion check_output()
führt unseren gewünschten Befehl aus und gibt die Ausgabe des Befehls des ausgeführten Programms in Form eines Byte-Strings zurück.
Wir können dann die Methode decode()
verwenden, um den Byte-String in einen normalen String umzuwandeln. Der Kodierungsparameter zu den decode()
-Parametern kann je nach Ausgabetyp variieren.
In unserem Fall war es utf-8
, kann aber von Programm zu Programm und in verschiedenen Betriebssystemen variieren.
Ansatz 2: Verwenden Sie Popen.communicate
, um die Ausgabe von subprocess
in Python zu erfassen
Betrachten Sie den folgenden Code:
import subprocess
pipe = subprocess.Popen("\\program\\pyramid.exe", stdout=subprocess.PIPE)
text = pipe.communicate()[0]
print(text)
Ausgang:
b' 1 \r\n 2 3 2 \r\n 3 4 5 4 3 \r\n 4 5 6 7 6 5 4 \r\n5 6 7 8 9 8 7 6 5 \r\n'
Zurückgegeben wird wie bisher ein Byte-String, der einfach mit der Funktion decode()
zurückgegeben werden kann.
print(text.decode("utf-8"))
Ausgang:
Anstatt check_output
zu verwenden, können wir auch die Popen.communicate()
-Methode verwenden, einer der Hauptvorteile von check_output
besteht darin, dass man sowohl stdout
als auch stderr
auf unsere gewünschten Variablen umleiten kann.
Es funktioniert, dass Popen
ein Tupel aus stdout
und stderr
zurückgibt, wenn Sie also auf [0]
zugreifen, greifen Sie nur auf stdout
. Sie könnten auch text, err = pipe.communicate()
ausführen, und dann enthält text
das, was erforderlich ist.
Genau wie check_output
liefert auch Popen.communicate()
einen Byte-String zurück, der mit der Methode decode
einfach in einen normalen String umgewandelt werden kann, nachdem das kompatible und passende Codierungsschema an die Methode decode
übergeben wurde.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn