Qu'est-ce que la bibliothèque Sh ?
Dans de nombreux projets Python, il est nécessaire d'exécuter des commandes shell : gérer des fichiers, lancer des processus système, interagir avec des outils CLI installés. Utiliser os.system ou subprocess est possible, mais ces approches sont lourdes et nécessitent une gestion manuelle des arguments, des erreurs et des sorties.
La bibliothèque Sh offre une manière propre et pythonique d'appeler des commandes shell comme de simples fonctions Python. Elle simplifie considérablement l'intégration d'utilitaires externes, rend le code lisible et facile à déboguer.
Avantages de l'utilisation de Sh
La bibliothèque Sh présente plusieurs avantages majeurs par rapport aux méthodes standard d'exécution de commandes système :
Lisibilité et simplicité de syntaxe – les commandes ressemblent à des fonctions Python classiques, ce qui rend le code plus compréhensible et maintenable.
Gestion automatique des erreurs – la bibliothèque traite automatiquement les codes de retour et lève des exceptions en cas d'erreur.
Sécurité – protection contre les injections de commandes grâce à un échappement correct des arguments.
Flexibilité – prise en charge des pipelines, de l'exécution en arrière-plan, des entrées-sorties en flux continu et de nombreuses autres fonctionnalités.
Installation et configuration
L'installation de la bibliothèque se fait via pip :
pip install sh
Pour l'utiliser dans votre code, un simple import suffit :
import sh
Principes de base
Sh mappe automatiquement le nom de toute commande shell en une fonction Python. Cela permet de les appeler de manière naturelle :
print(sh.ls("-l"))
Chaque appel retourne un objet contenant la sortie standard (stdout), qui peut être convertie en chaîne de caractères, liste de lignes, bytes ou autres formats.
Utilisation de base
Gestion des fichiers
# Liste des fichiers
print(sh.ls("-lah"))
# Création d'un fichier
sh.touch("fichier.txt")
# Copie d'un fichier
sh.cp("fichier.txt", "copie.txt")
# Suppression d'un fichier
sh.rm("copie.txt")
# Création d'un répertoire
sh.mkdir("test_dir")
# Déplacement d'un fichier
sh.mv("fichier.txt", "test_dir/")
Traitement de texte
# Affichage du contenu d'un fichier
contenu = sh.cat("fichier.txt")
print(str(contenu))
# Recherche dans les fichiers
resultats = sh.grep("python", "*.py")
for resultat in resultats:
print(resultat.strip())
# Comptage de lignes
nombre_lignes = sh.wc("-l", "fichier.txt")
print(f"Nombre de lignes : {nombre_lignes.strip()}")
Gestion des arguments et options
Sh prend en charge différentes façons de passer des arguments aux commandes :
Arguments positionnels
sh.ls("--color", "auto", "/home/utilisateur")
Arguments nommés
# Options longues
sh.ls(color="auto", all=True, human_readable=True)
# Options courtes
sh.ls(a=True, l=True, h=True)
Approche combinée
# Utilisation mixte
sh.find("/home", name="*.py", type="f")
Traitement de la sortie des commandes
Récupération du résultat sous forme de chaîne
sortie = sh.ls()
print(str(sortie))
Traitement ligne par ligne
for ligne in sortie:
print(ligne.strip())
Travail avec les bytes
sortie_brute = sh.ls()
donnees_bytes = sortie_brute.stdout
Division en une liste de lignes
lignes = str(sh.ls()).split('\n')
for ligne in lignes:
if ligne.strip():
print(ligne)
Gestion des erreurs
La bibliothèque Sh offre des mécanismes puissants pour la gestion des erreurs :