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 :

[facile] passage de variable entre 2 programmes


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2010
    Messages : 24
    Points : 21
    Points
    21
    Par défaut [facile] passage de variable entre 2 programmes
    Bonjour,

    Pb sûrement facile à résoudre!

    j'appelle une fonction utilisateur (placée dans un module). J'ai besoin que la fonction renvoie la valeur d'une variable (un "flag", True ou False par ex.) pour l'utiliser dans le programme d'appel.

    Voici mes sources; Exécuter "appel" renvoie "hello" et pas "bonjour"!

    La fonction (inscrite dans le module "module"):

    --------------
    def f():
    global var
    var = "Bonjour!"
    return var
    --------------

    et le programme d'appel:

    ---------------
    import module

    var = "hello!"

    module.f()

    print(var)

    ----------------

    Merci de me dépanner!

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ton problème est que tu importe ta fonction d'un module, son espace de nom n'est pas le même que celui du __main__

    En restant dans le même espace de nom cela fonctionne comme attendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> def f():
    ...     global var
    ...     var = 'bonjour'
    ...     return var
    ... 
    >>> var = 'hello'
    >>> f()
    'bonjour'
    Si tu veux absolument utiliser des modules à importer tu peux passer l'objet en argument à la fonction ou, mieux encore, utiliser des classes.

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a une astuce très simple que j'utilise quelquefois avec Python 2.7 quand je ne peux pas faire autrement. Je viens de vérifier que ça marche aussi sous Python 3.2:

    Programme principal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import module
     
    var = "hello!"
     
    module.f()
     
    print(var)
    Module:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import sys
     
    progmain = sys.modules['__main__']
     
    def f():
        progmain.var = "Bonjour!"
    Résultat: à partir du programme principal, l'appel à module.f() a effectivement changé la variable globale "var" de "Hello!" à "Bonjour!".
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Cette discussion est résolue, mais comment?

    Donne la solution que tu as choisie!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2010
    Messages : 24
    Points : 21
    Points
    21
    Par défaut
    Bonjour tyrtamos,

    Je n'ai eu qu'à adapter la solution que tu m'as fournie et tout fonctionne parfaitement.

    Pour être plus complet, il s'agit, pour le TP "jeu du pendu" , du problème suivant:

    - une fonction inscrite dans un module doit vérifier que le joueur propose une lettre et une seule. Si la règle est respectée, la fonction met une variable "flag" à True, la renvoie au programme principal qui peut continuer vers la lettre suivante; sinon, "flag" est mis à False et la demande d'une lettre est posée à nouveau.

    Voici un extrait de ma fonction verif_proposition, inscrite dans le module "fonctions.py":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import sys
    progmain = sys.modules['__main__']
     
    def verif_proposition(arg):
     
        if arg =="":
            print("Proposez donc une lettre!")
        elif len(arg) > 1:
            print("Proposez une seule lettre!")
        elif "abcdefghijklmnopqrstuvwxyz".find(arg) == -1:
            print("Proposez une lettre, pas d'autre caractère!")
        else:
            progmain.flag = True
    et voici un extrait du programme "pendu.py" qui l'appelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from fonctions import *
     
        flag = False
     
        while flag == False:
     
            proposition = input("Essai n° {} - Entrez une lettre: ".format(essai))
            proposition = proposition.lower() # Conversion de la lettre en minuscule
     
            verif_proposition(proposition) # appel de la fonction

    Encore merci pour la réponse rapide et je promets de travailler la portée des variables!

    jabal64

    ps: Je viens de lire la correction proposée pour le TP Jeu du Pendu, et je viens de découvrir la récursivité des fonctions utilisateur. Cela rend le code tellement plus simple!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def recup_lettre():
        """Cette fonction récupère une lettre saisie par l'utilisateur. Si la chaîne récupérée n'est pas
        une lettre, on appelle récursivement la fonction jusqu'à obtenir une lettre"""
     
        lettre = input("Tapez une lettre: ")
        lettre = lettre.lower()
        if len(lettre) > 1 or not lettre.isalpha():
            print("Vous n'avez pas saisi une lettre valide!")
            return recup_lettre()
        else:
            return lettre

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Plus complexe, pas conseillé, mais avec ctypes (je m'amuse avec actuellement), on peut modifier par référence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> from ctypes import *
    >>> def f(variable):
    ...     variable.contents.value = 'bonjour'
    ... 
    >>> var = c_char_p('hello')
    >>> f(pointer(var))
    >>> print var.value
    bonjour
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Plus complexe, pas conseillé, mais avec ctypes (je m'amuse avec actuellement), on peut modifier par référence
    Ben alors autant écrire ceci, c'est la même chose mais sans déranger ctypes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def f(variable):
        variable[0] = 'bonjour'
    var = ['hello']
    f(var)
    print var[0]

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Ben alors autant écrire ceci, c'est la même chose mais sans déranger ctypes:
    Oui

    Mais le principe était de le déranger justement, comme je m'amuse avec, et que j'avais cherché cette solution il y a pas longtemps, je les simplement présentée ici, c'est une solution supplémentaire pour les lecteurs intéressés par ctypes...

    Mais ta solution est bonne sachant que les containers sont les seuls modifiables par référence, bien vu
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

Discussions similaires

  1. Passage de variable entre 2 pages
    Par lodan dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/07/2006, 11h38
  2. passage de variable entre jsp ?
    Par MAJIK_ENIS dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/04/2006, 11h54
  3. Réponses: 2
    Dernier message: 15/12/2005, 08h43
  4. [C#] Passage de variables entre 2 forms
    Par Tips dans le forum C#
    Réponses: 6
    Dernier message: 06/12/2005, 16h48
  5. [langage] Probleme passage de variables entre modules
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2004, 12h25

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