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

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

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

8 réponses

Avatar
PIGUET Bruno
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('thethe.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 ('thethe.exe '+thefichier) ...

Bruno.
Avatar
William Dode
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('thethe.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
Avatar
David
> et avec un close() explicite ?
Du genre :
f = open (thefichier, "wb")
f.write (dataorig)
f.close ()
os.system ('thethe.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.
Avatar
Pierre Maurette
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 ('thethe.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 ('thethe.exe '+thefichier) ...

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

--
Pierre Maurette
Avatar
Bruno Desthuilliers
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.
Avatar
Méta-MCI \(MVP\)
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...
Avatar
Mihamina Rakotomandimby
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.
Avatar
Laurent Pointal
[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('thethe.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('thethe.exe '+thefichier)



--
Laurent POINTAL -