Ausgabe der Erfassung des Python-Unterprozesses

Salman Mehmood 12 Oktober 2023
  1. Ausgabe der Erfassung des Python-Unterprozesses
  2. Ansatz 1: Verwenden Sie check_output, um die Ausgabe von subprocess in Python zu erfassen
  3. Ansatz 2: Verwenden Sie Popen.communicate, um die Ausgabe von subprocess in Python zu erfassen
Ausgabe der Erfassung des Python-Unterprozesses

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:

Pyramide

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:

Pyramide

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:

Pyramide

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.

Salman Mehmood avatar Salman Mehmood avatar

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

Verwandter Artikel - Python Subprocess