Salida de captura de subproceso de Python
- Salida de captura de subproceso de Python
-
Enfoque 1: use
check_output
para capturar la salida delsubproceso
en Python -
Enfoque 2: use
Popen.communicate
para capturar la salida delsubproceso
en 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:
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:
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:
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
.
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