PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.python > Devoir attendre après avoir écrit dans un fichier ?
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Devoir attendre après avoir écrit dans un fichier ?

Réponse
 
LinkBack Outils de la discussion
Vieux 29/09/2008, 13h30   #1
Méta-MCI \(MVP\)
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Devoir attendre après avoir écrit dans un fichier ?

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


  Réponse avec citation
Vieux 29/09/2008, 14h02   #2
PIGUET Bruno
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Devoir attendre après avoir écrit dans unfichier ?

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.
  Réponse avec citation
Vieux 29/09/2008, 14h15   #3
William Dode
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Devoir attendre après avoirécrit dans un fichier ?

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
  Réponse avec citation
Vieux 29/09/2008, 16h33   #4
David
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Devoir attendre après avoir écrit dans un fichier ?


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

  Réponse avec citation
Vieux 29/09/2008, 17h11   #5
Pierre Maurette
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Devoir attendre après avoir écrit dans un fichier ?

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


  Réponse avec citation
Vieux 29/09/2008, 18h57   #6
Bruno Desthuilliers
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Devoir attendre après avoir écrit dans un fichier ?

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.

  Réponse avec citation
Vieux 30/09/2008, 11h51   #7
Méta-MCI \(MVP\)
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Devoir attendre après avoir écrit dans un fichier ?

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


  Réponse avec citation
Vieux 30/09/2008, 13h06   #8
Mihamina Rakotomandimby
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Devoir attendre après avoir écrit dans un fichier ?

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.
  Réponse avec citation
Vieux 20/10/2008, 17h55   #9
Laurent Pointal
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Devoir attendre après avoir écrit dans unfichier ?

[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
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 02h45.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,18096 seconds with 17 queries