Partage
  • Partager sur Facebook
  • Partager sur Twitter

exécuter un script a partir d'un autre....

Sujet résolu
    14 septembre 2021 à 11:59:47

    Bonjour,

    La question sous sa forme la plus générale se résume à ceci/

    J'ai dans le même dossier deux scripts, script1.py et script2.py

    script1 doit contenir une commande qui impérativement doit accomplir les tâches suivantes :

    1- Lancer (executer) le script2.py

    2- Quitter le script1.py en fermant sa fenêtre

    3- Rendre actif le script2.py afin de s'en servir normalement

    et bien entendu, script2.py doit faire exactement 'opération inverse, c'est à dire lancer script1.py, l'exécuter et fermer la fenêtre du script2.py

    J'ai essayé la bibliothèque numpy ou la commande exec(open(script1.py).read()) et quelques autres encore mais jamais les conditions n'ont été remplies parfaitement.

    En passant d'un script à un autre il subsiste des traces du script quitté.

    Bien entendu, avant de quitter le script appelant, je sauve dans des fichiers les données voulues et j'ouvre ces fichiers dans le script appelé.

    Un squelette de commandes, me serait bien utile. Merci

    • Partager sur Facebook
    • Partager sur Twitter
      14 septembre 2021 à 12:24:46

      il suffit de faire "import script2", en faisant des fonctions propres

      -
      Edité par thelinekioubeur 14 septembre 2021 à 12:25:46

      • Partager sur Facebook
      • Partager sur Twitter
        14 septembre 2021 à 12:49:26

        azad2b a écrit:

        Bien entendu, avant de quitter le script appelant, je sauve dans des fichiers les données voulues et j'ouvre ces fichiers dans le script appelé.

         A mon avis, la sauvegarde des données par le script1, doit se faire avant le lancement du script2 (et réciproquement); il y a un risque que le script2 ouvre ces fichiers avant que le script1 n'ai fini d'enregistrer ces données.

        Sinon avec os.startfile("chemin du script"), ça devrait suffire (il faut bien sûr que python soit défini dans le PATH pour qu'un double-clic sur un script le lance.) et pour quitter, utiliser sys.exit()



        • Partager sur Facebook
        • Partager sur Twitter
          14 septembre 2021 à 14:46:14

          umfred a écrit:

           A mon avis, la sauvegarde des données par le script1, doit se faire avant le lancement du script2 (et réciproquement); il y a un risque que le script2 ouvre ces fichiers avant que le script1 n'ai fini d'enregistrer ces données.

          Sinon avec os.startfile("chemin du script"), ça devrait suffire (il faut bien sûr que python soit défini dans le PATH pour qu'un double-clic sur un script le lance.) et pour quitter, utiliser sys.exit()

          Merci de ta réponse, mais j'ai effectivement sauvé mes données avant le changement de script, d'ailleurs le problème, n'est pas à ce niveau. Mais mes scripts sont assez gros (plus de 70 fonctions et pas loin de 1500 lignes chacun et je ne peux pas me permettre d' encombrer le forum avec un exemple concret.

          Mais je viens d'écrire deux petits scripts qui devraient vous permettre de bien cerner mon problème. Et ceci en raison de la réponse de :

          thelinekioubeur a écrit:

          il suffit de faire "import script2", en faisant des fonctions propres

          Voici ces deux scripts qui bien entendu sont deux fichiers différents situés dans le répertoire du projet . Script1 s'exécute correctement, quand on ferme sa fenêtre avec la case de fermeture, comme attendu il lance script2 qui lui aussi tourne parfaitement, en le fermant, on relance script1... c'est merveilleux, et on pourrait s' attendre à ce que ces opérations se répètent indéfiniment ....  mais ce n'est pas le cas. Après trois fermeture de scripts consécutifs, tout s' arrête. Pourquoi ?


          #script1
          
          from tkinter import *
          fen1 = Tk()
          fen1.focus_force()
          fen1.title("script1")
          fen1.geometry("400x150")
          fen1.configure(bg="black")
          champ = Label(fen1, fg="cyan", bg="black", font=('courier', 16, 'bold'))
          champ.pack()
          champ.config(text="Dans statistiques !")
          
          
          fen1.mainloop()
          import script2
          
          # script 2
          from tkinter import *
          fen2 = Tk()
          fen2.focus_force()
          fen2.title("script2")
          fen2.geometry("400x150")
          fen2.configure(bg="black")
          champ = Label(fen2, fg="red", bg="black", font=('courier', 16, 'bold'))
          champ.pack()
          champ.config(text="Dans execution !")
          
          
          fen2.mainloop()
          import script1
          
          


          -
          Edité par azad2b 14 septembre 2021 à 14:52:37

          • Partager sur Facebook
          • Partager sur Twitter
            14 septembre 2021 à 14:53:49

            C'est presque la même chose, je ne comprend pas pourquoi tu fais deux script et pas une seule app tkinter avec deux pages qui alternent.

            Puis là si ça s'arrête c'est normal, pour ça que j'ai dis de faire des fonctions...

            Mais comme c'est du tkinter, il faut surtout faire des classes !

            -
            Edité par thelinekioubeur 14 septembre 2021 à 14:55:28

            • Partager sur Facebook
            • Partager sur Twitter
              14 septembre 2021 à 15:22:04

              thelinekioubeur a écrit:

              C'est presque la même chose, je ne comprend pas pourquoi tu fais deux script et pas une seule app tkinter avec deux pages qui alternent.

              Puis là si ça s'arrête c'est normal, pour ça que j'ai dis de faire des fonctions...

              Mais comme c'est du tkinter, il faut surtout faire des classes !

              -
              Edité par thelinekioubeur il y a 9 minutes


              OK, admettons la chose. Mais peux-tu m'expliquer pourquoi ces deux scripts qui sont littéralement enfantins ne s'exécutent-ils pas indéfiniment ?

              C'est la réponse que j'attends car mes différents essais ont tous conduit à la même 'punition' : tout s'interrompt après 3 fermetures consécutives, et sans aucun message d' erreur de l'interpréteur.

              Et en quoi l'usage de Classes changerait quelque chose à la question ?

              Avec cet exemple de deux petits scripts, peux-tu me donner un exemple fonctionnel, avec ou sans les Classes ?

              • Partager sur Facebook
              • Partager sur Twitter
                14 septembre 2021 à 15:25:07

                Parce qu'un module python n'est exécuté qu'une fois même si tu l'importe X fois.

                Tu peux avoir des comportements différents avec importlib mais c'est complètement inutile pour ton cas, voici ce que je propose :

                from tkinter import *
                
                
                class App(Tk):
                    def __init__(self, *args, **kwargs):
                        super().__init__(*args, **kwargs)
                        self.focus_force()
                        self.geometry("400x150")
                        self.configure(bg="black")
                        self.champ = Label(self, fg="red", bg="black", font=("courier", 16, "bold"))
                        self.champ.pack()
                        self.next_state = 1
                        self.switch_state()
                
                    def switch_state(self):
                        if self.next_state == 1:
                            self.title("script1")
                            self.champ.config(text="Dans statistiques !")
                            self.next_state = 2
                        else:
                            self.title("script2")
                            self.champ.config(text="Dans execution !")
                            self.next_state = 1
                
                    def destroy(self):
                        self.switch_state()
                
                
                fen = App()
                fen.mainloop()
                

                bon bien sûr la surcharge de destroy c'est un peu tricky, ça serait mieux de mettre un vrai bouton ...

                -
                Edité par thelinekioubeur 14 septembre 2021 à 15:25:24

                • Partager sur Facebook
                • Partager sur Twitter
                  14 septembre 2021 à 15:34:17

                  et ma proposition d'utiliser os.startfile ?

                  import os
                  import sys
                  print("Bonjour!")
                  input("valier pour continuer")
                  os.startfile("c:/temp/bye.py")
                  #input("valier pour continuer")
                  sys.exit()
                  
                  import os
                  import sys
                  print("bye")
                  c=input("valider pour quitter").lower()
                  if c!="q": #petite sécurité pour pouvoir quand même sortir^^
                      os.startfile("c:/temp/bonjour.py")
                  sys.exit()
                  




                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 septembre 2021 à 15:55:24

                    OK, c'est remarquable, et cela fonctionne très bien. Mais il faut que je te fasse un aveu : je ne pratique Python que depuis quelques mois. Et mon projet est assez corpulent, Je l'avais écris il y a très longtemps en ObjectiveC (le C++ d' Apple sur un Mac) et comme je connaissais bien la structure du programme, le transcrire en Python, m'a été assez simple. Et j'y suis parvenu sans trop de difficultés. Mais j'ai un autre aveu à te faire : j'ai 84 balais au compteur. Et me faire ingurgiter les souffrances intellectuelles qu'impose la POO sur Python me semble voué à l'échec . On ne peut pas être et avoir été, dit-on. J'ai l'opportunité de porter cette application sur un Raspberry, c'est pourquoi j'ai opté pour Python. Linux n'ayant pas la tools-box de MacOS, comme tu t'en doutes.

                    Mais, tout de même ton exemple va me servir car le C++ m'a un peu initié à la notion de Classes et j'arrive à en percevoir les tenants et les aboutissants. Merci donc mille fois pmerci pour ta réponse. Je ne marque pas le sujet comme résolu, car il n'est pas exclu que je puisse avoir besoin d' éclaircissements plus tard.et je t'en remercie par avance.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 septembre 2021 à 16:06:06

                      Ya pas d'age pour apprendre :)

                      Dans tous les cas pour faire du tkinter proprement c'est obligatoire de maîtriser les classes.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 septembre 2021 à 16:18:41

                        Hum... je reviens car je me suis aperçu qu'en fait tu avais fort habilement contourné le problème, ton script ne lance absolument pas alternativement deux scripts différents, Il se contente simplement de modifier l'affichage. Ce qu'un collégien de 10 ans un peu tricheur aurait trouvé tout seul. Et dire que ta méthode est quelque peu malhonnête est un doux euphémisme. Ma question reste donc actuellement sans réponse.

                        umfred a écrit:

                        et ma proposition d'utiliser os.startfile ?

                        import os
                        import sys
                        print("Bonjour!")
                        input("valier pour continuer")
                        os.startfile("c:/temp/bye.py")
                        #input("valier pour continuer")
                        sys.exit()
                        
                        import os
                        import sys
                        print("bye")
                        c=input("valider pour quitter").lower()
                        if c!="q": #petite sécurité pour pouvoir quand même sortir^^
                            os.startfile("c:/temp/bonjour.py")
                        sys.exit()
                        


                        Cela me semble plus honnête, je vais tester cela après l'avoir adapté à du Linux. Merci.



                        -
                        Edité par azad2b 14 septembre 2021 à 16:28:59

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 septembre 2021 à 16:28:35

                          Si tu commence à m'insulter on va pas être copain.

                          Commence plutôt par expliquer ton projet et dire pourquoi tu veux forcément faire des "scripts" différents.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 septembre 2021 à 18:01:44

                            azad2b a écrit:

                            Ma question reste donc actuellement sans réponse.

                            On vous a déjà indiqué que ce n'est pas comme çà qu'on écrit une application tkinter ou qu'on utilise des modules... Après si on se lance dans un truc de dépannage, sur que ça ne couvrira peut être pas tous vos besoins. Et si la solution de dépannage ne marche pas, il ne reste plus qu'à ouvrir un tuto.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 septembre 2021 à 18:09:00

                              Je ne souhaite qu'une chose. Je dispose de deux fichiers.py. Le premier peut lancer le second quand on le ferme avec sa  case de fermeture . Et ce second fichier va à son tour relancer le premier quand on clique sur sa case de fermeture. Et cela indéfiniment.

                              I only wish for one thing. I have two .py files. The first can launch the second when it is closed with its closed square.And this second file will in turn relaunch the first when you click on its close box. And this indefinitely.

                              Ich will nur eines. Ich habe zwei .py-Dateien. Der erste startet den zweiten, wenn er mit seiner geschlossenen Box geschlossen wird. Und die zweite Datei wird die erste neu starten, wenn Sie Ihr Fenster schließen. Und das immer wieder.

                              Et à tout hasard, dans ma lange maternelle, l' Arménien ....

                              Ես միայն մեկ բան եմ ուզում. Ես ունեմ երկու .py ֆայլ: Առաջինը գործարկում է երկրորդը, երբ փակվում է իր փակ տուփով: Եվ երկրորդ ֆայլը կվերագործարկվի առաջինը, երբ փակեք ձեր պատուհանը: Եվ սա բազմիցս:

                              Le pourquoi, n'a strictement rien à voir : c'est le comment qui m'intéresse . Si tu ne connais pas la réponse, alors ne réponds pas, Je pense qu'il y a ici des gens assez compétents pour me donner une réponse satisfaisante, ou pour le moins, m'expliquer pourquoi la chose serait impossible. Mes très affectueuses salutations.


                              -
                              Edité par azad2b 14 septembre 2021 à 18:10:40

                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 septembre 2021 à 18:09:44

                                Ha ces vieux grincheux ... j'ai également un aveu. J'ai moi-même dépassé le trois qquart de siècle et je suis aveugle.
                                Je me débrouille pas mal nom plus malgré 21 ans d'absence du domaine.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Le Tout est souvent plus grand que la somme de ses parties.

                                  14 septembre 2021 à 18:18:26

                                  La solution de thelinekioubeur n'est pas une "arnaque" elle montre un principe de fonctionnement à adapter (dans chaque état, faire ce que fait chaque script) et pas la solution (vu que nous n'avons pas tout ton long code et que l'on ne sait pas ce fait chacun de tes scripts).

                                  Mais la vrai question c'est pourquoi switcher d'un script à l'autre quand on en ferme un.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 septembre 2021 à 23:08:16

                                    @azad2b tu ne répond pas à la question.  Ce choix que tu fais de lancer deux scripts alternativement, si tu ne peux pas le justifier, tu ne dois pas le faire.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 septembre 2021 à 2:23:56

                                      Je ne connais pas le traitement des signaux de thread en Python.
                                      J'imagine un script qui appelle les deux autres dans des thread et qui vérifie le statut de chacun avant de lancer l'autre.
                                      Ça pourrait être dans une boucle infinie qui se brise s'il y a une erreur dans un des scripts.
                                      Il pourrait y avoir une pause entre les deux.
                                      Chaque script est responsable d'ouvrir et fermer ses fenêtres.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Le Tout est souvent plus grand que la somme de ses parties.

                                        15 septembre 2021 à 13:57:13

                                        Un script qui en appelle un autre qui rappelle le premier n'est pas une "bonne méthode" parce que les 2 scripts ne sont pas indépendants. Pour fabriquer ça "proprement", il faut introduire un "manager" et des interfaces.

                                        Au départ, il faut comprendre comment ça pourrait s'articuler côté tkinter, ce qui pourrait donner comme point de départ:

                                        import tkinter as tk
                                        
                                        def do_work(window, number, done):
                                            f = tk.Frame(window)
                                            tk.Label(f, text=number).pack()
                                            tk.Button(f, text='next', command=f.quit).pack()
                                            tk.Button(f, text='quit', command=lambda: (done.set(1), f.quit())).pack()
                                            return f
                                        
                                        root = tk.Tk()
                                        done = tk.BooleanVar(value=False)
                                        number = 0
                                        while True:
                                            f = do_work(root, number, done)
                                            f.pack()
                                            tk.mainloop()
                                            if done.get():
                                                break
                                            f.destroy()
                                            number += 1
                                         

                                        Après on peut pousser do_work dans un script/module et le tester indépendamment avec le test sur __name__ = '__main__' (et quelques petits changements dans le script précédent).

                                        import tkinter as tk
                                        
                                        def do_work(window, number, done):
                                            f = tk.Frame(window)
                                            tk.Label(f, text=number).pack()
                                            tk.Button(f, text='next', command=f.quit).pack()
                                            tk.Button(f, text='quit', command=lambda: (done.set(1), f.quit())).pack()
                                            return f
                                        
                                        if __name__ == '__main__':
                                            import sys
                                            
                                            if len(sys.argv) == 2:
                                                number = int(sys.argv[-1])
                                            else:
                                                number = 123
                                        
                                            root = tk.Tk()
                                            done = tk.BooleanVar(value=False)
                                        
                                            while True:
                                                f = do_work(root, number, done)
                                                f.pack()
                                                tk.mainloop()
                                                if done.get():
                                                    exit(1)
                                                f.destroy()
                                                number += 1
                                        

                                        On peut avoir une bonne raison pour créer un process pour y lancer des scripts indépendants: l'import conserve un tas de variables globales... faire le ménage pour qu'on puisse l'exécuter plusieurs fois en appelant une fonction peut être fastidieux.

                                        Dans ce cas, on peut remplacer le "manager" par:

                                        from subprocess import call
                                        
                                        number = 0
                                        while True:
                                            returncode = call([ 'py', 'script.py', str(number) ])
                                            if returncode:
                                                break
                                            number += number + 1
                                        

                                        Une fois qu'on a compris tout ça on peut éventuellement faire que les scripts s'appellent en flip-flop pourvu qu'on ajoute des arguments pour le lancer en mode indépendant et avoir une condition d'arrêt.




                                        -
                                        Edité par mps 15 septembre 2021 à 14:01:29

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        exécuter un script a partir d'un autre....

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown