Devoir attendre après avoir écrit dans un fichier ?

Le
Méta-MCI \(MVP\)
Bonjour

Voici un extrait de mon code :

open(thefichier,"wb").write(dataorig)
time.sleep(0.5)
os.system('the\the.exe '+thefichier)


Telle quel, ça fonctionne. Grâce à la ligne "time.sleep(0.5)".
J'ai passé (perdu) deux jours avant de trouver que cette attente était
nécessaire.

Sans elle, ça a l'air de marcher, sauf que la fenêtre du logiciel lancé
(the.exe) n'avait jamais le focus !!!??? Et, même en cliquant dedans,
ça n'allait pas. Il fallait d'abord cliquer sur la fenêtre du script
Python (la mettre au premier-plan), puis cliquer ensuite sur la fenêtre
de the.exe

J'ai essayé avec d'autres alternatives que os.system, notamment :
startfile, spawnX, execlX, subprocess ; en forçant l'interpréteur de
commande ("cmd /c"), en forçant un nouveau processus ('start "" ')
; en combinant tout ça, sans succès.

Et puis, par hasard, j'ai trouvé que time.sleep() réglait le problème.

Quelqu'un aurait-il une idée du pourquoi ?

@+
--
Michel Claveau



PS : j'ai encore une config où c'est reproductible à volonté.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
PIGUET Bruno
Le #17371791
Le Mon, 29 Sep 2008 13:30:32 +0200, Méta-MCI (MVP) a écrit :

Voici un extrait de mon code :
...
open(thefichier,"wb").write(dataorig) time.sleep(0.5)
os.system('the\the.exe '+thefichier) ...

Telle quel, ça fonctionne. Grâce à la ligne "time.sleep(0.5)".



et avec un close() explicite ?
Du genre :
f = open (thefichier, "wb")
f.write (dataorig)
f.close ()
os.system ('the\the.exe '+thefichier) ...

Bruno.
William Dode
Le #17371601
On 29-09-2008, Méta-MCI (MVP) wrote:
Bonjour

Voici un extrait de mon code :
...
open(thefichier,"wb").write(dataorig)
time.sleep(0.5)
os.system('the\the.exe '+thefichier)
...



