Configuración del entorno
Antes de usar subprocess.run, asegúrate de taner Python instalado (versión 3.6 o superior recomendada). Puedes verificar la instalación ejecutando python --version en tu terminal.
Ejemplo básico: ejecución simple de comandos
Comencemos con un ejemplo básico que ejecuta un comando del sistema para imprimir un mensaje. En sistemas Unix-like, se usa la lista de argumentos para mayor claridad:
import subprocess
# Ejecutar el comando 'echo' con un mensaje de saludo
comando_base = ['echo', '¡Bienvenido al mundo de subprocess!']
ejecucion = subprocess.run(comando_base)
# Verificar si la ejecución fue exitosa
if ejecucion.returncode == 0:
print("Comando completado sin errores.")
else:
print("Se produjo un error durante la ejecución.")
En entornos Windows, adapta el comando según sea necesario, como usar ['dir', '.'] para listar archivos.
Uso con argumentos adicionales
Los comandos a menudo requieren argumentos para funciones específicas. Por ejemplo, para listar archivos en formato detallado en Unix:
import subprocess
# Listar archivos con argumentos '-l' y '-a' para mostrar detalles y archivos ocultos
parametros = ['ls', '-l', '-a']
subprocess.run(parametros)
Cada argumento debe ser un elemento separado en la lista para evitar errores de interpretación.
Captura y manejo de la salida
Para procesar la salida de un comando en lugar de imprimirla directamente, utiliza los parámetros capture_output=True y text=True. Esto permite acceder a los resultados como cadenas:
import subprocess
# Ejecutar un comando para obtener información del sistema y capturar su salida
proceso_ejecutado = subprocess.run(['whoami'], capture_output=True, text=True)
# Extraer la salida estándar eliminando espacios en blanco
nombre_usuario = proceso_ejecutado.stdout.strip()
print(f"El usuario actual del sistema es: {nombre_usuario}")
# Verificar el código de retorno
if proceso_ejecutado.returncode != 0:
print("Advertencia: el comando no se ejecutó correctamente.")
Los atributos stdout y stderr del objeto devuelto contienen la salida y los errores, respectivamente.
Errores frecuentes y prevención
Al usar subprocess.run, es común encontrar estos problemas:
- Pasar el comando como una sola cadena en lugar de una lista, lo que pueede causar fallos.
- Utilizar
shell=Truesin validar entradas, lo que introduce vulnerabilidades de seguridad. - No revisar el código de retorno (
returncode), ignorando posibles fallos en secuencias. - Manejar incorrectamente rutas con espacios sin escapado adecuado.
Para mitigar estos riesgos, prefiere listas de argumentos y siempre implementa comprobaciones de retorno.
Ejercicio práctico: verificar la versión de Python
Aplica lo aprendido creando un script que ejecute python --version y muestre la versión instalada. Este ejemplo integra múltiples conceptos:
import subprocess
def obtener_version_python():
try:
# Ejecutar el comando para obtener la versión de Python
comando_version = ['python', '--version']
resultado = subprocess.run(comando_version, capture_output=True, text=True)
# Procesar la salida si el comando fue exitoso
if resultado.returncode == 0:
version = resultado.stdout.strip()
print(f"Versión de Python detectada: {version}")
else:
print("Error: no se pudo obtener la versión.")
except FileNotFoundError:
print("Python no está instalado o no se encuentra en el PATH del sistema.")
obtener_version_python()
Este script maneja excepciones y proporciona una salida estructurada, demostrando una aplicación real de subprocess.run.