|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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é. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
> 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. |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
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... |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#9 |
|
Messages: n/a
Hébergeur: |
[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 - laurent.pointal@laposte.net |
|
![]() |
| Outils de la discussion | |
|
|