8
votes

Est-ce bon style pour appeler des commandes Bash dans un script Python à l'aide d'OS.System ("Code Bash")?

Je me demandais si elle est considérée comme si elle est considérée comme un bon style pour appeler des commandes Bash dans un script Python à l'aide d'OS.System (). Je me demandais également si elle est aussi sûre de le faire.

Je sais comment mettre en œuvre certaines des fonctionnalités dont j'ai besoin dans Bash et en Python, mais il est beaucoup plus simple et plus intuitif de la mettre en œuvre à Bash. Cependant, j'ai l'impression que cela est très hackâche d'écrire OS.System ("Code Bash").

Spécifiquement, je souhaite déplacer tous les fichiers terminés par une certaine extension à un répertoire.

en bash: * mv .ext / chemin / à / destination En Python (pseudocode): Pour le fichier dans le répertoire: Si file.endswith ("ext"): Déplacer le fichier sur la destination

Dans ce cas, que dois-je faire?


2 commentaires

Pourrait implémenter la fonctionnalité Bash dans un script Bash propre et avoir Python exécuter le script Bash opposé à la mise en place du code de code directement dans OS.System ()? (Utilisez le meilleur outil pour le travail)


Ok, merci beaucoup pour toute votre aide! Vos réponses ont effacé certaines idées fausses dans ma tête. J'apprécie vraiment toutes les réponses.


7 Réponses :


3
votes

C'est toujours meilleur et meilleur style pour utiliser des fonctions Python pour faire ce genre de choses. Avec Python, ce n'est pas si difficile d'écrire un script de manière indépendante du système d'exploitation au lieu d'utiliser Bash.


0 commentaires

1
votes

Ce n'est pas une idée, car cela rend votre script un lot moins portable. Un script python natif peut exécuter sur n'importe quelle machine Unix ou Windows disposant des bibliothèques Python appropriées installées. Lorsque vous ajoutez des commandes shell dans le mélange, vous cassez cela et sont soudainement enfermés à un sous-ensemble beaucoup plus étroit.

Parfois, vous n'avez pas de choix, mais si c'est aussi simple que cela, écrivant le code de manière nativement en Python aurait beaucoup plus de sens, et aussi plus vite de démarrer (puisque le processus Python n'aura pas à reproduit une nouvelle coquille juste pour exécuter la commande unique).


0 commentaires

6
votes

Découvrez Python's Shuttilis module. Il propose des opérations de système de fichiers tels que le déplacement de fichiers. Entre cela et le module OS , vous devez disposer de tous les outils dont vous avez besoin. Ceci est préférable aux commandes Bash pour les raisons d'autres.


0 commentaires

1
votes

Les seuls problèmes de citation suggèrent qu'une solution python python est préférable.


0 commentaires

2
votes

Certaines raisons pour lesquelles vous devriez utiliser python pur,

  1. En utilisant Python, vous avez déjà fait l'hypothèse que Python et les bibliothèques standard sont installées. En utilisant le code Bash à l'intérieur de Python, vous faites cette hypothèse plus em> l'hypothèse que Bash est installée et sur le chemin du système. LI>
  2. En utilisant une combinaison de deux langues, vous rendez le code plus difficile pour les autres de lire (tout le monde sait Python et em> bash) li>
  3. Si vous le faites de la manière python, il se sentira plus naturel avant que les lignes de code de longue date ne soient pas toujours meilleures li> ol>

    Dans ce cas, j'utiliserais ... p>

    import os
    for filename in os.listdir('.'):
      if filename.endswith('.ext'):
        os.rename(filename, os.path.join('path', 'to', 'new', 'destination', filename))
    


1 commentaires

Vous pouvez supprimer le fichier.endswith () si vous utilisiez glob.glob ('*. EXT') au lieu de os.listdir



17
votes

Tout d'abord, votre exemple utilise mv em>, qui est un programme dans Coreutils em>, pas bash.

Utilisation des appels OS.System () à des programmes externes est considéré comme un mauvais style parce que: p>

  • Vous créez des dépendances spécifiques à la plate-forme li>
  • Vous créez des dépendances spécifiques à une version (oui, même Chantiers change parfois!) Li>
  • Vous devez rechercher l'existence de commandes externes (et qu'ils sont en $ chemin et exécutables par l'utilisateur, etc.) Li>
  • Vous devez envelopper les commandes avec la vérification des erreurs à l'aide de leur code de retour. Il est beaucoup plus agréable d'utiliser des codes ou des exceptions d'erreur de langue. (os.System () ne vous permet pas d'analyser stdout / stardr) li>
  • Vous devez faire face à des variables citatives avec des espaces vous-même (ou les échapper) li>
  • Python a déjà fait le travail pour vous en fournissant les bibliothèques! LI> ul>

    RECHERCHE GLOB STRAND>, pour la correspondance de motif de type coquille (globbing) et Shuttilis forte>, comme d'autres déjà mentionnées. Sinon, tout ce dont vous avez besoin est déjà dans les bibliothèques standard. P>

    import glob
    import shutil
    
    for extfile in glob.glob('*.ext'):
        shutil.move(extfile,dest)  
    


3 commentaires

Bonne réponse, mais je me limite un peu lorsque je vois des variables nommées "fichier" car il masque le fichier intégré.


Bon commentaire - édité :)


Grande réponse, mais pour ceux qui recherchent plus d'informations de migration Bash-> Python, je vais créer un lien vers Stackoverflow.com/Questtions/209470/...



0
votes

Plus généralement, Python fournit le module "Sous-péprobage" qui vous permettra d'exécuter des commandes et d'exercer un contrôle complet sur leur sortie. Il vous permet de renverser de nouveaux processus, de se connecter à leurs tuyaux d'entrée / sortie / d'erreur et à obtenir leurs codes de retour ":

http://docs.python.org/library/subprocess.html


0 commentaires