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 :

Agir si un script Python s'arrête.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Agir si un script Python s'arrête.
    Bonjour,
    je voulais savoir s'il était possible d'agir au moment où l'utilisateur ferme la console Python liée à un script.

  2. #2
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Le module atexit est peut-être ce que tu cherches.

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    La discussion n'est pas à mon niveau mais comme le sujet est sympa...

    atexit n'est qu'une solution lorsque le script se termine normalement (de même que trace_variable sous Tkinter et consorts).
    Dans le cadre d'un arrêt brusque (CTRL C, arrêt de python comme par un kill sous linux, etc...) je cherche encore. A mon niveau il ne me semble pas possible d'agir sur un code à partir de lui même.

    Une idée (sous linux mais le principe est là) :
    Toutefois si ce code lance un script indépendant en lui envoyant son pid en argv il est possible pour le script secondaire de vérifier si le script est actif/non actif mais pas terminé/non actif et terminé. Soit :


    Pour le script principal
    Lancement : Création du script secondaire et lui passe son pid en argv.
    Actif : traitement et pid actif.
    Planté : pas le temp de créer le fichier trace. pid n'existe plus et le fichier trace n'est pas créer.
    Fin du script : Création du fichier trace dans le temp.

    Pour le script secondaire
    Actif : le pid existe
    Non actif mais pas terminé : le pid n'existe plus mais le fichier trace de fin de script n'est pas crée. Relance du script et récup de son pid.
    Non actif et fini : le pid existe et le fichier trace aussi : je supprime le fichier trace et tout le monde quitte.


    Cela se complique si c'est pour un traitement, ce qui me semble est le cas. Dans ce cas la création d'un fichier avec le dernier élément traité ralenti énormément le code.

    Voili, une idée au passage...

    @+

  4. #4
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Je ne savais pas que atexit ne gèrait pas les exceptions. A vrai dire, je ne me suis jamais penché sur ce module, mais mnt que tu le dis, ça me parait un comportement assez logique.

    Il reste la solution du try/finally.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def main():
        # du code
     
    if __name__ == "__main__":
        try:
            main()
        finally:
            # Code de finalisation

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Bien vu le finally. Sur un ctrl c cela fonctionne.
    Par contre cela ne prend pas en compte une fermeture du shell (demande de rambc) ou un arrêt externe du script (kill/arrêt du processus).

    Je parle dans le cadre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def main():
        a = 0
        while a < 10000000000:
            a += 1
            print a
     
    if __name__ == "__main__":
        try:
            main()
        finally:
            open("/tmp/fichiertrace", "w").write('fin')
    Cela me semble un comportement normal. Dans le cadre d'un control c on demande l'arrêt du script et c'est intercepté. Les deux autres cas sont externes.

    Il ne reste donc plus que deux cas à gérer.

    Bonne journée.

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Je sais que ma solution est moche mais pour en finir avec mon pseudo qbasic et en complément de ce que je disais.

    Le script principal écrit le script de contrôle dans le temporaire, le lance et le détruit en fin de traitement.
    Le script de contrôle fais le vérification de fin normale sur sa propre présence.
    Après tout se passe au niveau pid/argv.

    Voila pour ce qui est du retour vers l'archéologie informatique et dans l'attente de lire une solution plus 'pro'.

    @+

    Petit edit explicatif :
    Pour le script de contrôle
    Si le pid existe et que le script de contrôle existe : fonctionnement normal
    Si le pid n'existe plus et que le script de contrôle existe : il y a plantage > relance du script principal avec argv et arrêt du script de contrôle (puisque relancé par le principal)
    Si le pid n'existe plus et le script non plus : fin

    Le fait de faire un remove sur le script de contrôle n'empêche pas son fonctionnement.

    @

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/04/2008, 20h07
  2. Réaliser un install pour un script python
    Par mcarluec dans le forum Déploiement/Installation
    Réponses: 13
    Dernier message: 15/04/2008, 08h14
  3. Accents Command Line depuis un script Python
    Par nicou50 dans le forum Général Python
    Réponses: 6
    Dernier message: 29/12/2006, 10h41
  4. Interpreter un script python dans un prog python
    Par romeo9423 dans le forum Général Python
    Réponses: 3
    Dernier message: 01/12/2005, 16h16
  5. Réponses: 3
    Dernier message: 05/04/2005, 14h26

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