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

Vue hybride

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

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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 confirmé

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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 confirmé

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

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