Problème de synchro entre file() et os.system() sous linux
5 réponses
jean-michel bain-cornu
Bonjour,
Soit un script qui génère un fichier texte de paramètres
(/etc/postfix/virtual), puis lance une commande système (postmap) qui va
utiliser ce fichier pour travailler.
#!/usr/bin/python
import os,os.path
#import time
lst= ['adr1 adr2']
virtualFname= '/etc/postfix/virtual'
f= file(virtualFname,'w+')
for line in lst:
f.write(line.strip()+'\n')
f.close
# les 2 lignes suivantes sont inutiles à priori
del f
vlines= file(virtualFname,'r').readlines()
#time.sleep(1)
os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del
f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne
relis pas le fichier après l'avoir écrit, la commande postmap ne trouve
*rien* dans le fichier.
Le fonctionnement est également correct (mais avec un temps de réponse)
si je met 'time.sleep(1)' à la place de ('del
f','vlines=file(virtualFname,'r').readlines()').
J'ai déjà rencontré un pb similaire sous windows, ce ne me paraît donc
pas spécifique à linux.
Si quelqu'un a une autre solution que de relire le fichier après l'avoir
écrit, je suis preneur.
C'est testé en Python 2.4.2, Linux 2.4.32 (debian sarge). La version de
postfix est sans importance, on reproduit aussi bien avec une commande cat.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jacques Pronchery
Bonjour,
Soit un script qui génère un fichier texte de paramètres (/etc/postfix/virtual), puis lance une commande système (postmap) qui va utiliser ce fichier pour travailler.
#!/usr/bin/python import os,os.path #import time lst= ['adr1 adr2'] virtualFname= '/etc/postfix/virtual' f= file(virtualFname,'w+') for line in lst: f.write(line.strip()+'n') f.close # les 2 lignes suivantes sont inutiles à priori del f vlines= file(virtualFname,'r').readlines() #time.sleep(1) os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne relis pas le fichier après l'avoir écrit, la commande postmap ne trouve *rien* dans le fichier. Le fonctionnement est également correct (mais avec un temps de réponse) si je met 'time.sleep(1)' à la place de ('del f','vlines=file(virtualFname,'r').readlines()'). J'ai déjà rencontré un pb similaire sous windows, ce ne me paraît donc pas spécifique à linux.
Si quelqu'un a une autre solution que de relire le fichier après l'avoir écrit, je suis preneur. C'est testé en Python 2.4.2, Linux 2.4.32 (debian sarge). La version de postfix est sans importance, on reproduit aussi bien avec une commande cat.
A+ jm
Bonjour,
As-tu essayé de vider le tampon avec f.flush() avant de fermer le fichier avec f.close() ?
Jacques.
Bonjour,
Soit un script qui génère un fichier texte de paramètres
(/etc/postfix/virtual), puis lance une commande système (postmap) qui va
utiliser ce fichier pour travailler.
#!/usr/bin/python
import os,os.path
#import time
lst= ['adr1 adr2']
virtualFname= '/etc/postfix/virtual'
f= file(virtualFname,'w+')
for line in lst:
f.write(line.strip()+'n')
f.close
# les 2 lignes suivantes sont inutiles à priori
del f
vlines= file(virtualFname,'r').readlines()
#time.sleep(1)
os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del
f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne
relis pas le fichier après l'avoir écrit, la commande postmap ne trouve
*rien* dans le fichier.
Le fonctionnement est également correct (mais avec un temps de réponse)
si je met 'time.sleep(1)' à la place de ('del
f','vlines=file(virtualFname,'r').readlines()').
J'ai déjà rencontré un pb similaire sous windows, ce ne me paraît donc
pas spécifique à linux.
Si quelqu'un a une autre solution que de relire le fichier après l'avoir
écrit, je suis preneur.
C'est testé en Python 2.4.2, Linux 2.4.32 (debian sarge). La version de
postfix est sans importance, on reproduit aussi bien avec une commande cat.
A+
jm
Bonjour,
As-tu essayé de vider le tampon avec f.flush()
avant de fermer le fichier avec f.close() ?
Soit un script qui génère un fichier texte de paramètres (/etc/postfix/virtual), puis lance une commande système (postmap) qui va utiliser ce fichier pour travailler.
#!/usr/bin/python import os,os.path #import time lst= ['adr1 adr2'] virtualFname= '/etc/postfix/virtual' f= file(virtualFname,'w+') for line in lst: f.write(line.strip()+'n') f.close # les 2 lignes suivantes sont inutiles à priori del f vlines= file(virtualFname,'r').readlines() #time.sleep(1) os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne relis pas le fichier après l'avoir écrit, la commande postmap ne trouve *rien* dans le fichier. Le fonctionnement est également correct (mais avec un temps de réponse) si je met 'time.sleep(1)' à la place de ('del f','vlines=file(virtualFname,'r').readlines()'). J'ai déjà rencontré un pb similaire sous windows, ce ne me paraît donc pas spécifique à linux.
Si quelqu'un a une autre solution que de relire le fichier après l'avoir écrit, je suis preneur. C'est testé en Python 2.4.2, Linux 2.4.32 (debian sarge). La version de postfix est sans importance, on reproduit aussi bien avec une commande cat.
A+ jm
Bonjour,
As-tu essayé de vider le tampon avec f.flush() avant de fermer le fichier avec f.close() ?
Jacques.
Christophe
Bonjour,
Soit un script qui génère un fichier texte de paramètres (/etc/postfix/virtual), puis lance une commande système (postmap) qui va utiliser ce fichier pour travailler.
#!/usr/bin/python import os,os.path #import time lst= ['adr1 adr2'] virtualFname= '/etc/postfix/virtual' f= file(virtualFname,'w+') for line in lst: f.write(line.strip()+'n') f.close # les 2 lignes suivantes sont inutiles à priori del f vlines= file(virtualFname,'r').readlines() #time.sleep(1) os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne relis pas le fichier après l'avoir écrit, la commande postmap ne trouve *rien* dans le fichier. Le fonctionnement est également correct (mais avec un temps de réponse) si je met 'time.sleep(1)' à la place de ('del f','vlines=file(virtualFname,'r').readlines()'). J'ai déjà rencontré un pb similaire sous windows, ce ne me paraît donc pas spécifique à linux.
Si quelqu'un a une autre solution que de relire le fichier après l'avoir écrit, je suis preneur. C'est testé en Python 2.4.2, Linux 2.4.32 (debian sarge). La version de postfix est sans importance, on reproduit aussi bien avec une commande cat.
A tu essaye de fermer le fichier avec f.close() plutot que de ne rien faire du tout en écrivant f.close sans les parenthèses ? ;)
Bonjour,
Soit un script qui génère un fichier texte de paramètres
(/etc/postfix/virtual), puis lance une commande système (postmap) qui va
utiliser ce fichier pour travailler.
#!/usr/bin/python
import os,os.path
#import time
lst= ['adr1 adr2']
virtualFname= '/etc/postfix/virtual'
f= file(virtualFname,'w+')
for line in lst:
f.write(line.strip()+'n')
f.close
# les 2 lignes suivantes sont inutiles à priori
del f
vlines= file(virtualFname,'r').readlines()
#time.sleep(1)
os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del
f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne
relis pas le fichier après l'avoir écrit, la commande postmap ne trouve
*rien* dans le fichier.
Le fonctionnement est également correct (mais avec un temps de réponse)
si je met 'time.sleep(1)' à la place de ('del
f','vlines=file(virtualFname,'r').readlines()').
J'ai déjà rencontré un pb similaire sous windows, ce ne me paraît donc
pas spécifique à linux.
Si quelqu'un a une autre solution que de relire le fichier après l'avoir
écrit, je suis preneur.
C'est testé en Python 2.4.2, Linux 2.4.32 (debian sarge). La version de
postfix est sans importance, on reproduit aussi bien avec une commande cat.
A tu essaye de fermer le fichier avec f.close() plutot que de ne rien
faire du tout en écrivant f.close sans les parenthèses ? ;)
Soit un script qui génère un fichier texte de paramètres (/etc/postfix/virtual), puis lance une commande système (postmap) qui va utiliser ce fichier pour travailler.
#!/usr/bin/python import os,os.path #import time lst= ['adr1 adr2'] virtualFname= '/etc/postfix/virtual' f= file(virtualFname,'w+') for line in lst: f.write(line.strip()+'n') f.close # les 2 lignes suivantes sont inutiles à priori del f vlines= file(virtualFname,'r').readlines() #time.sleep(1) os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne relis pas le fichier après l'avoir écrit, la commande postmap ne trouve *rien* dans le fichier. Le fonctionnement est également correct (mais avec un temps de réponse) si je met 'time.sleep(1)' à la place de ('del f','vlines=file(virtualFname,'r').readlines()'). J'ai déjà rencontré un pb similaire sous windows, ce ne me paraît donc pas spécifique à linux.
Si quelqu'un a une autre solution que de relire le fichier après l'avoir écrit, je suis preneur. C'est testé en Python 2.4.2, Linux 2.4.32 (debian sarge). La version de postfix est sans importance, on reproduit aussi bien avec une commande cat.
A tu essaye de fermer le fichier avec f.close() plutot que de ne rien faire du tout en écrivant f.close sans les parenthèses ? ;)
Bruno Desthuilliers
jean-michel bain-cornu wrote:
Bonjour,
Soit un script qui génère un fichier texte de paramètres (/etc/postfix/virtual), puis lance une commande système (postmap) qui va utiliser ce fichier pour travailler.
#!/usr/bin/python import os,os.path #import time lst= ['adr1 adr2'] virtualFname= '/etc/postfix/virtual' f= file(virtualFname,'w+') for line in lst: f.write(line.strip()+'n') f.close
Stop !
Il manque les parenthèses : f.close()
En Python, une fonction est un objet sur lequel on peut appliquer l'opérateur d'appel de fonction '()'. Si on n'applique pas l'opérateur, il ne se passe rien.
# les 2 lignes suivantes sont inutiles à priori del f vlines= file(virtualFname,'r').readlines() #time.sleep(1) os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne relis pas le fichier après l'avoir écrit, la commande postmap ne trouve *rien* dans le fichier.
En général, les entrées/sorties sont tamponnées. La fermeture du fichier qui provoque le vidage du tampon. En l'occurrence, la suppression de la référence à f et la réouverture du fichier en lecture forcent ce vidage (et donc l'écriture effective du fichier).
Si quelqu'un a une autre solution que de relire le fichier après l'avoir écrit, je suis preneur.
Fermer proprement le fichier devrait aider.
-- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in ''.split('@')])"
jean-michel bain-cornu wrote:
Bonjour,
Soit un script qui génère un fichier texte de paramètres
(/etc/postfix/virtual), puis lance une commande système (postmap) qui va
utiliser ce fichier pour travailler.
#!/usr/bin/python
import os,os.path
#import time
lst= ['adr1 adr2']
virtualFname= '/etc/postfix/virtual'
f= file(virtualFname,'w+')
for line in lst:
f.write(line.strip()+'n')
f.close
Stop !
Il manque les parenthèses :
f.close()
En Python, une fonction est un objet sur lequel on peut appliquer
l'opérateur d'appel de fonction '()'. Si on n'applique pas l'opérateur,
il ne se passe rien.
# les 2 lignes suivantes sont inutiles à priori
del f
vlines= file(virtualFname,'r').readlines()
#time.sleep(1)
os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del
f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne
relis pas le fichier après l'avoir écrit, la commande postmap ne trouve
*rien* dans le fichier.
En général, les entrées/sorties sont tamponnées. La fermeture du fichier
qui provoque le vidage du tampon. En l'occurrence, la suppression de la
référence à f et la réouverture du fichier en lecture forcent ce vidage
(et donc l'écriture effective du fichier).
Si quelqu'un a une autre solution que de relire le fichier après l'avoir
écrit, je suis preneur.
Fermer proprement le fichier devrait aider.
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb@xiludom.gro'.split('@')])"
Soit un script qui génère un fichier texte de paramètres (/etc/postfix/virtual), puis lance une commande système (postmap) qui va utiliser ce fichier pour travailler.
#!/usr/bin/python import os,os.path #import time lst= ['adr1 adr2'] virtualFname= '/etc/postfix/virtual' f= file(virtualFname,'w+') for line in lst: f.write(line.strip()+'n') f.close
Stop !
Il manque les parenthèses : f.close()
En Python, une fonction est un objet sur lequel on peut appliquer l'opérateur d'appel de fonction '()'. Si on n'applique pas l'opérateur, il ne se passe rien.
# les 2 lignes suivantes sont inutiles à priori del f vlines= file(virtualFname,'r').readlines() #time.sleep(1) os.system('/usr/sbin/postmap '+virtualFname)
Si je ne met pas les lignes ('del f','vlines=file(virtualFname,'r').readlines()'), autrement dit si je ne relis pas le fichier après l'avoir écrit, la commande postmap ne trouve *rien* dans le fichier.
En général, les entrées/sorties sont tamponnées. La fermeture du fichier qui provoque le vidage du tampon. En l'occurrence, la suppression de la référence à f et la réouverture du fichier en lecture forcent ce vidage (et donc l'écriture effective du fichier).
Si quelqu'un a une autre solution que de relire le fichier après l'avoir écrit, je suis preneur.
Fermer proprement le fichier devrait aider.
-- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in ''.split('@')])"
jean-michel bain-cornu
A tu essaye de fermer le fichier avec f.close() plutot que de ne rien faire du tout en écrivant f.close sans les parenthèses ? ;) Argl, touché !
Ce n'est pourtant pas la 1ère fois que je me fais avoir par celle-là. C'est beaucoup mieux, merci, et des baffes pour moi.
Cela amène une question : est-il vraiment utile que python ne fasse rien dans un cas comme ça ? Ne serait-il pas mieux que python affiche la référence de l'objet sur stdout, comme il le fait en interactif ?
A+ jm
A tu essaye de fermer le fichier avec f.close() plutot que de ne rien
faire du tout en écrivant f.close sans les parenthèses ? ;)
Argl, touché !
Ce n'est pourtant pas la 1ère fois que je me fais avoir par celle-là.
C'est beaucoup mieux, merci, et des baffes pour moi.
Cela amène une question : est-il vraiment utile que python ne fasse rien
dans un cas comme ça ? Ne serait-il pas mieux que python affiche la
référence de l'objet sur stdout, comme il le fait en interactif ?
A tu essaye de fermer le fichier avec f.close() plutot que de ne rien faire du tout en écrivant f.close sans les parenthèses ? ;) Argl, touché !
Ce n'est pourtant pas la 1ère fois que je me fais avoir par celle-là. C'est beaucoup mieux, merci, et des baffes pour moi.
Cela amène une question : est-il vraiment utile que python ne fasse rien dans un cas comme ça ? Ne serait-il pas mieux que python affiche la référence de l'objet sur stdout, comme il le fait en interactif ?
A+ jm
jean-michel bain-cornu
f.close
Stop !
Il manque les parenthèses : f.close()
En Python, une fonction est un objet sur lequel on peut appliquer l'opérateur d'appel de fonction '()'. Si on n'applique pas l'opérateur, il ne se passe rien.
Fermer proprement le fichier devrait aider.
Des baffes, ke jvous dis...
Merci jm
f.close
Stop !
Il manque les parenthèses :
f.close()
En Python, une fonction est un objet sur lequel on peut appliquer
l'opérateur d'appel de fonction '()'. Si on n'applique pas l'opérateur,
il ne se passe rien.
En Python, une fonction est un objet sur lequel on peut appliquer l'opérateur d'appel de fonction '()'. Si on n'applique pas l'opérateur, il ne se passe rien.