Lancer un programme python depuis un script shell

pasletempsdetrouverunpseudo Messages postés 4 Statut Membre -  
lEprofSonDkon Messages postés 227 Statut Membre -
Bonjour à la communauté,

J'ai depuis un moment un problème qui me semble être minuscule, néanmoins je n'arrive pas à trouver de solutions malgré mes longues recherches (sur des forums, etc...). Il faut dire que je découvre les commandes linux...

J'ai fait un programme python qui prend en entrée un fichier de données .dat. Je peux le lancer sans soucis avec la console grâce à la commande "python3 mon_prgm.py nom_de_mon_fichier.dat".

A présent, j'ai besoin de faire un script shell (ou un programme python, mais j'ai débord essayé en script shell) qui lance mon 1er programme autant de fois qu'il y a de fichiers de données qui contiennent le mot "NOEUD" dans le répertoire courant.

Voilà à quoi ressemble mon code :

for fichier in find -type f -name "NOEUD*.dat"/mon_repertoire/*
do
python3 mon_prgm.py fichier
done

Cela génère l'erreur :
FileNotFoundError: [Errno 2] No such file or directory: 'fichier'

Concrètement, j'ai l'impression que le programme python est bien lancé, mais que son paramètre d'entrée (qui doit être un fichier de données .dat) ne comprend pas que la variable "fichier" du script shell est un fichier. Et 2ème problème, le message d'erreur apparaît toujours 5 fois (comme si le prgm python essayait de se lancer 5 fois), alors qu'il n'y a pas 5 fichiers s'appellant "NOEUD*.dat" ...

Merci d'avance si quelqu'un peut m'aider !

4 réponses

  1. UnGnU Messages postés 1468 Statut Contributeur 158
     
    Salut,

    Avant de lancer quoi que ce soit, on commence toujours en général, par voir ce que pourrait donner une commande en retour…

    Donc, perso je commencerais plutôt par voir ce que me retourne la commande (voir au passage le man find pour la bonne syntaxe ;-\) :
    find /mon_repertoire/ -type f -name "NOEUD*.dat"

    Si le retour est concluant, avec les exemples en fin du man find, j'essaierai d'y inclure le programme python…

    0
  2. pasletempsdetrouverunpseudo Messages postés 4 Statut Membre
     
    En testant la commande que tu indiques, j'obtiens en retour les 3 fichiers qui correspondent à la recherche, donc c'est très bien, jusque là tout fonctionne correctement.

    Ensuite je l'intègre dans le programme :

    for fichier in find /mon_répertoire/ -type f -name "NOEUD*.dat"
    do
    python3 mon_prgm.py fichier
    done

    Et là j'obtiens la même erreur... Mais cette fois elle apparaît 6 fois et non plus 5 fois...

    Est-ce que le problème viendrait de ma boucle que j'écris "for fichier in find ... ? Etant donné que la commande find ... renvoie le nom des fichiers correspondant à la requête, ça me semblerait possible...
    0
    1. UnGnU Messages postés 1468 Statut Contributeur 158
       
      Pas besoin de boucle, la commande
      find
      avec ses options (
      exec
      notamment) ou via un pipe vers la commande
      xargs
      , devrait suffire.
      0
  3. lEprofSonDkon Messages postés 227 Statut Membre 13
     
    salut,

    continue en python.

    tu es capable d'écrire un script python qui traite un fichier, mais tu ne sais pas y insérer une boucle pour en traiter plusieurs ?! 8O

    tu as fait le plus difficile; l'insertion d'une boucle dans un programme python me parait trivial.
    mais je ne fait pas de python. :/

    et puis
    find
    pour trouver des fichiers dans le répertoire courant est inutile.
    0
  4. pasletempsdetrouverunpseudo Messages postés 4 Statut Membre
     
    lEprofSonDkon, pour être honnête, j'ai d'abord commencé par essayer de le faire sur python, mais je suis tombé sur des problèmes "étonnants" qui m'ont fait me décider à l'écrire plutôt en script shell. Et à présent, le script fait littéralement 3 lignes donc je suis persuadé que c'est vraiment un problème encore plus trivial qu'en python... J'aimerais vraiment y arriver en script shell... Mais en effet si j'échoue encore je réessaierai avec python.
    0
    1. lEprofSonDkon Messages postés 227 Statut Membre 13
       
      je suis tombé sur des problèmes "étonnants"

      tu peux développer, stp.
      0
    2. pasletempsdetrouverunpseudo Messages postés 4 Statut Membre
       
      Bon finalement je me suis remis "la tête dans le python". J'ai fait autrement et j'y suis parvenu. J'aurais aimé y arriver en script shell aussi mais bon, quand ça veut pas, ça veut pas...

      Merci à tous !
      0
      1. lEprofSonDkon Messages postés 227 Statut Membre 13 > pasletempsdetrouverunpseudo Messages postés 4 Statut Membre
         
        c'est pourtant tout bête en shell :
        for f in /monRepertoire/NOEUD*.dat; do test -f "$f" && echo monPRg.py "$f"; done

        mais j'insiste, il vaut mieux le faire dans le script python.
        0
    3. trauqnej Messages postés 162 Statut Membre 23
       
      pour ton problème, il faut mettre $fichier dans ta boucle
      do
      python3 mon_prgm.py fichier
      done

      Parce que tu cherches tous les fichiers ayant pour nom NOEUD*.dat.
      donc "fichier" est une variable.
      Et les variable sont "rappeler" avec un dollar qui les précède.
      Trauqnej
      0
      1. lEprofSonDkon Messages postés 227 Statut Membre 13 > trauqnej Messages postés 162 Statut Membre
         
        ça ne suffira pas , il faudrait aussi que le
        find
        soit dans une Substitution de commandes
        mais c'est une mauvaise pratique de parser une substitution de commandes avec
        for
        .
        0