Echange de variables globales entre fichiers programmes

Bonjour,
Je m’intéresse aux échanges de variables globales entre fichiers. Pour une utilisation simple des variables globales, je n'ai pas de problème.

def Ma_fonction () :
    global var_1
    var_1 = 2

var_1 = 1
print (var_1)   # affiche 1 OK
Ma_fonction ()
print (var_1)  # affiche 2 OK


A présent je souhaite aérer mes programmes avec des fonctions écrites dans des fichiers externes. Dans mon exemple, j'ai les programmes prog_a.py et prog_b.py.

Programme prog_a.py
from prog_b import Ma_fonction_externe

def Ma_fonction () :
    global var_1
    var_1 = 2

var_1 = 1
print (var_1)   # affiche 1 OK
Ma_fonction ()
print (var_1)  # affiche 2 OK
Ma_fonction_externe ()
print (var_1)  # affiche 2 PAS OK, il devrait afficher 3


Programme prog_b.py
def Ma_fonction_externe () :
    global  var_1
    var_1 = 3


J'ai lu ce que j'ai pu trouver dans la littérature Python à ce sujet, il manque surement une déclaration dans prog_b, malheureusement je n'ai pas trouvé ce qui cloche dans mon système. Si quelqu'un pouvait m'aider, merci d'avance.

