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 :

Stopper un programme python en ligne de commande


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 38
    Points : 22
    Points
    22
    Par défaut Stopper un programme python en ligne de commande
    Bonjour,

    J'ai un programme python qui doit tourné tout le temps en boucle, j'ai donc un thread qui boucle sur une méthode dès que la procédure est terminé.
    Mais voila, j'aimerai pouvoir stopper le programme proprement, c'est à dire lorsqu'il a terminé la procédure par exemple en ligne de commande :
    monProgramme.py stop
    Ceci devrait appelé une fonction de mon programme déjà lancé.

    Est-il possible de réaliser cela avec python?
    Avec l'aide d'un cours Python ?

    Merci pour votre aide!

  2. #2
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Il me semble que le plus simple c'est encore le KeyboardInterrupt.
    Vous pouvez utiliser le CTRL-C de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def lanceprog():
        #le programme proprement dit.
     
    def exitprog():
        # Arret des thread et sortie propre (sys.exit(0) ?)
     
    try:
        print 'Utilisez Control-C pour finir'
        # Lancement des threads
        lanceprog()
    except KeyboardInterrupt:
        exitprog()
    Un exemple simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import sys
     
    def lanceprog():
        a = 0
        while a < 10000000000:
            a += 1
     
    def exitprog():
        sys.exit(0)
     
    try:
        print 'Utilisez Control-C pour finir'
        lanceprog()
    except KeyboardInterrupt:
        exitprog()
    Par contre pour ce que vous demandez (monProgramme.py stop) j'ai juste une idée :

    Si monProgramme.py est lancé sans argument (Voir sys.argv) il lance le thread ainsi que serveur en attente de communication.
    Si monProgramme.py est lancé avec un argument, ici 'stop', il se lance en mode client, se connecte au serveur s'il est présent puis lui envoie l'ordre de s'arrêter proprement avant de s'arrêter lui aussi.
    Pour la communication entre deux scripts vous avez une discussion sur le sujet ici
    La solution xmlrpclib que je reprend ici me semble la plus simple pour vous.

    Il existe sans aucun doute d'autres façons mais pour le moment je ne vois pas.

    Bon code
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Merci pour cette réponse très complète, je vais étudier tout ça et faire mon choix.

    Il y a quelque chose qui m'étonne sur l'utilisation du thread, normalement une fois le thread lancé je devrai avoir la main dans mon invite de commande? Car sous windows ce n'est pas le cas (le programme sera déployé sur linux).

    Voici comment je lance mon thread dans mon main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    appli = Application()
    a = threading.Thread(None, appli.start, None)
    a.start()

  4. #4
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par un_passant Voir le message
    Il y a quelque chose qui m'étonne sur l'utilisation du thread, normalement une fois le thread lancé je devrai avoir la main dans mon invite de commande? Car sous windows ce n'est pas le cas (le programme sera déployé sur linux).

    Voici comment je lance mon thread dans mon main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    appli = Application()
    a = threading.Thread(None, appli.start, None)
    a.start()
    Vous parlez bien de cmd.exe ?
    Vous lancez python.exe monProgramme.py ?
    Dans ce cas c'est normal, c'est python qui ne rend pas la main.

    Peut être devriez vous faire un autre sujet sur cette question (et faire une recherche sur les threads sur le forum).
    C'est plus lisible pour le forum et vous aurez plus de réponses.

    Bon code
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Alors je viens de tester votre première solution qui ne fonctionne pas si j'ai lancé mon programme avec un thread mais fonction sans. Pourquoi?

    Pour répondre à votre question, que je lance avec python programme.py, juste avec programme.py ou en cliquant sur l'icône l'invite de commande cmd reste sans me donner la main.

    J'ai peut être un problème avec mon thread qui pourtant fonctionne correctement.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Salut,

    Citation Envoyé par un_passant Voir le message
    Pour répondre à votre question, que je lance avec python programme.py, juste avec programme.py ou en cliquant sur l'icône l'invite de commande cmd reste sans me donner la main.(
    Un exemple pour illustrer ce que vous constatez et vos attentes serait le bienvenu. En fait, il est normal que vous n'ayez pas la main avant la fin du programme: les threads ne transforment pas votre programme en daemon ou service qui démarre et s'exécute indépendamment.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Je viens de résoudre ce problème en démarrant le thread avant le try et en mettant un while a.isAlive(): dans le try.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Citation Envoyé par un_passant Voir le message
    Je viens de résoudre ce problème en démarrant le thread avant le try et en mettant un while a.isAlive(): dans le try.
    Certes mais quel est l'intérêt de créer un thread dans ce cas?
    Note: plutôt que d'appeler directement la methode associée à start
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    @wiztricks oops j'ai lu un peu trop vite votre precedant message, en effet je pensai qu'un thread serai exécuté en tant que "processus".
    Si j'ai bien compris un daemon c'est seulement sur linux?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Salut

    Si j'ai bien compris un daemon c'est seulement sur linux?
    On va dire qu'un daemon est un "script" ou une application qui s'exécute dans un processus séparé et avec lequel on a une interface "ligne de commande" qui permette de faire "start, stop, reload".

    Tous les environnements systèmes (unix, OSX, Windows) ayant besoin de disposer de ce genre de facilité "système" proposent des "interfaces" différentes pour "enrober" ces différentes opérations....

    Python ne propose pas d'interface indépendante de l'OS - que ce soit l'infrastructure ou les mécanismes de "signaux" tout étant "différent", pas facile de faire quelque chose de cohérent qui fasse consensus!

    Ceci dit, si vous ne devez pas vous conformer à l'interface système, la méthode UNIX - qui passe par la création d'un fichier dans lequel le daemon stocke son PID - devrait être utilisable partout même si elle n'est pas "en ligne" avec ce que propose l'environnement OS hôte.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Vous voulez dire dans votre dernière phrase que cette méthode : http://www.jejik.com/articles/2007/0...mon_in_python/ peut fonctionner sur Windows?

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Salut,
    Ce que je dis c'est qu'il ne devrait pas manquer grand chose à Windows pour que cet exemple fonctionne. Mais que çà n'en fait pas pour autant un daemon UNIX ou ou service Windows.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Executer un programme java en ligne de commande
    Par kawther dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 18/02/2015, 20h49
  2. start / stop script python en ligne de commande
    Par airod dans le forum Général Python
    Réponses: 3
    Dernier message: 03/02/2011, 09h44
  3. Exécution d'un programme Java en ligne de commande
    Par Emmi_87 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 20/05/2010, 22h22
  4. Réponses: 1
    Dernier message: 15/05/2008, 15h29
  5. Réponses: 0
    Dernier message: 20/09/2007, 18h36

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