IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GUI Python Discussion :

Attendre la fermeture d'une fenêtre


Sujet :

GUI Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Points : 15
    Points
    15
    Par défaut Attendre la fermeture d'une fenêtre
    Bonjour,

    Voici mon problème j'ai un programme qui se déroule correctement seulement a un moment j'utilise la commande subprocess.Popen pour ouvrir MATLAB dans une autre fenêtre afin d'exécuter un script et j'aimerais attendre que le matlab ait fini de s’exécuter avant de passer à l'instruction suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.Popen('MATLAB.bat -minimize -sd "chemin-ou-se-trouve-mon-script" -r "PARAM=750 monscript;")
    Jusqu’à maintenant j'utilisais une tempo de 10s

    Cela était suffisant pour l’exécution de mon script seulement aujourd'hui le script peut parfois prendre beaucoup plus de temps a s'éxécuter ma tempo n'est donc pas suffisante et mon code continue de s’exécuter alors que le script matlab n'est pas terminé.
    De la même manière que subprocess.Popen permet d'ouvrir une fenêtre, existe t-il une méthode permettant d'attendre la fermeture d'une fenêtre ou bien d'un processus (connu bien évidemment).

    En vous remerciant d'avance,

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    proc = subprocess.Popen(["MATLAB.bat", "-minimize", "-sd", "chemin-ou-se-trouve-mon-script", 
                            "-r", "PARAM=750 monscript;"], universal_newline=True, 
                            stdout=subprocess.PIPE)
     
    while 1:
        ret = proc.stdout.readline()
        if type(ret) != str or ret == '' and proc.poll != None:
            break
        else:
            print ret
    et regarde ce qui est retourné.

  3. #3
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Je dis peut etre une betise, mais de memoire il n'y a pas quelque chose du genre

    qui pourrait remplacer ta boucle While VinsS?
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    proc = subprocess.Popen(["MATLAB.bat", "-minimize", "-sd", "chemin-ou-se-trouve-mon-script", 
                            "-r", "PARAM=750 monscript;"], universal_newline=True, 
                            stdout=subprocess.PIPE).communicate()
     
    return proc
    Mon code sert surtout à écouter ce que raconte le process au fur et à mesure.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    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 générer un fichier de résultat qui plus tard est exploité par le script python

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while 1:
        ret = proc.stdout.readline()
        if type(ret) != str or ret == '' and proc.poll != None:
            break
        else:
    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 méthode je me retrouve avec cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "F:\Users\BAUDE_N\REM\test.py", line 3, in <module>
        proc = subprocess.Popen(['MATLAB.bat -minimize -sd "chemin-ou-se-trouve-mon-script" -r "addpath ..\PROGRAMMES; test;"'], universal_newline=True,stdout=subprocess.PIPE)
    TypeError: __init__() got an unexpected keyword argument 'universal_newline'
    Pour ce test mon script Python la est assez simpliste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import subprocess
     
    proc = subprocess.Popen('MATLAB.bat -minimize -sd "chemin-ou-se-trouve-mon-script" -r "addpath ..\PROGRAMMES; test;"')
     
    print 'Matlab est correctement ferme'
    Et le script matlab encore plus simple c'est juste pour voir si il passe a l'instruction suivante une fois le script ferme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    toto = 0
    pythonend = 1
    pause(5)
    exit
    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

    Je précise que je suis en version 2.7 et que je suis sous windows

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    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 tâche. Ce qui revient au même pour toi.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Salut,

    Voici mon problème j'ai un programme qui se déroule correctement seulement a un moment j'utilise la commande subprocess.Popen pour ouvrir MATLAB dans une autre fenêtre afin d'exécuter un script et j'aimerais attendre que le matlab ait fini de s’exécuter avant de passer à l'instruction suivante.
    Pourquoi ne pas utiliser subprocess.call?

    Popen existe pour vous permettre de réaliser d'autres cas d'utilisation.
    C'est compliqué à faire marcher.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Avec universal newlines j'ai maintenant une erreur qui me dit que mon fichier est introuvable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "F:\Users\BAUDE_N\REM\test.py", line 4, in <module>
        proc = subprocess.Popen(['MATLAB.bat -minimize -sd "chemin-ou-se-trouve-mon-script" -r "addpath ..\PROGRAMMES; test;"'], universal_newlines=True,stdout=subprocess.PIPE)
      File "C:\Python27\lib\subprocess.py", line 709, in __init__
        errread, errwrite)
      File "C:\Python27\lib\subprocess.py", line 957, in _execute_child
        startupinfo)
    WindowsError: [Error 2] Le fichier spécifié est introuvable
    alors que pourtant il existe bien et se lance parfaitement avec cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc = subprocess.Popen('MATLAB.bat -minimize -sd "chemin-ou-se-trouve-mon-script" -r "addpath ..\PROGRAMMES; test;"')
    @wiztricks : J'ai exactement le même résultat avec subprocess.call qu'avec subprocess.popen :/

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Ta liste d'arguments n'est pas bonne, c'est comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ["MATLAB.bat", "-minimize", "-sd", "chemin-ou-se-trouve-mon-script", "-r", "PARAM=750 monscript;"]
    Il ne faut pas modifier mes guillemets ni en rajouter.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Je viens de tester effectivement le programme se lance correctement cette fois mais par contre impossible de recupérer la valeur de ret

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

    J'ai utilisé le script suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import subprocess
    proc = subprocess.Popen(["MATLAB.bat", "-minimize", "-sd", "chemin-ou-se-trouve-mon-script", "-r", "addpath ..\PROGRAMMES; test;"],universal_newlines=True,stdout=subprocess.PIPE)
     
    while 1:
        ret = proc.stdout.readline()
        if type(ret) != str or ret == '' and proc.poll != None:
            break
        else:
            print ret
     
    print 'Matlab est correctement ferme'

  11. #11
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    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.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Non mon print 'Matlab est correctement ferme' s'affiche avant même que MATLAB n'ait eu le temps de s'ouvrir c'est justement le problème je passe à l'instruction suivante malgré la boucle :/

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Citation Envoyé par nikaulas Voir le message
    @wiztricks : J'ai exactement le même résultat avec subprocess.call qu'avec subprocess.popen :/
    Initialement votre problème é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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> sp = subprocess.Popen('*** vous changez rien ***')
    >>> sp.wait()
    Ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> subprocess.call('*** vous changez rien ***')
    eût été encore plus simple.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Initialement votre problème é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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> sp = subprocess.Popen('*** vous changez rien ***')
    >>> sp.wait()
    Ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> subprocess.call('*** vous changez rien ***')
    eût été encore plus simple.

    - W
    wiztricks le problème est que même avec subprocess.call ou ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sp = subprocess.Popen('*** vous changez rien ***')
    sp.wait()
    Mon programme python passe à l'instruction suivante alors que le script MATLAB n'a pas fini de s'éxécuter, pire encore MATLAB n'a même pas le temps de se lancer... que le print apparaît

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import subprocess
     
    proc = subprocess.Popen(["MATLAB.bat", "-minimize", "-sd", "chemin-ou-se-trouve-mon-script", "-r", "script-matlab;"],universal_newlines=True,stdout=subprocess.PIPE)
    proc.wait()
    print 'Matlab est correctement ferme'
    EDIT :

    J'ai finalement trouvé une façon de faire, à la fin mon fichier matlab doit générer 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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import os
    import time
     
     
    def WAIT_MATLAB():
        path='result.txt'
        if os.path.exists(path) :
            os.remove(path)
     
        while not os.path.exists(path):
            print("Matlab en cours d'execution...")
            time.sleep(1)
        print("Matlab est correctement ferme. ")
     
     
    subprocess.Popen(["MATLAB.EXE", "-minimize", "-sd", "chemin-ou-se-trouve-mon-script", "-r", "monscript;"],universal_newlines=True,stdout=subprocess.PIPE)
    WAIT_MATLAB()
    Merci de votre aide en tout cas problème résolu

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Salut,

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

    Je viens de lire votre EDIT.
    C'est un bricolage astucieux pour récupérer l’état de l'autre process.
    Que se passera-t-il s'il se vautre? S'il sort sans créer le fichier attendu... vous allez attendre longtemps.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Le test confirme que le process qui a exécuté le .BAT a lancé un autre process.
    Lorsque le process qui exécute le .BAT se termine, l'autre process continue.
    Si vous ne mettez pas un "wait" (et le comment dépend 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'éxécution c'est ca le problème :/

    Citation Envoyé par wiztricks Voir le message
    Je viens de lire votre EDIT.
    C'est un bricolage astucieux pour récupérer l’état de l'autre process.
    Que se passera-t-il s'il se vautre? S'il sort sans créer le fichier attendu... vous allez attendre longtemps.

    - W
    Effectivement en cas de problème du côté 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'incrémentera de 1 chaque seconde
    En tt cas merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Attendre la fermeture d'une fenètre
    Par Sayanel01 dans le forum Scilab
    Réponses: 2
    Dernier message: 21/04/2015, 16h22
  2. Exécuter une action à la fermeture d'une fenêtre
    Par wwave dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 28/07/2005, 16h15
  3. Fermeture d'une fenêtre .dos
    Par VirginieGE dans le forum Windows
    Réponses: 2
    Dernier message: 03/06/2005, 14h56
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 10h46
  5. Arrêter un ttmt en cours, lors de la fermeture d'une fenêtre
    Par teska dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/12/2004, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo