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
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()
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 ?
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 ?
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()
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.
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.
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.
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.
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.
Le Tout est souvent plus grand que la somme de ses parties.
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.
@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.
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.
Le Tout est souvent plus grand que la somme de ses parties.
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
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.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.