OVH Cloud OVH Cloud

variable dans for in

11 réponses
Avatar
Etienne Marache
Bonjour,

ma question est surement très naïve pour les utilisateurs de python
et les informaticiens: lorsque j'essaie le programme suivant où
monprogramme est un script bash personnel prenant un argument

import os

fichier = open('monfichier','r')
for d in fichier.readlines():
os.system("monprogramme d")

file.close

d n'est pas remplacé par la ligne.

Merci d'avance pour une réponse ou une référence où je pourrais trouver
ce genre de chose.

Etienne

10 réponses

1 2
Avatar
MCI
Bonjour !

.readlines() Lit TOUTES les lignes du fichier...

Peut-être que l'utilisation de .readline() (sans le 'S' final)
fonctionnera selon tes besoins...


@-salutations

Michel Claveau
Avatar
Etienne Marache
"MCI" writes:

Bonjour !

.readlines() Lit TOUTES les lignes du fichier...

Peut-être que l'utilisation de .readline() (sans le 'S' final)
fonctionnera selon tes besoins...


Merci pour la réponse mais le problème c'est le remplacement du d par

une ligne qui ne se fait pas.

Etienne

Avatar
Bruno Piguet

import os

fichier = open('monfichier','r')
for d in fichier.readlines():
os.system("monprogramme d")

file.close

d n'est pas remplacé par la ligne.

Merci d'avance pour une réponse ou une référence où je pourrais trouver
ce genre de chose.

parce que que c'est toujours la même chaîne de caractère :

"monprogramme d"

essayer "monprogramme "+d
ou
"monprogramme %s" % d

Bruno.

Avatar
Méta-MCI
Re !

Effectivement, je ne devais pas être bien réveillé.
J'ai répondu un peu n'importe quoi.

Bruno, lui, qui est sans doute un "levé comme les poules", a bien mieux
réagit....

@+

MCI
Avatar
Etienne Marache
Bruno Piguet writes:


import os
fichier = open('monfichier','r')
for d in fichier.readlines():
os.system("monprogramme d")
file.close
d n'est pas remplacé par la ligne.
Merci d'avance pour une réponse ou une référence où je pourrais
trouver
ce genre de chose.

parce que que c'est toujours la même chaîne de caractère :

"monprogramme d"

essayer "monprogramme "+d
ou
"monprogramme %s" % d

Bruno.


Merci beaucoup

os.system("monprogramme "+d)
et
os.system("monprogramme %s" % d)

marchent

c'est clairement un problème de d'expansion, il faut que le d soit
remplacé avant la lecture par os.system. Si je comprends bien les
guillemets bloquent l'évaluation du d et sinon les opérations sur les
chaînes sont effectuées avant l'exécution de la commande. Je suppose que
c'est un principe dans python de traiter les paramètres avant de les
passer à la commande.

Je comprends la première solution. La seconde est mystérieuse pour moi
mais je vais essayer de voir dans la doc.

J'ai une autre solution: réécrire le script en python! Cela me fera un
bon exercice.

Etienne


Avatar
Bruno Desthuilliers
Bonjour,

ma question est surement très naïve pour les utilisateurs de python
et les informaticiens: lorsque j'essaie le programme suivant où
monprogramme est un script bash personnel prenant un argument

import os

fichier = open('monfichier','r')
for d in fichier.readlines():
os.system("monprogramme d")

file.close

d n'est pas remplacé par la ligne.


os.system("monprogramme %s" % d)


"monprogramme d" est une chaine littérale, la lettre 'd' n'y sera pas
remplacée par la valeur d'une variable de même nom - et c'est une bonne
chose... (hint : remplace 'monprogramme' par 'cd', et imagine ce que ça
donnerait)

Avatar
Bruno Desthuilliers
Bruno Piguet writes:



import os
fichier = open('monfichier','r')
for d in fichier.readlines():
os.system("monprogramme d")
file.close
d n'est pas remplacé par la ligne.
Merci d'avance pour une réponse ou une référence où je pourrais
trouver
ce genre de chose.



parce que que c'est toujours la même chaîne de caractère :
"monprogramme d"

essayer "monprogramme "+d
ou
"monprogramme %s" % d

Bruno.



Merci beaucoup

os.system("monprogramme "+d)
et
os.system("monprogramme %s" % d)

marchent

c'est clairement un problème de d'expansion, il faut que le d soit
remplacé avant la lecture par os.system.


Pour ce que tu veux faire, oui.

Si je comprends bien les
guillemets bloquent l'évaluation du d


Non. Les guillemets définissent une chaine littérale.

et sinon les opérations sur les
chaînes sont effectuées avant l'exécution de la commande.


