Devoir attendre après avoir écrit dans un fichier ?
8 réponses
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é.
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
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.
> 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.
> 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.
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)
(parfaitement inutile par rapport à close(), bien entendu.
-- 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 ('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)
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)
(parfaitement inutile par rapport à close(), bien entendu.
-- Pierre Maurette
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.
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.
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\)
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...
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...
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
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.
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...
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
[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 -
[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)
[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)