# Autres langages > Python > GUI >  Attendre la fermeture d'une fentre

## nikaulas

Bonjour,

Voici mon problme j'ai un programme qui se droule correctement seulement a un moment j'utilise la commande subprocess.Popen pour ouvrir MATLAB dans une autre fentre afin d'excuter un script et j'aimerais attendre que le matlab ait fini de sexcuter avant de passer  l'instruction suivante.



```
subprocess.Popen('MATLAB.bat -minimize -sd "chemin-ou-se-trouve-mon-script" -r "PARAM=750 monscript;")
```

Jusqu maintenant j'utilisais une tempo de 10s



```
time.sleep(10)
```

Cela tait suffisant pour lexcution de mon script seulement aujourd'hui le script peut parfois prendre beaucoup plus de temps a s'xcuter ma tempo n'est donc pas suffisante et mon code continue de sexcuter alors que le script matlab n'est pas termin.
De la mme manire que subprocess.Popen permet d'ouvrir une fentre, existe t-il une mthode permettant d'attendre la fermeture d'une fentre ou bien d'un processus (connu bien videmment).

En vous remerciant d'avance,

----------


## VinsS

Salut,

Est-ce que Matlab retourne quelque chose, sinon, si le script Matlab est le tien, est-ce que tu peux lui faire retourner quelque chose ?

Auquel cas, essaye toujours ceci:


```

```

et regarde ce qui est retourn.

----------


## deusyss

Je dis peut etre une betise, mais de memoire il n'y a pas quelque chose du genre



```
proc.communicate()
```

qui pourrait remplacer ta boucle While VinsS?

----------


## VinsS

Si mais communicate balance tout  la fin du process et on reste devant la question du "quand ?".

Mais en le mettant en fin de commande python attendra la fin du process avant de retourner et a peut aussi convenir dans ce cas ci.

Donc, comme ceci


```

```

Mon code sert surtout  couter ce que raconte le process au fur et  mesure.

----------


## nikaulas

Merci VinsS, pour le script matlab oui il est de moi mais je ne comprend pas ce que tu veux dire par est-ce qu'il renvoie quelque chose.
Il ne communique pas avec python il exploite seulement des fichier pour gnrer un fichier de rsultat qui plus tard est exploit par le script python



```

```

Je suppose que ret est une variable retourn par matlab il suffit donc qu'a la fin de mon script matlab je termine par une variable end qui passerait a 1  la fin de mon script c'est ca ?

En essayant ta mthode je me retrouve avec cette erreur :



```

```

Pour ce test mon script Python la est assez simpliste :



```

```

Et le script matlab encore plus simple c'est juste pour voir si il passe a l'instruction suivante une fois le script ferme



```

```

Ici je voudrais que mon script python passe a l'instruction suviante (print 'Matlab est correctement ferme') seulement lorsque le programme matlab sera ferme (donc pythonend sera gal  1)
Je n'arrive pas a utiliser l'instruction suivante



```
proc.stdout.readline()
```

Je prcise que je suis en version 2.7 et que je suis sous windows

----------


## VinsS

Au temps pour moi, c'est "universal_newlines" au pluriel.

En fait oui si ton script retourne n'importe quoi, c'est bon.

Mais essaye toujours mon script parce que "proc.poll() != None" est aussi un indicateur de fin de tche. Ce qui revient au mme pour toi.

----------


## wiztricks

Salut,




> Voici mon problme j'ai un programme qui se droule correctement seulement a un moment j'utilise la commande subprocess.Popen pour ouvrir MATLAB dans une autre fentre afin d'excuter un script et j'aimerais attendre que le matlab ait fini de sexcuter avant de passer  l'instruction suivante.


Pourquoi ne pas utiliser subprocess.call?

Popen existe pour vous permettre de raliser d'autres cas d'utilisation.
C'est compliqu  faire marcher.

- W

----------


## nikaulas

Avec universal newlines j'ai maintenant une erreur qui me dit que mon fichier est introuvable 



```

```

alors que pourtant il existe bien et se lance parfaitement avec cette commande :



```
proc = subprocess.Popen('MATLAB.bat -minimize -sd "chemin-ou-se-trouve-mon-script" -r "addpath ..\PROGRAMMES; test;"')
```

