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 :

[Python2.7][Thread]Passage de variable


Sujet :

Python

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 133
    Points
    133
    Par défaut [Python2.7][Thread]Passage de variable
    Bonjour à tous,

    j'avais une petite question.
    J'ai une application qui définit une classe parameters
    J'ai un webservice rest qui permet de modifier les valeurs dans la classe parameters. La classe parameters est mise a disposition de la méthode du ws via l'instruction global. Lorsque je rentre dans le ws, le premier print ( print parameters.maxTemp)m'affiche la valeur avant changement et le second print m'affiche la valeur après le changement. A ce niveau là tout est ok.

    Par contre dans le thread qui tourne toute les 30s, le print maxTemp m'affiche toujours la valeurde départ (initialisée par défaut au début de l'exécution). J'ai l'impression que l'objets parameters à 2 instances, mais je ne comprend pas pourquoi ?

    voici le 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
    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
     
    #!/usr/bin/env python
     
    import web
     
    urls = (
        '/temperature', 'get_temperature',
        '/programs', 'get_programs',
        '/mode', 'mode'
     
    )
     
     
    class parameters:
     
        def __init__(self, sensor):
            self.sensor = sensor
            self.minTemp = 17.0
            self.maxTemp = 20.6
            self.mode = thermostatMode.auto
     
        def load(self):
            return None
     
        def getCurrentTemperature(self):
            print self.sensor.getTemperature()
            return self.sensor.getTemperature()
     
     
    sensor = DS18B20("/sys/bus/w1/devices/28-0000052f6b1b/w1_slave")
    parameters = parameters(sensor)
    app = web.application(urls, globals())
     
    # WebService Method
    class get_temperature:
        def GET(self):
            global sensor
            temperatureDict = {}
            temperatureDict["value"] = sensor.getTemperature()
            return json.dumps(temperatureDict)
     
        def PUT(self):
            global parameters
            form = web.input(name="temperature")
            print parameters.maxTemp
            parameters.maxTemp = form.temperature
            print parameters.maxTemp
     
     
    def manageHeater(parameters):
        while True:
            tC = parameters.getCurrentTemperature()
            print 'Actual temperature: ' + str(tC)
            print 'Actual mode: ' + str(parameters.mode)
            print 'maxTemp: ' + str(parameters.maxTemp)
             ...
    if __name__ == "__main__":
        GPIO.setmode(GPIO.BCM)
     
        thermostat = thread.start_new_thread(manageHeater, (parameters,))
        app.run()
    Un grand merci d'avance

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

    Citation Envoyé par cameleon2002 Voir le message
    Par contre dans le thread qui tourne toute les 30s, le print maxTemp m'affiche toujours la valeurde départ (initialisée par défaut au début de l'exécution). J'ai l'impression que l'objets parameters à 2 instances, mais je ne comprend pas pourquoi ?
    Ajoutez un "print parameters" dans get_temperature/PUT et dans le thread.
    Ca va afficher un truc de la forme <__main__.A object at 0x00000000025A7828>.
    Le 0x... est l'adresse de l'objet.
    Vous saurez s'ils sont différents ou pas.

    Pour le reste, si vous écrivez des choses comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class parameters:
             ...
     
    parameters = parameters(sonde)
    C'est que vous cherchez les ennuis.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 133
    Points
    133
    Par défaut
    Effectivement je n'avais pas vu l'overide du no. Mais cela n' explique pas mon problème. Je vais voir avec le print de l'adresse.

    Merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par cameleon2002 Voir le message
    Effectivement je n'avais pas vu l'overide du no. Mais cela n' explique pas mon problème. Je vais voir avec le print de l'adresse.
    Pardon?
    Relisez la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sensor = DS18B20("/sys/bus/w1/devices/28-0000052f6b1b/w1_slave")
    parameters = parameters(sensor)
    app = web.application(urls, globals()) # <--- ligne suivante
    En gros web.application peut faire ce qu'elle veut dans le globals() appelant.
    Ca permet des effets de bord sympa genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> def foo(dd):
    ...     dd['aa'] = 123
    ...
    >>> aa
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'aa' is not defined
    >>> foo(globals())
    >>> aa
    123
    >>>
    Vous commencez avec l'override du noms puis du globals() pas étonnant que vous n'y comprenez plus rien.
    Votre code est limite "toxique".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 133
    Points
    133
    Par défaut
    Super, merci pour les informations. En fait le code que vous voyez est du code transformé plusieurs fois suite au problème que je rencontre. Par rapport au code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    app = web.application(urls, globals())
    C'est du code que j'ai trouvé sur le net. Que me conseillez-vous pour faire des ws restfull ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par cameleon2002 Voir le message
    Que me conseillez-vous pour faire des ws restfull ?
    web2py ou Django ou ce que vous trouvez sympa.
    La plupart ont des méthodes pour réaliser facilement des services REST.
    Vous trouverez des tutos et des exemples que vous pourrez adapter.

    N'oubliez pas que construire un serveur Web est un métier. Les frameworks sont plutôt là pour que l'expert ne perde pas trop de temps à coder et se concentre sur le fonctionnel. Un débutant pourra le mettre en œuvre rapidement et faire tourner les demos mais sans maîtriser ce qu'il se passe sous le capot, il sera assez vite limité.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Juste pour illustrer:
    Citation Envoyé par wiztricks Voir le message
    Un débutant pourra le mettre en œuvre rapidement et faire tourner les demos mais sans maîtriser ce qu'il se passe sous le capot, il sera assez vite limité.
    Après quelque recherche un des frameworks Web qui utilise cette "astuce" est web.py.
    Tel que construit, impossible de déclarer une variable globale comme vous l'avez fait: le module __main__ est rechargé à chaque requête!
    note: J'imagine que vous utilisez "web.py". Mais vous ne l'avez mentionné nulle part, un peu comme programmer en Python dans ce contexte devait se comporter "normalement". Ben non! C'est un peu comme du canada-dry, çà y ressemble mais çà fait des choses bizarres car le framework Web doit résoudre des problèmes que n'a pas le programmeur Python "normal".

    Pas facile non plus de supporter les threads ou plutôt une tache en background: c'est si fragile qu'ils ont sortit ce support de la distribution pour y réfléchir un peu.
    La seule façon intelligible et documenté pour s'en sortir serait par exemple d'avoir des sessions ou un contexte partagé. Dans les deux cas, ce sera le boulot de la "persistance" de récupérer l'objet.

    A défaut, on peut toujours stocker quelque chose dans le module "web", il ne survit pas au serveur mais çà devrait être largement suffisant pour vous. Pas besoin non plus d'avoir des threads: pour aller chercher la valeur de la température dans le capteur, il suffit de savoir depuis quand a été faite la dernière lecture. Avec çà, on a un code qui démontre comment on peut imaginer faire marcher çà:
    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
    import web
    import json
    import time
     
    urls = (
        '/temperature', 'Temperature',
        )
     
    class Parameters(object):
        maxTemp = 20.6
        _currentTemperature = 0
        _last_update = 0
     
        @property
        def currentTemperature(self):
            timenow = time.time()
            if timenow > self._last_update + 10:
                self._currentTemperature += 100
                self._last_update = timenow
            return self._currentTemperature
     
    class Temperature(object):
     
        def GET(self):
            web.header('Content-Type', 'application/json')
            parameters = web.parameters
            data = dict(
                maxTemp = parameters.maxTemp,
                currentValue = parameters.currentTemperature,
                )
            print 'GET data', data
            return json.dumps(data)
     
        def POST(self):
            print('POST')
            try:
                data = web.data() 
                data = json.loads(data)
                print 'POST data', data
                if 'maxTemp' in data:
                    parameters = web.parameters
                    parameters.maxTemp = data['maxTemp']
                return
            except Exception as e:
                print e
     
    app = web.application(urls, globals())
    web.parameters = Parameters()
     
    if __name__ == '__main__':
        app.run()
    note: ce code est dégueulasse, il sert juste a illustrer comment se passer de variables globales et de threads.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [langage] Probleme passage de variables entre modules
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2004, 12h25
  2. Passage de variable dans un lien asp
    Par VirginieGE dans le forum ASP
    Réponses: 4
    Dernier message: 27/07/2004, 10h06
  3. [Kylix] passage de variable en Libc
    Par zheng dans le forum EDI
    Réponses: 11
    Dernier message: 06/05/2004, 14h14
  4. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 17h03
  5. [langage] Passage de variables...
    Par martijan dans le forum Langage
    Réponses: 8
    Dernier message: 30/07/2003, 09h48

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