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 !
A voir également:

4 réponses

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
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
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
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
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
lEprofSonDkon Messages postés 227 Statut Membre 13
 
je suis tombé sur des problèmes "étonnants"

tu peux développer, stp.
0
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
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
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
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