Subprocess Run vs Subprocess Popen: La batalla de los módulos de Python
¿Qué es Subprocess Run?
Subprocess Run es un módulo de la biblioteca estándar de Python que nos permite ejecutar comandos en el sistema operativo. Es una herramienta poderosa que nos brinda la capacidad de interactuar con programas externos desde nuestro código Python.
Con Subprocess Run, podemos ejecutar comandos en la línea de comandos, obtener su salida y manejar cualquier error que pueda ocurrir durante la ejecución.
Este módulo es especialmente útil cuando necesitamos ejecutar comandos simples y obtener su salida de manera sencilla.

¿Qué es Subprocess Popen?
Subprocess Popen también es un módulo de la biblioteca estándar de Python que nos permite ejecutar comandos en el sistema operativo. Sin embargo, a diferencia de Subprocess Run, Subprocess Popen nos brinda un mayor control sobre el proceso en ejecución.
Con Subprocess Popen, podemos manipular la entrada y salida del proceso, así como también controlar su estado y realizar operaciones más avanzadas, como redirigir la entrada y salida estándar, establecer variables de entorno y mucho más.
Este módulo es especialmente útil cuando necesitamos un mayor control sobre el proceso en ejecución y realizar operaciones más avanzadas.
¿Cuándo usar Subprocess Run?

Ejecución simple de comandos
Subprocess Run es perfecto cuando simplemente necesitamos ejecutar un comando y obtener su salida. Por ejemplo, si queremos ejecutar el comando “ls” en un sistema Unix para obtener una lista de archivos en un directorio, podemos usar Subprocess Run de la siguiente manera:
import subprocess
output = subprocess.run(["ls"], capture_output=True, text=True)
print(output.stdout)
En este caso, Subprocess Run ejecuta el comando “ls” y captura su salida estándar. Luego, podemos acceder a la salida utilizando la propiedad “stdout” del objeto de salida.
Manejo de errores
Subprocess Run también nos permite manejar errores que puedan ocurrir durante la ejecución del comando. Por ejemplo, si queremos verificar si un comando se ejecutó correctamente, podemos hacer lo siguiente:
import subprocess
try:
subprocess.run(["ls", "nonexistent_directory"], check=True)
except subprocess.CalledProcessError as e:
print(f"Error: {e}")
En este caso, Subprocess Run lanzará una excepción “CalledProcessError” si el comando falla. Podemos capturar esta excepción y manejarla según nuestras necesidades.
¿Cuándo usar Subprocess Popen?
Control avanzado del proceso
Subprocess Popen es ideal cuando necesitamos un mayor control sobre el proceso en ejecución. Por ejemplo, si queremos ejecutar un comando y redirigir su salida a un archivo, podemos usar Subprocess Popen de la siguiente manera:
import subprocess
with open("output.txt", "w") as f:
process = subprocess.Popen(["ls"], stdout=f)
process.wait()
En este caso, Subprocess Popen ejecuta el comando “ls” y redirige su salida estándar al archivo “output.txt”. Luego, esperamos a que el proceso termine utilizando el método “wait()”.
Manipulación de la entrada y salida
Subprocess Popen también nos permite manipular la entrada y salida del proceso en ejecución. Por ejemplo, si queremos enviar datos de entrada al proceso y obtener su salida, podemos hacer lo siguiente:
import subprocess
process = subprocess.Popen(["grep", "python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
output, _ = process.communicate("Hello, python!")
print(output)
En este caso, Subprocess Popen ejecuta el comando “grep python” y le envía la cadena “Hello, python!” como entrada. Luego, obtenemos la salida del proceso utilizando el método “communicate()”.
Tanto Subprocess Run como Subprocess Popen son módulos poderosos de la biblioteca estándar de Python que nos permiten ejecutar comandos en el sistema operativo. Subprocess Run es ideal para ejecuciones simples de comandos y manejo básico de errores, mientras que Subprocess Popen nos brinda un mayor control sobre el proceso en ejecución y nos permite realizar operaciones más avanzadas.
Es importante comprender las diferencias entre ambos módulos y elegir el más adecuado según nuestras necesidades. Ambos módulos son herramientas valiosas que nos ayudarán a interactuar con programas externos desde nuestro código Python de manera eficiente y efectiva.
