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 :

Problème avec 'exec' [Python 3.X]


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Points : 78
    Points
    78
    Par défaut Problème avec 'exec'
    Salut.

    Quelqu'un pourrait-il me dire ce qui cloche dans ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> def myfunc(chn):
    ...     exec("mcounter = %d" % (chn))
    ...     return mcounter
    ...
    >>> myfunc(0)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in myfunc
    NameError: name 'mcounter' is not defined
    >>>
    Pourquoi mcounter n'existe pas en tant que variable après l'appel à exec?

    Merci.
    G13

  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 Gorgo13 Voir le message
    Pourquoi mcounter n'existe pas en tant que variable après l'appel à exec?
    Techniquement, depuis Python 3, exec est devenu "fonction".
    Lorsqu'on appelle une fonction qui définit une variable (locale), elle ne sera plus accessible la fonction terminé (ou dans le scope englobant).

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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Points : 78
    Points
    78
    Par défaut
    Merci pour l'explication. Existe-t-il une solution à mon problème?

    GTreize.

  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
    Salut,

    Citation Envoyé par Gorgo13 Voir le message
    Merci pour l'explication. Existe-t-il une solution à mon problème?
    Vous n'avez pas décrit le problème que vous cherchiez à résoudre seulement les difficultés à mettre en œuvre "exec" (qui est en général une mauvaise solution).

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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Points : 78
    Points
    78
    Par défaut
    En fait, c'est pire que ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> def myfunc(chn):
    ...     exec("mcounter = %d" % (chn))
    ...     print(mcounter)
    ...     return 0
    ...
    >>> myfunc(0)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in myfunc
    NameError: name 'mcounter' is not defined
    >>>
    Si je modifie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec("mcounter = %d" % (chn),globals())
    j'obtiens bien le bon résultat... mais je ne comprends pas très bien comment agit "globals()"...

    Gorgo13

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Points : 78
    Points
    78
    Par défaut
    Nouveau problème:

    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
    def get_counter_channel(chn):
        ''' ----------------------------------------
        Return the current channel counter value.
        Reads from the already-opened shared memory
        data structure.
        ---------------------------------------- '''
        print('chn: %d' % (chn))
        mycnt = -1
        if chn < 8:
            exec("cnt = disp%d.get_counter()" % (chn),globals())
            mycnt = cnt
        else: # chn == 8:
            cnt = disp.get_counter()
     
        print(cnt)
        return cnt
    mais quand je lance le programme (qui appelle cette fonction), j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    chn: 0
    Traceback (most recent call last):
      File "dmview", line 186, in <module>
        test = get_counter_channel(i)
      File "dmview", line 87, in get_counter_channel
        mycnt = cnt
    UnboundLocalError: local variable 'cnt' referenced before assignment
    J'ai trouvé qu'en modifiant:
    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 get_counter_channel(chn):
        ''' ----------------------------------------
        Return the current channel counter value.
        Reads from the already-opened shared memory
        data structure.
        ---------------------------------------- '''
        print('chn: %d' % (chn))
        global cnt
        cnt = -1
        if chn < 8:
            exec("global cnt; cnt = disp%d.get_counter()" % (chn))
            print(cnt)
        else: # chn == 8:
            cnt = disp.get_counter()
     
        print(cnt)
        return cnt
    J'obtiens le bon résultat... mais bon, je trouve ça carrément lourdingue de devoir à chaque fois définir les variables en global avant tout appel à exec. Y a-t-il une solution plus simple?

    G13

  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,

    Vu le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cnt = disp%d.get_counter()" % (chn)
    , vous chercher à calculer un nom de variable contenant un entier.

    Ce qui veut dire qu'à la place de créer des variables (globales) disp0, disp1, disp2,... vous auriez pu créer une liste d'objets et accéder à chacun d'eux via leur index: disp[chn].get_counter().

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

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Points : 78
    Points
    78
    Par défaut
    Bonsoir. Merci pour vos réponses. Je marque le sujet comme résolu... un de plus!

    Gorgo XIII

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec exec()
    Par riadh8 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 30/04/2011, 12h27
  2. Problème avec exec !
    Par kergad dans le forum Langage
    Réponses: 7
    Dernier message: 12/12/2009, 23h13
  3. Problème avec exec()
    Par heliophane dans le forum Langage
    Réponses: 2
    Dernier message: 16/09/2009, 09h32
  4. [find] Problème avec -exec
    Par kromartien dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 06/11/2007, 17h09
  5. Problème avec exec()
    Par bibou dans le forum Langage
    Réponses: 4
    Dernier message: 11/07/2007, 12h13

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