@wiztricks : J'ai exactement le mme rsultat avec subprocess.call qu'avec subprocess.popen :/

----------


## VinsS

Ta liste d'arguments n'est pas bonne, c'est comme ceci:


```

```

Il ne faut pas modifier mes guillemets ni en rajouter.

----------


## nikaulas

Je viens de tester effectivement le programme se lance correctement cette fois mais par contre impossible de recuprer la valeur de ret

lorsque je regarde ret = proc.stdout.readline() j'obtiens ce rsultat :  ' '

J'ai utilis le script suivant :



```

```

----------


## VinsS

Et l'instant ou tu as ce print '' ce n'est pas au moment ou le script se termine ?

Si j'ai bien compris c'est ce que tu as besoin de savoir.

----------


## nikaulas

Non mon print 'Matlab est correctement ferme' s'affiche avant mme que MATLAB n'ait eu le temps de s'ouvrir c'est justement le problme je passe  l'instruction suivante malgr la boucle :/

----------


## wiztricks

> @wiztricks : J'ai exactement le mme rsultat avec subprocess.call qu'avec subprocess.popen :/


Initialement votre problme tait que time.sleep n'tait pas assez long, mais la commande fonctionnait.
Si vous voulez absolument garder l'appel  subprocess.Popen, il suffisait de remplacer le time.sleep par un .wait:


```

```

Ecrire:


```
>>> subprocess.call('*** vous changez rien ***')
```

et t encore plus simple.

- W

----------


## nikaulas

> Initialement votre problme tait que time.sleep n'tait pas assez long, mais la commande fonctionnait.
> Si vous voulez absolument garder l'appel  subprocess.Popen, il suffisait de remplacer le time.sleep par un .wait:
> 
> 
> ```
> 
> ```
> 
> Ecrire:
> ...


wiztricks le problme est que mme avec subprocess.call ou ce code :



```

```

Mon programme python passe  l'instruction suivante alors que le script MATLAB n'a pas fini de s'xcuter, pire encore MATLAB n'a mme pas le temps de se lancer... que le print apparat

Voici mon petit script de test, seulement le print s'affiche toujours avant que le proc n'ait fini de s'xcuter, je n'arrive  retarder son affichage qu'avec un time.sleep :/



```

```

EDIT :

J'ai finalement trouv une faon de faire,  la fin mon fichier matlab doit gnrer un fichier result.txt donc avant de lancer mon process je verifie si il existe et si oui je l'efface puis j'attend que le fichier soit gener voici mon code :



```

```

Merci de votre aide en tout cas problme rsolu  ::mrgreen::

----------


## wiztricks

Salut,

Le test confirme que le process qui a excut le .BAT a lanc un autre process.
Lorsque le process qui excute le .BAT se termine, l'autre process continue.
Si vous ne mettez pas un "wait" (et le comment dpend de MATLAB) dans le .BAT, Python ne pourra rien faire pour vous.

Je viens de lire votre EDIT.
C'est un bricolage astucieux pour rcuprer ltat de l'autre process.
Que se passera-t-il s'il se vautre? S'il sort sans crer le fichier attendu... vous allez attendre longtemps.

- W

----------


## nikaulas

> Salut,
> 
> Le test confirme que le process qui a excut le .BAT a lanc un autre process.
> Lorsque le process qui excute le .BAT se termine, l'autre process continue.
> Si vous ne mettez pas un "wait" (et le comment dpend de MATLAB) dans le .BAT, Python ne pourra rien faire pour vous.
> - W


Oui mais le test ne me dit pas si le process lanc est toujours en cours d'xcution c'est ca le problme :/




> Je viens de lire votre EDIT.
> C'est un bricolage astucieux pour rcuprer ltat de l'autre process.
> Que se passera-t-il s'il se vautre? S'il sort sans crer le fichier attendu... vous allez attendre longtemps.
> 
> - W


Effectivement en cas de problme du ct du script MATLAB mon programme restera bloqu dans le whille un petit moment je vais rajouter un compteur qui au bout d'un certain nombre permettra aussi de sortir de la boucle qui s'incrmentera de 1 chaque seconde 
En tt cas merci pour votre aide

----------

