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

Python Discussion :

executer deux script python en paralléle


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut executer deux script python en paralléle
    Bonjour à tous,
    Voilà dans mon script python, je lance un autre script ce qui fait que le 1er script se bloque et la fenêtre de mon interface devient blanche, comment faire pour executer le second script sans bloquer le 1er?

  2. #2
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    utilises des Thread peut être!

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    Je ne sais trop ce que vous appelez 'script': en python vous pouvez appeler des "callables" qui seront méthodes ou fonctions... appelons cela "toto".
    Si vous voulez que la chose qui appelle "toto" continue sa vie pendant que "toto" s'exécute, le plus simple est de l'exécuter en "asynchrone" via au choix:
    • popen: on exécute un script "externe",
    • threading.Thread: dans un contexte de thread,
    • multiprocessing.Process: dans un process séparé,

    Avec des threads, ca pourrait se passer ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import threading
    asy_toto = threading.Thread(target=toto, args=(1, 2, 3))
    Comme on suppose que 'toto' viendra livrer des résultats au "lanceur", il va falloir définir les callbacks (les points d'entrées, fonctions) que asy_toto devra appeler lorsqu'il aura terminé ou des informations à passer...
    Ca se complique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    asy_toto = threading.Thread(target=toto, args=(1, 2, 3), kwargs=dict(post=callback))
    Notez que j'ai nommé cela "post" car callback un callable de la forme:
    def callback(self, method, *args, **kwds) où il serait "bien" que:
    • self: soit la toplevel window ou autre widget qui ait accès à l'event loop
    • method: la méthode à appeler et le reste ses arguments.
    • *args, **kwds: les arguments à passer

    La raison de cela est que l'appelant est aussi une activité "asynchrone" qui a son propre contexte d'exécution. En appelant "method" directement depuis "toto", elle ne s'exécuterait pas dans le "bon" contexte et... cela induit parfois des corruptions mémoires... fatales pour le programme.

    Dans le cas général, "post" se contente de "poser" la requête dans une file d'attente que le destinataire "vide" lorsqu'il peut d'en occuper. Mais un GUI dispose déjà d'une file d'attente "utilisable".

    Avec Tkinter, les points d'entrées sont .after ou .after_idle...
    Le callback s'écrit alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def callback(self, method, *args, **kwds):
           self.after_idle(method, *args, **kwds)
    Bon ben y'a plus qu'à...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour ces clarifications,
    Je n'ai pas l habitude de manipuler les threads et le multiprocessing, disons que je veux lancer un autre programme python (simul.py) à partir de mon premier programme, je crois que simul.py necessite un process séparé, il devra entre autre modifier des fichiers texte que mon premier programme utilisera, avant celà j'utilisais un simple os.system("python simul.py"), mais la fenêtre de mon premier programme se bloquait, une autre remarque,simul.py utilise plus de 80% du CPU quand il s'execute, que pensez vous de tout ça?

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    j'ai finalment utilisé un process en utilisant Popen:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    proc= subprocess.Popen("python simul.py", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    Y'a t'il un moyen d'avoir le stdout dans un fichier text? et sans pour autant attendre que ce process se sermine pour que le 1er continue à s'éxecuter?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par amysuu Voir le message
    Merci beaucoup pour ces clarifications,
    Je n'ai pas l habitude de manipuler les threads et le multiprocessing, disons que je veux lancer un autre programme python (simul.py) à partir de mon premier programme, je crois que simul.py necessite un process séparé, il devra entre autre modifier des fichiers texte que mon premier programme utilisera, avant celà j'utilisais un simple os.system("python simul.py"), mais la fenêtre de mon premier programme se bloquait, une autre remarque,simul.py utilise plus de 80% du CPU quand il s'execute, que pensez vous de tout ça?
    Si vous avez plusieurs CPU (probable) et que simul.py bouffe 80% du CPU, il faudra le lancer dans un process séparé à cause de GIL - un truc Python qui dont le résultat est de sérialiser l'exécution des threads sur un seul CPU.

    Que fait le GUI sinon attendre la fin de simul?

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

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous avez plusieurs CPU (probable) et que simul.py bouffe 80% du CPU, il faudra le lancer dans un process séparé à cause de GIL - un truc Python qui dont le résultat est de sérialiser l'exécution des threads sur un seul CPU.

    Que fait le GUI sinon attendre la fin de simul?

    - W
    je ne comprends pas la question, il attendais la fin de simul.py pour continuer son execution, mais c'est réglé, en utilisant les subprocess (voir mon post précédent)

  8. #8
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Citation Envoyé par amysuu Voir le message
    Y'a t'il un moyen d'avoir le stdout dans un fichier text? et sans pour autant attendre que ce process se sermine pour que le 1er continue à s'éxecuter
    Oui, il suffit de lui en passer un ouvert en écriture, à la place de subprocess.PIPE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    file = open("chemin/vers/fichier", "+w")
    proc= subprocess.Popen("python simul.py", shell=True, stdout=file, stderr=subprocess.STDOUT)

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Oui, il suffit de lui en passer un ouvert en écriture, à la place de subprocess.PIPE :
    j'ai essayé celà mais ça ne marche pas, le fichier text est toujours vide, j'utilise python 2.6, y a t-il un rapport?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    je ne comprends pas la question, il attendais la fin de simul.py pour continuer son execution, mais c'est réglé, en utilisant les subprocess (voir mon post précédent)
    Je n'avais pas encore vu votre réponse.

    Sinon, il manque... .communicate ou un .wait genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import subprocess
    filename = 'toto.txt'
    with open(filename, 'w') as f:
             p = subprocess.Popen('ls',
                               shell=True,
                               stdout=f,
                               )
    p.wait()
     
    with open(filename, 'r') as f:
        print f.read()
    mais vous allez à priori retrouver le même soucis qu'avec os.system: çà attend la fin de l'exécution en bloquant le gui ;-(
    => si vous voulez faire un truc propre, il est préférable de mettre un thread entre le gui et l'exécution du popen. C'est préférable au sens "plus facile" à construire avec un "adaptateur" du gui qui lance une activité asynchrone qui le notifie lorsque c'est terminé. Puis vous pluggez l'activité asynchrone (popen) derrière.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Je n'avais pas encore vu votre réponse.

    Sinon, il manque... .communicate ou un .wait genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import subprocess
    filename = 'toto.txt'
    with open(filename, 'w') as f:
             p = subprocess.Popen('ls',
                               shell=True,
                               stdout=f,
                               )
    p.wait()
     
    with open(filename, 'r') as f:
        print f.read()
    mais vous allez à priori retrouver le même soucis qu'avec os.system: çà attend la fin de l'exécution en bloquant le gui ;-(
    => si vous voulez faire un truc propre, il est préférable de mettre un thread entre le gui et l'exécution du popen. C'est préférable au sens "plus facile" à construire avec un "adaptateur" du gui qui lance une activité asynchrone qui le notifie lorsque c'est terminé. Puis vous pluggez l'activité asynchrone (popen) derrière.
    - W
    Merci ça marche, et ceci même sans le p.wait() donc le gui ne se bloque pas, puis-je l'omettre? pour le thread je me documenterai en conséquent

  12. #12
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2011
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Résolu
    je vous propose ce livre tu peux trouver ton bonheur -|
    Voici le lien: [ame="http://www.megaupload.com/?d=AIT9Y7PX"]MEGAUPLOAD - The leading online storage and file delivery service[/ame]

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par amysuu Voir le message
    Merci ça marche, et ceci même sans le p.wait() donc le gui ne se bloque pas, puis-je l'omettre? pour le thread je me documenterai en conséquent
    Tout dépend de la richesse du dialogue entre le GUI et l'activité asynchrone.
    Ici, vous le limitez à regarder si le fichier de sortie est "prêt" en interrogeant l'état de l'activité via .pool.

    L'avantage des threads est de permettre de construire des interfaces plus génériques entre gui et activités asynchrones quelconques que vous spécialisez par la suite.

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

Discussions similaires

  1. [Débutant] Executer deux script en paralléle
    Par bus7air dans le forum MATLAB
    Réponses: 1
    Dernier message: 12/06/2012, 14h09
  2. Executer un script Python depuis un code C++
    Par Niak74 dans le forum C++
    Réponses: 4
    Dernier message: 02/02/2011, 10h19
  3. Réponses: 0
    Dernier message: 12/11/2009, 12h33
  4. Lancer plusieurs instances d'un script python en parallèle
    Par Valistar dans le forum Général Python
    Réponses: 1
    Dernier message: 21/04/2009, 20h13
  5. [Système] Executer un script python
    Par Analfabete dans le forum Langage
    Réponses: 1
    Dernier message: 08/06/2008, 08h22

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