8 réponses

  1. Hello Neopython,

    Alors, que penses tu de tout ça ?
    1
    1. Hello Phil_1857

      Je viens d'essayer, cela fonctionne très bien, je suis même épaté par la simplicité de la solution.

      Merci beaucoup, j'ai une solution à mon problème, cependant avant de clôturer cette question, et parce que je n'aime pas laisser derrière moi un mystère, quelqu'un peut il me dire ce qui clochait dans mon programme (le résultat 0 au lieu de 2).
      Simple curiosité technique.
      0
  2. Bonjour Neopython,

    Normal: la variable globale var_1 dans prog_b.py est globale uniquement dans ce fichier

    Donc dans le fichier prog_a, var_1 reste égale à 2, suite à l'appel de Ma_fonction()
    0
    1. Contributeur Ambassadeur
      bonjour,
      en règle générale, il est préférable de ne pas utiliser de variables globales.
      si tu insistes pour l'utiliser, je ferais ainsi:
      ajouter un module, par exemple glovar.py:
      var_1=None

      dans les autres modules, importer glovar,
      y supprimer les
      global  var_1

      y remplacer
      var_1
      par
      glovar.var_1
      0
      1. Bonsoir
        Pardon, je n'avais pas compris ta réponse.
        J'ai essayé, ça fonctionne. Finalement l'instruction"global" ne nous sert à rien.
        0
    2. Bonjour à tous deux,

      Rien que pour embêter Phil_1857, que je suis à la trace, j'ai eu la même analyse.

      Je pense qu'il faut passer par un fichier, à partir duquel on récupérera la valeur. Mais je ne sais pas comment faire.

      A vous les studios.
      0
      1. Oui, en général, éviter les variables globales si possible, ca peut poser des problèmes

        Une solution est la POO, utiliser des classes

        A la rigueur une astuce possible:

        dans prog_b.py

        class Glob():
            ''' Global variables '''
        
            var_1 = None


        et dans les 2 modules, on appelle Glob.var_1 (il faut enlever les instructions global ...)
        0
        1. Et mon fichier externe?
          0
        2. @georges97Bah, pas besoin ...

          La définition de la classe dans prog_b.py et on utilise Glob.var_1 dans prog_a et prog_b, et ça pète le feu à la béquille
          0
        3. @Phil_1857Ok, Phil, tu gagnes cette fois-ci. Mais j'aurai ma revanche. J'ai encore appris quelque chose, en fait deux chose puisque je ne connaissais pas cette expression de motard.

          Bonne soirée????
          0
        4. @georges97Bone soirée ! :-) :-)
          0
      2. Bonsoir à tous.

        Merci pour vos réponses. J'ai eu une mauvaise expérience avec l'utilisation des Classe/Objet pour transférer des variables, au niveau de la manipulation des adresses de variables à lire ou écrire.
        Je vais essayer ce que vous proposez dans les jours qui viennent et je vous tiens au courant des résultats.
        0
        1. Finalement me revoilà.
          Selon vos conseils j'ai fabriqué ma variable dans prog_b :
          def Creation_variables () :
              var_1 = 2
          
          def Utilisation_variables () :
              print ("Retour d'une écriture depuis prog_a vers prog_b : " + str(var_1))
          


          Mon prog_a contient une utilisation de ma variable. Il va y avoir des échanges entre prog_a et prog_b
          import prog_b
          
          prog_b.Creation_variables() # Nous allons créer une variable ailleurs, avec une valeur = 2
          global var_1  # la variable est déclarée ici comme globale
          prog_b.var_1 = int() # Apparement on doit  déclarer cette variable globale sinon défaut
          print(prog_b.var_1) # Ce qui permet de pouvoir lire la valeur initiale
          prog_b.var_1 = 4  # Cette variable va retourner dans prog_b
          print(prog_b.var_1)
          
          prog_b.Utilisation_variables ()
          print("Variable exporté de prog_b vers prog_a :  " + str(prog_b.var_1))
          
          # a partir d'ici on écrit à volonté dans prog_b
          prog_b.var_1 = 6
          prog_b.Utilisation_variables ()
          prog_b.var_1 = 8
          prog_b.Utilisation_variables ()
          
          # A partir d'ici on lit à volonté
          print(prog_b.var_1)
          prog_b.var_1 = 10
          print(prog_b.var_1)
          prog_b.Utilisation_variables ()
          


          Ci dessous voici le résultat de l'execution de prog_a :
          0
          4
          Retour d'une écriture depuis prog_a vers prog_b : 4
          Variable exporté de prog_b vers prog_a : 4
          Retour d'une écriture depuis prog_a vers prog_b : 6
          Retour d'une écriture depuis prog_a vers prog_b : 8
          8
          10
          Retour d'une écriture depuis prog_a vers prog_b : 10

          Tout fonctionne bien, SAUF, si vous regardez bien, le premier affichage donne 0 alors qu'il devrait afficher 2. Et bien entendu, je ne vois pas pourquoi. Merci de bien vouloir participer à mes recherches.
          0
          1. Contributeur Ambassadeur
            peux-tu préciser "python" quand tu utilises les balises de code?

            qui t'a conseillé ceci?
            global var_1  # la variable est déclarée ici comme globale
            prog_b.var_1 = int() # Apparement on doit  déclarer cette variable globale sinon défaut 
            0
          2. @yg_beBonsoir.
            C'est moi. J'ai remarqué que je supprimais une alarme avec cette ligne.
            Mais je crois comprendre aujourd'hui que c'était une idée stupide.
            0
        2. Bonsoir,

          Tu n'as pas fait comme je te le disais: avec la classe Glob
          Le code est court et ça marche:

          prog_b.py

          class Glob():
              ''' Global variables '''
          
              var_1 = None
          
          def Ma_fonction_externe ():
          
              Glob.var_1 = 3
          


          prog_a.py
          from prog_b import *
          
          def Ma_fonction ():
              Glob.var_1 = 2
          
          Glob.var_1 = 1
          print (Glob.var_1)   # affiche 1 OK
          
          Ma_fonction ()
          print (Glob.var_1)  # affiche 2 OK
          
          Ma_fonction_externe ()
          print (Glob.var_1)  # affiche  3 !
          
          0
          1. Bonsoir Phil_1857
            J'avais écrit une réponse, mais je ne la vois pas, j'ai du oublier de valider.
            Ton programme fonctionne très bien, encore merci.
            0
          2. Contributeur Ambassadeur
            @NeoPythonpeux-tu alors marquer la discussion comme résolue?
            0