Exécution de commandes Bash en Python
Lors de l'exécution de commandes basées sur un fichier .rdf à l'aide de os.system() dans un script Python, vous pouvez rencontrer des écarts entre les résultats d'exécution sur votre ordinateur local et sur un serveur.
Problème
Ce problème survient en raison de divergences dans le disponibilité des commandes shell entre ces environnements. Sur la machine locale, la commande s'exécute avec succès, mais sur le serveur, elle échoue avec une erreur indiquant l'absence du module requis.
Comprendre Shell
Lors de l'utilisation de os.system() ou subprocess.run(), vous pouvez rencontrer des défis liés à l'utilisation des modes shell ou non-shell.
-
Mode Shell (shell=True) : Dans ce mode, votre commande est transmise sous forme de chaîne au shell système (généralement /bin/sh) pour interprétation. Il donne accès aux fonctionnalités du shell telles que la redirection, le contrôle des tâches et l'expansion des caractères génériques.
-
Mode non-Shell (shell=False) : Dans ce mode, votre commande est exécutée sous la forme d'une liste de arguments, en contournant le shell. Il offre plus de contrôle et d'isolation, mais vous perdez l'accès aux fonctionnalités spécifiques au shell.
Pièges courants
Considérez le code suivant :
bashCommand = "cwm --rdf test.rdf --ntriples > test.nt"
os.system(bashCommand)
Copier après la connexion
-
Citation : Si vous utilisez shell=False et que votre commande contient des espaces, vous devez correctement citer le arguments.
-
Extension du shell : Certaines commandes utilisent des fonctionnalités d'extension du shell qui peuvent ne pas être disponibles en mode non-shell.
-
Chemins de commande : Assurez-vous que les commandes requises sont disponibles dans le chemin sur les deux environnements.
Débogage Processus
Pour résoudre ce problème, vous pouvez suivre ces étapes :
-
Imprimer la commande : Utilisez print(bashCommand) pour afficher la commande avant l'exécution.
-
Analyser l'invocation du shell : Assurez-vous que le shell utilisé sur le serveur est le même que sur votre machine locale. Vérifiez /etc/shells pour le shell par défaut.
-
Vérifiez la disponibilité de la commande : Confirmez que la commande dont vous avez besoin est installée et disponible dans le chemin sur les deux systèmes.
-
Utilisez des méthodes sécurisées pour le shell : Si possible, modifiez votre code pour utiliser les fonctions sécurisées pour le shell de Python telles que subprocess.run(..., shell=True).
Bonnes pratiques
Pour éviter ces problèmes à l'avenir, tenez compte des bonnes pratiques suivantes :
- Préférez subprocess.run( ) sur os.system().
- Utilisez universal_newlines=True ou text=True pour les données textuelles Exchange.
- Envisagez attentivement d'utiliser shell=True ou shell=False.
- Évitez d'exécuter Python à partir de Python à l'aide de commandes shell.
- Utilisez check=True pour valider l'exécution de la commande.
- Comprenez les différences entre sh et Bash lors de l'utilisation du mode shell.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!