¿Qué es la librería Sh?
En muchos proyectos de Python surge la necesidad de ejecutar comandos del sistema: gestionar archivos, lanzar procesos del sistema o interactuar con herramientas CLI. Aunque se puede usar os.system o subprocess, estos métodos suelen ser engorrosos y requieren manejar manualmente argumentos, errores y salidas.
La librería Sh ofrece una forma limpia y pitónica de invocar comandos shell como si fueran funciones normales de Python. Simplifica enormemente la integración de utilidades externas, haciendo el código más legible y fácil de depurar.
Ventajas de usar Sh
La librería Sh tiene varias ventajas importantes frente a los métodos estándar para ejecutar comandos del sistema:
Legibilidad y sintaxis simple – los comandos se ven como funciones Python normales, lo que hace el código más claro y mantenible.
Manejo automático de errores – la librería gestiona automáticamente los códigos de retorno y lanza excepciones cuando ocurren errores.
Seguridad – protección contra inyección de comandos gracias al escape correcto de argumentos.
Flexibilidad – soporte para pipelines, ejecución en segundo plano, entrada/salida por flujo y muchas otras funcionalidades.
Instalación y configuración
La instalación de la librería se realiza mediante pip:
pip install sh
Para usarla en tu código, basta con un solo import:
import sh
Principios básicos de funcionamiento
Sh asigna automáticamente el nombre de cualquier comando shell a una función de Python. Esto permite invocarlos de forma natural:
print(sh.ls("-l"))
Cada llamada devuelve un objeto que contiene la salida estándar (stdout), la cual puede convertirse a cadena de texto, lista de líneas, bytes u otros formatos.
Uso básico
Trabajo con archivos
# Listar archivos
print(sh.ls("-lah"))
# Crear un archivo
sh.touch("archivo.txt")
# Copiar un archivo
sh.cp("archivo.txt", "copia.txt")
# Eliminar un archivo
sh.rm("copia.txt")
# Crear un directorio
sh.mkdir("carpeta_prueba")
# Mover un archivo
sh.mv("archivo.txt", "carpeta_prueba/")
Trabajo con texto
# Mostrar contenido de un archivo
contenido = sh.cat("archivo.txt")
print(str(contenido))
# Buscar en archivos
coincidencias = sh.grep("python", "*.py")
for coincidencia in coincidencias:
print(coincidencia.strip())
# Contar líneas
num_lineas = sh.wc("-l", "archivo.txt")
print(f"Número de líneas: {num_lineas.strip()}")
Trabajo con argumentos y opciones
Sh admite varias formas de pasar argumentos a los comandos:
Argumentos posicionales
sh.ls("--color", "auto", "/home/usuario")
Argumentos nombrados
# Opciones largas
sh.ls(color="auto", all=True, human_readable=True)
# Opciones cortas
sh.ls(a=True, l=True, h=True)
Enfoque combinado
# Uso mixto
sh.find("/home", name="*.py", type="f")
Manejo de la salida de comandos
Obtener resultado como cadena de texto
salida = sh.ls()
print(str(salida))
Procesamiento línea por línea
for linea in salida:
print(linea.strip())
Trabajo con bytes
salida_cruda = sh.ls()
datos_bytes = salida_cruda.stdout
Dividir en lista de líneas
lineas = str(sh.ls()).split('\n')
for linea in lineas:
if linea.strip():
print(linea)
Gestión de errores
La librería Sh ofrece potentes mecanismos para el manejo de errores: