Relance d'un script

Bonjour,
j’ai parfois besoin de relancer un script python (environnement virtuel). J’ai un bouton pour le faire avec la fonction suivante d’associée:

def rel():
	fen.quit()
	os.system("chemin_python"+__file__)

Y-a-t-il un moyen plus adéquat pour réaliser cela ?
Merci

Salut,

Je ne sais pas s’il y a vraiment une manière propre de le faire parce que ça me paraît être un cas d’usage assez sale, j’aurais tendance à faire en sorte de recharger les bons modules et laisser la boucle principale du programme tourner pour actualiser ce qui doit l’être.

Quoi qu’il en soit si je devais effectivement faire en sorte que le programme se relance de lui-même, je me tournerais plutôt vers le module subprocess pour instancier l’exécutable et j’utiliserais sys.executable / sys.argv pour ne pas avoir à entrer de chemin en dur ni dépendre du fichier courant :

import subprocess
import sys
import tkinter
import uuid


root = tkinter.Tk()


def relaunch():
    root.quit()
    subprocess.Popen([sys.executable, *sys.argv])


label = tkinter.Label(root, text=f"window {uuid.uuid4()}")
label.pack()
button = tkinter.Button(root, text="test", command=relaunch)
button.pack()

root.mainloop()

Je rebondis sur la réponse d’@entwanne

Pourquoi ? Ton besoin ressemble à un problème XY.

1 « J'aime »

Bonjour @entwanne,
je comprends que ma solution n’est pas top, mais je fais avec mes petits moyens techniques. Je vais étudier ta proposition et essayer de faire en sorte de ne pas avoir besoin de relancer le script, mais c’est plus compliqué pour moi à mettre en oeuvre.
et bonjour @mdk, je ne pensais pas que ma solution était la bonne mais je voulais avoir d’autres options pour essayer de les mettre en oeuvre. Je vais essayer de vous expliquer mes cas de figures pour être plus précis.
A bientôt si vous le voulez bien…
Mon premier script scrape des sites web pour récupérer la version de softs.
Parfois j’ai un problème d’accès malgré une temporisation, c’est pourquoi je relance le script.
Le code est le suivant:

try:
	page = requests.get(url,timeout=(20,20), headers=headers)
	if page.status_code == 200:
		soup = BeautifulSoup(page.content, "html.parser")
	...
	data = "NomSoft "+version)
except:
	data="Problème d'accès"

Pour le second script je dois pouvoir éviter le bouton de relance…
En tout cas merci à @entwanne pour son code dont j’ai découvert le fonctionnement à travers la commande ```
subprocess.Popen([sys.executable, *sys.argv])

BJR. J’imagine que du coup a chaques fois tu décharge/recharge des trucs inutilement… Franchement une boucle et un boleen qui serait sur True si faut arrêter la boucle + les conditions pour qu’il soit sur True ou False serait mieux j’imagine… Après si ca devais se lancer tout le temps un scipt batch ou shell pourrait suffire mais serait pas top si le racourcis CTRL+C fait relancer le truc… Bon courage.

J’ai utilisé la commande de @entwanne.

Merci

Dommage que tu n’aies pas trouvé de solution plus satisfaisante

Bonsoir, j’arrive âpres la fête et je vous demande par avance d’excuser le ton peut être sentencieux de mon message.

Mdk souleve un bon point, vous semblez souhaiter ajuster quelque chose de certes suffisant mais sous optimal pour résoudre votre problème racine.

Niveau outils : pour de l’instrumentaiton de navigateur, peut etre que playwright vous faciliteal le travail (et la gestion de l’authentificaiton).

Jeter un coup d’œil pour reesayer : https://stackoverflow.com/questions/50246304/using-python-decorators-to-retry-request

Ensuite il y a des outils simples comme watch https://linuxize.com/post/linux-watch-command/ qui permet de lancer une commande tout les n temps.

Mais aussi entr ou bien watchexec qui pourraient faire l’affaire.

Si la condition peut etre verifiée de facon automatque : `watch montruc.py`

""" montruc.py """
import os
from subprocess import run

if os.exists('tatat'):
   run([snip])

Le code est un peu abscond mais : je fais une sorte d’attente avec selenium (ou je while ture et sort en break ) peux etre que ce code pourra vous inspirer des choses, attention il est tres loin d’être parfait.

Bonjour @colin, mon besoin est plus simple. Mon premier problème était de récupérer les versions de logiciels sur leur site et j’y arrive maintenant sans être obligé de relancer mon script. Mon second problème est que quand il y a une nouvelle version d’un logiciel je remets à jour un document et que pour vérifier cette mise à jour je suis obligé de relancer le script.

La solution de @entwanne me convient pour réaliser cela (besoins perso et non professionnels) et je ne saurais pas trouver mieux vu mon niveau en python. Mais merci quand même pour ta réponse