Dans ton cas, s/exécution de la commande/appel de la fonction/.

En Python, une "commande" est quelque chose qui fait directement partie
du langage, comme par exemple print, def, class, etc... os.system() est
une fonction ('system') qui est définie dans le module 'os'.

Je suppose que
c'est un principe dans python de traiter les paramètres avant de les
passer à la commande.


s/commande/fonction/. Et c'est le cas dans la grande majorité des
langages de programmation : les paramètres sont évalués avant l'appel de
la fonction.

Je comprends la première solution. La seconde est mystérieuse pour moi
mais je vais essayer de voir dans la doc.


C'est du formatage de chaine, sur le principe du "printf" du C. Tu
trouvera des infos dans le tutoriel.


J'ai une autre solution: réécrire le script en python! Cela me fera un

bon exercice.


Why not ? Mais comprend bien que Python, quoi qu'on en dise, n'est pas
vraiment un programme "de script" - plutôt un langage de programmation
utilisable pour du script - et que certaines choses sont bien plus
simples à faire en script shell.



Avatar
Etienne Marache
Bruno Desthuilliers writes:

En Python, une "commande" est quelque chose qui fait directement
partie du langage, comme par exemple print, def, class,
etc... os.system() est une fonction ('system') qui est définie dans le
module 'os'.

Je suppose que
c'est un principe dans python de traiter les paramètres avant de les
passer à la commande.


s/commande/fonction/. Et c'est le cas dans la grande majorité des
langages de programmation : les paramètres sont évalués avant l'appel
de la fonction.

Je comprends la première solution. La seconde est mystérieuse pour moi
mais je vais essayer de voir dans la doc.


C'est du formatage de chaine, sur le principe du "printf" du C. Tu
trouvera des infos dans le tutoriel.


J'ai une autre solution: réécrire le script en python! Cela me fera un

bon exercice.


Why not ? Mais comprend bien que Python, quoi qu'on en dise, n'est pas
vraiment un programme "de script" - plutôt un langage de programmation
utilisable pour du script - et que certaines choses sont bien plus
simples à faire en script shell.


Merci pour toutes ces précisions, et je m'aperçois de la justesse de
cette dernière remarque, mon but est de faire des petits programmes
utilisant postgresql et latex (saisie de données, traitement puis
exploitation dans un document). Je pensais au départ faire un seul
programme python mais je commence à croire qu'il est plus pratique de
faire un script bash appelant un ou deux programme python et d'autres
commandes même si ça fait un peu salmigondis.

Etienne



Avatar
Bruno Desthuilliers
Bruno Desthuilliers writes:

(snip)

J'ai une autre solution: réécrire le script en python! Cela me fera un
bon exercice.


Why not ? Mais comprend bien que Python, quoi qu'on en dise, n'est pas
vraiment un programme "de script" - plutôt un langage de programmation
utilisable pour du script - et que certaines choses sont bien plus
simples à faire en script shell.



Merci pour toutes ces précisions, et je m'aperçois de la justesse de
cette dernière remarque, mon but est de faire des petits programmes
utilisant postgresql et latex (saisie de données, traitement puis
exploitation dans un document). Je pensais au départ faire un seul
programme python mais je commence à croire qu'il est plus pratique de
faire un script bash appelant un ou deux programme python et d'autres
commandes même si ça fait un peu salmigondis.


Regarde comment fonctionne un système unix, et tu auras moins de
scrupules. C'est même la philosophie d'unix : des programmes qui font
une seule chose (et la font bien), assemblés par des scripts shell.
L'intérêt d'un langage comme Python est de remplir l'espace entre le C
(bien pour des briques de bases, mais souvent de trop bas niveau pour la
logique applicative) et les scripts shell.

Bref, tant que ce qu'il y a faire est assez stupide^Msimple pour du
bash, pas de scrupules. Si ça commence à devenir trop compliqué, il sera
temps de songer à ré-implémenter l'affaire en Python.

Mes 2 centimes...



Avatar
BertrandB

Bref, tant que ce qu'il y a faire est assez stupide^Msimple pour du
bash, pas de scrupules. Si ça commence à devenir trop compliqué, il sera
temps de songer à ré-implémenter l'affaire en Python.

Mes 2 centimes...

Je dirais tant que ce que tu as faire est lisible en shell. Dès queça

devient tricky il vaut mieux passer à autre chose.
On peut faire des trucs monstrueux même en bourne shell. Un collègue
avait fait un rdbms avec SQL intégré. En bourne même pas en bash !

Remarque annexe vouloir utiliser Python à la place du shell peut donner
des trucs aussi crapouto jetez un oeuil sur setup.py dans les sources de
python.

1 2