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 :

Vos avis sur mon début de code.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Par défaut Vos avis sur mon début de code.
    Bonjour,

    Je viens vous présenter un bout de code pour avoir vos avis et savoir si je pars dans la bonne direction. Le projet, c'est de piloter une ventilation et faire une régulation avec un capteur de température. J'utilise un Raspberry Pi pour communiquer avec mon capteur de température et la ventilation.

    J'ai réfléchis un bon moment, pour comprendre comment bien interfacer le toute. Car je voudrais pouvoir utiliser une commande pour allumer/éteindre la ventilation, pour activer/désactiver la régulation et définir une température de régulation. Je n'ai pas eu de problème pour créer un bout de code qui pilote la ventilation ou qui régule la température. Par contre j'ai du mal à comprendre comment faire pour communiquer avec mon processus qui tourne car quand je suis en mode régulation, il est dans une boucle infinie pour la lecture de température pour savoir si la ventilation doit être allumée ou éteinte. L'idée que j'ai eu (mais je ne sais pas si c'est la bonne), c'est de faire un deamon avec un script init ou systemd (je verrais par la suite le choix). Je me suis documenté sur la programmation système et j'ai écrit un bout de code qui enregistre le PID du programme, détecte si le programme tourne et le tue si il le faut. Voici le bout de code, pour la partie régulation et pilotage de la ventilation, je vais importer un module avec une classe:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #!/usr/bin/python3
    # -*- coding: utf8 -*-
     
    PIDFILE   = "/tmp/extractorFan.pid"
    CACHEFILE = "/tmp/extractorFan.cache"
     
    import os
    import argparse
    import signal
    import sys
     
     
    pid = str(os.getpid())
     
    def quit(signal, frame):
        if os.path.isfile(PIDFILE):
            os.remove(PIDFILE)
        sys.exit(0)
     
    signal.signal(signal.SIGINT, quit)
     
     
    arguments = argparse.ArgumentParser()
     
    arguments.add_argument("-d", "--debug", action="store_true", help="Debug mode")
    arguments.add_argument("-r", "--regulation", nargs=1, help="Regulation: ON|OFF")
    arguments.add_argument("-s", "--start", action="store_true", help="Start extractor fan")
    arguments.add_argument("-S", "--stop", action="store_true", help="Stop extractor fan")
    arguments.add_argument("-t", "--temp", nargs=1, type=int, help="Set temparture")
     
    args = arguments.parse_args()
     
    def debug(message):
        if args.debug == True:
            sys.stdout.write(message + "\n")
     
    debug(pid)
     
    if args.start:
        if os.path.isfile(PIDFILE):
            try:
                with open(PIDFILE, 'r') as f:
                    oldpid = int(f.read())
                os.kill(oldpid, signal.SIGQUIT)
                os.remove(PIDFILE)
            except:
                msg = "Can't kill pid\n"
                arguments.exit(4, message = msg)
        debug("Start ventil")
     
    elif args.stop:
        if os.path.isfile(PIDFILE):
            try:
                with open(PIDFILE, 'r') as f:
                    oldpid = int(f.read())
                os.kill(oldpid, signal.SIGQUIT)
                os.remove(PIDFILE)
            except:
                msg = "Can't kill pid\n"
                arguments.exit(4, message = msg)
        debug("Stop ventil")
     
    elif args.temp:
        debug("temp %s" % args.temp)
     
    elif args.regulation:
        if args.regulation == ['on']:
            if os.path.isfile(PIDFILE):
                msg = "Now regulation on\n"
                arguments.exit(3, message = msg)
            try:
                with open(PIDFILE, 'w') as f:
                    f.write(pid)
            except:
                msg = "Can't create pid\n"
                arguments.exit(5, message = msg)
            while True:
                debug("Regulate" % args.regulation)
        elif args.regulation == ['off']:
            if os.path.isfile(PIDFILE):
                try:
                    with open(PIDFILE, 'r') as f:
                        oldpid = int(f.read())
                    os.kill(oldpid, signal.SIGQUIT)
                    os.remove(PIDFILE)
                except:
                    msg = "Can't kill pid\n"
                    arguments.exit(4, message = msg)
            debug("%s" % args.regulation)
        else:
            arguments.error("For regulation choose ON or OFF\n")
     
    else:
        debug(arguments.parse_args(['-h']))
     
    debug("Bye")
     
    # vim: ft=python ts=8 et sw=4 sts=4
    Si vous pouviez me donner votre avis car je me demande si c'est une bonne pratique.? J'ai encore une interrogation: pour la régulation, j'aimerais pouvoir lui transmettre une nouvelle température pour la régulation et je n'ai pas d'autre idée que de tuer le processus et de le relancer un nouveau processus avec la nouvelle température. Je pourrais avoir quoi comme possibilité pour dialoguer avec un processus en cours??

    Merci pour vos future réponse
    Salutation

  2. #2
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 970
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    Dialogue inter-process:

    Version 2:
    https://docs.python.org/2/library/ipc.html

    Version 3:
    https://docs.python.org/3/library/ipc.html

    Regarde peut-être au niveau Signal.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Par défaut
    Merci beaucoup pour ce lien, je pense que je vais trouver mon bonheur. Il me manquait le terme dialoogue inter-process, je vais orienter mon apprentissage la dessus.

    Sinon concernant mon bout de code, c'est une manière correcte et performante de développer un deamon en python sous linux?

    Salutation

  4. #4
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 970
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    A propos de "est-ce la manière correcte...?"

    Je débute en python (j'ai fait du perl, .net, java android...).
    Je pense que du point de vue programmation tu es dans le bon.
    Juste une remarque: évite ce genre de code:

    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
    16
    17
    def quit(signal, frame):
        if os.path.isfile(PIDFILE):
            os.remove(PIDFILE)
        sys.exit(0)
     
    signal.signal(signal.SIGINT, quit)
     
     
    arguments = argparse.ArgumentParser()
     
    arguments.add_argument("-d", "--debug", action="store_true", help="Debug mode")
    arguments.add_argument("-r", "--regulation", nargs=1, help="Regulation: ON|OFF")
    arguments.add_argument("-s", "--start", action="store_true", help="Start extractor fan")
    arguments.add_argument("-S", "--stop", action="store_true", help="Stop extractor fan")
    arguments.add_argument("-t", "--temp", nargs=1, type=int, help="Set temparture")
     
    args = arguments.parse_args()
    La partie rouge devrait se trouver en bas de page avant le "bye".
    Tu gagnes en lisibilité.
    Et perso, je mettrais les import avant les variables globales et un try exception par fonction (si le code n'est pas blindé)

Discussions similaires

  1. [exercice] Donnez-moi vos avis sur mon code
    Par loukiluk dans le forum C++
    Réponses: 19
    Dernier message: 17/05/2012, 19h21
  2. [Projet en cours] Tetris amateur - vos avis sur mon code ?
    Par NainTernaute dans le forum Projets
    Réponses: 24
    Dernier message: 04/05/2010, 22h44
  3. Vos avis sur mon site
    Par kodokan dans le forum Mon site
    Réponses: 11
    Dernier message: 10/10/2006, 21h06
  4. Réponses: 1
    Dernier message: 06/10/2006, 21h03
  5. Vos avis sur mon site perso
    Par Fildz dans le forum Mon site
    Réponses: 12
    Dernier message: 19/08/2006, 22h07

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