Menu

Lancer un programme python depuis un script shell

Messages postés
4
Date d'inscription
jeudi 9 mai 2019
Statut
Membre
Dernière intervention
10 mai 2019
- - Dernière réponse : lEprofSonDkon
Messages postés
163
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
20 mai 2019
- 10 mai 2019 à 18:54
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 !
Afficher la suite 

Votre réponse

4 réponses

Messages postés
1189
Date d'inscription
lundi 2 mai 2016
Statut
Membre
Dernière intervention
17 mai 2019
164
0
Merci
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…

Commenter la réponse de UnGnU
Messages postés
4
Date d'inscription
jeudi 9 mai 2019
Statut
Membre
Dernière intervention
10 mai 2019
0
Merci
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...
UnGnU
Messages postés
1189
Date d'inscription
lundi 2 mai 2016
Statut
Membre
Dernière intervention
17 mai 2019
164 -
Pas besoin de boucle, la commande
find
avec ses options (
exec
notamment) ou via un pipe vers la commande
xargs
, devrait suffire.
Commenter la réponse de pasletempsdetrouverunpseudo
Messages postés
163
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
20 mai 2019
6
0
Merci
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.
Commenter la réponse de lEprofSonDkon
Messages postés
4
Date d'inscription
jeudi 9 mai 2019
Statut
Membre
Dernière intervention
10 mai 2019
0
Merci
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.
lEprofSonDkon
Messages postés
163
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
20 mai 2019
6 -
je suis tombé sur des problèmes "étonnants"

tu peux développer, stp.
pasletempsdetrouverunpseudo
Messages postés
4
Date d'inscription
jeudi 9 mai 2019
Statut
Membre
Dernière intervention
10 mai 2019
-
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 !
lEprofSonDkon
Messages postés
163
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
20 mai 2019
6 > pasletempsdetrouverunpseudo
Messages postés
4
Date d'inscription
jeudi 9 mai 2019
Statut
Membre
Dernière intervention
10 mai 2019
-
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.
trauqnej
Messages postés
143
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
14 mai 2019
25 -
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
lEprofSonDkon
Messages postés
163
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
20 mai 2019
6 > trauqnej
Messages postés
143
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
14 mai 2019
-
ç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
.
Commenter la réponse de pasletempsdetrouverunpseudo