As tu essayé de faire un close entre les deux ?
f=open(thefichier...
f.write...
f.close()

--
William Dodé - http://flibuste.net
Informaticien Indépendant
David
Le #17373241
> et avec un close() explicite ?
Du genre :
f = open (thefichier, "wb")
f.write (dataorig)
f.close ()
os.system ('the\the.exe '+thefichier) ...



+1

Je ne sais pas en Python, mais dans d'autres langages, il n'est pas
recommandé de laisser des fichiers "ouvert" si une autre appli peut y
accéder en même temps.
Pierre Maurette
Le #17373341
David, le 29/09/2008 a écrit :
et avec un close() explicite ?
Du genre :
f = open (thefichier, "wb")
f.write (dataorig)
f.close ()
os.system ('the\the.exe '+thefichier) ...



+1

Je ne sais pas en Python, mais dans d'autres langages, il n'est pas
recommandé de laisser des fichiers "ouvert" si une autre appli peut y
accéder en même temps.



Il me semble que dans ce cas, c'est plutôt un problème de balayette,
qui va rendre effective l'écriture et fermer f en le détruisant.
Intuitivement, un truc comme ça devrait peut-être marcher:

def ecrire(thefichier, dataorig):
open (thefichier, "wb").write (dataorig)

ecrire(thefichier, dataorig)
os.system ('the\the.exe '+thefichier) ...

(parfaitement inutile par rapport à close(), bien entendu.

--
Pierre Maurette
Bruno Desthuilliers
Le #17375721
Pierre Maurette a écrit :
(snip)
>
Il me semble que dans ce cas, c'est plutôt un problème de balayette, qui
va rendre effective l'écriture et fermer f en le détruisant.
Intuitivement, un truc comme ça devrait peut-être marcher:

def ecrire(thefichier, dataorig):
open (thefichier, "wb").write (dataorig)



Attention, la libération de la ressource fichier (au niveau système) sur
destruction de l'objet n'est pas garantie pour toutes les
implémentations de Python. Il est hautement recommandé d'utiliser un
appel explicite à file.close.
Méta-MCI \(MVP\)
Le #17380761
Bonjour !

Réponse globale à tout le monde.

Le problème n'est pas lié au close, car le contenu du fichier écrit est
toujours récupéré entièrement par le programme extérieur (the.exe).

Néanmoins, j'ai testé. Et, un close() explicite n'a rien changé.

L'idée de Pierre Maurette m'a suggéré plein de tests, en mettant dans
des fonctions une partie ou l'autre du code. Mais, sans plus de
résultats.

Il semblerait que Python traite ses instructions à toute allure, sans
laisser le temps à l'OS de souffler (en l'occurrence, de mettre en place
les fenêtres et leur gestionnaire).
Du coup, j'ai tenté de déplacer le sleep, à l'intérieur de l'autre
programme. Après divers tâtonnements, ça marche, en mettant un
mini-sleep (*) après l'ouverture des contrôles, et avant la boucle de
gestion. Avec ça, une attente de 0.01 seconde suffit.

Conclusion :
- problème réglé
- pas vraiment un problème Python, mais plutôt dans l'interfaçage de
Python et de l'OS.

Merci de m'avoir lu, et d'avoir suggéré plein de choses intéressantes.

Michel Claveau



(*) à ceux qui, pour "mini-sleep" utilisaient les expressions "sleep
taille basse" ou "string", je répond qu'ils ont des problèmes avec des
types...
Mihamina Rakotomandimby
Le #17381301
Méta-MCI (MVP) wrote:

Du coup, j'ai tenté de déplacer le sleep, à l'intérieur de l'autre
programme. Après divers tâtonnements, ça marche, en mettant un
mini-sleep (*) après l'ouverture des contrôles, et avant la boucle de
gestion. Avec ça, une attente de 0.01 seconde suffit.


[...]
(*) à ceux qui, pour "mini-sleep" utilisaient les expressions "sleep
taille basse" ou "string", je répond qu'ils ont des problèmes avec des
types...



Ou les Bytes.

Suivi ailleurs.
Laurent Pointal
Le #17589661
[de retour après qq mois sans le Net à la maison... on s'en passe, mais
on se rend compte que ça peut être bien pratique]

Le Mon, 29 Sep 2008 13:30:32 +0200, Méta-MCI (MVP) a écrit :

Bonjour

Voici un extrait de mon code :
...
open(thefichier,"wb").write(dataorig) time.sleep(0.5)
os.system('the\the.exe '+thefichier) ...

Telle quel, ça fonctionne. Grâce à la ligne "time.sleep(0.5)". J'ai
passé (perdu) deux jours avant de trouver que cette attente était
nécessaire.

Sans elle, ça a l'air de marcher, sauf que la fenêtre du logiciel lancé
(the.exe) n'avait jamais le focus !!!??? Et, même en cliquant dedans,
ça n'allait pas. Il fallait d'abord cliquer sur la fenêtre du script
Python (la mettre au premier-plan), puis cliquer ensuite sur la fenêtre
de the.exe

J'ai essayé avec d'autres alternatives que os.system, notamment :
startfile, spawnX, execlX, subprocess ; en forçant l'interpréteur de
commande ("cmd /c..."), en forçant un nouveau processus ('start "" ...')
; en combinant tout ça, sans succès.

Et puis, par hasard, j'ai trouvé que time.sleep() réglait le problème.

Quelqu'un aurait-il une idée du pourquoi ?



Du pourquoi, aucune.

As-tu essayé:

f = open(thefichier,"wb")
f.write(dataorig)
f.flush() # S'assure que c'est bien sur disque.
f.close()
os.system('the\the.exe '+thefichier)



--
Laurent POINTAL -
Publicité
Poster une réponse
Anonyme