Sh – ejecución de comandos shell en Python

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿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:

Manejo básico de errores

Recommendations