Salida de captura de subproceso de Python

Salman Mehmood 12 octubre 2023
  1. Salida de captura de subproceso de Python
  2. Enfoque 1: use check_output para capturar la salida del subproceso en Python
  3. Enfoque 2: use Popen.communicate para capturar la salida del subproceso en Python
Salida de captura de subproceso de Python

El objetivo principal de este artículo es demostrar cómo se puede capturar, almacenar y mostrar la salida de un Subproceso en Python.

Salida de captura de subproceso de Python

Subprocess es un módulo integrado de Python que viene preinstalado con un archivo de instalación de Python. Se utiliza para ejecutar nuevos códigos y aplicaciones mediante la creación de nuevos procesos donde la tarea dada (según lo que se pasó) se ejecuta por separado de su proceso.

Una de las principales ventajas de usar Subprocess es que nos permite lanzar nuevos programas a partir del programa que tenemos escrito actualmente.

Un ejemplo de ejecución de dichos programas es si desea clonar algún proyecto del repositorio de Git o tal vez ejecutar un compilador binario de C++ que realiza sus tareas específicas.

Consideremos que queremos ejecutar un programa escrito en C++, cuyo código se encuentra a continuación.

#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;
}

Que abrir la ejecución de forma independiente da el siguiente resultado:

pirámide

Ahora ejecutamos el archivo binario compilado del programa escrito usando Python.

import subprocess

p2 = subprocess.Popen("program\\pyramid.exe")
print(p2)

Producción :

<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

Como se ve en el código anterior, es bastante evidente que, en lugar de obtener la cadena, obtenemos la instancia de Popen, que no es el caso ideal ya que necesitamos la salida de la cadena para realizar el procesamiento en la salida o para otros fines.

Cabe señalar que la salida de la pirámide que vemos no es el resultado de imprimir la variable denominada p2, sino la salida del programa ejecutado utilizando el Popen.

Este problema se puede abordar de múltiples maneras, algunas de las cuales se describen a continuación.

Enfoque 1: use check_output para capturar la salida del subproceso en Python

Considere el siguiente código:

from subprocess import check_output

out = check_output(["program\\pyramid.exe"])

print(out)

Producción :

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'

La salida está en forma de bytes, que se puede convertir fácilmente en una cadena usando la función decode().

print(out.decode("utf-8"))

Producción:

pirámide

Esta es nuestra salida deseada en la variable de cadena denominada out.

La función check_output() ejecuta nuestro comando deseado y devuelve la salida del comando del programa ejecutado en forma de cadena de bytes.

Entonces podemos usar el método decode() para convertir la cadena de bytes en una cadena normal. El parámetro de codificación a los parámetros decode() puede variar según el tipo de salida.

En nuestro caso era utf-8, pero puede variar de un programa a otro y en diferentes sistemas operativos.

Enfoque 2: use Popen.communicate para capturar la salida del subproceso en Python

Considere el siguiente código:

import subprocess

pipe = subprocess.Popen("\\program\\pyramid.exe", stdout=subprocess.PIPE)

text = pipe.communicate()[0]

print(text)

Producción :

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'

Como antes, se devuelve una cadena de bytes, que se puede devolver fácilmente usando la función decode().

print(text.decode("utf-8"))

Producción:

pirámide

En lugar de usar check_output, también podemos usar el método Popen.communicate(), una de las principales ventajas de check_output es que permite redirigir tanto stdout como stderr a nuestras variables deseadas.

Funciona que Popen devuelve una tupla de stdout y stderr, por lo que cuando accede a [0], solo está agarrando el stdout. También puede hacer text, err = pipe.communicate(), y luego el texto tendrá lo que se requiere.

Al igual que check_output, Popen.communicate() también devuelve una cadena de bytes que se puede convertir fácilmente en una cadena normal usando el método decode después de pasar el esquema de codificación compatible y adecuado al método decode.

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

Artículo relacionado - Python Subprocess