Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de synchro entre file() et os.system() sous linux

5 réponses
Avatar
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.

A+
jm

5 réponses

Avatar
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.

Avatar
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 ? ;)

Avatar
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('@')])"

Avatar
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

Avatar
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