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 :

excefile et variables globales


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut excefile et variables globales
    Bonjour à toutes et à tous,

    J’ai un petit problème avec excefile et les variables globales.
    Mon environnement : windows XP et python 2.7
    Fonction du programme : via une IHM (sous wxpython) je veux lancer des scripts externes. Ce soft est compilé en exe avec py2exe, or les scripts ne peuvent pas être intégré à l’exe car ils doivent être modifiable, c’est pourquoi j’utilise la fonction excefile. Dans cette application il y a deux « types » de script : un fichier de config pour seter des variables et des fichiers de script utilisant ces variables. J’appel variables global les variables setées dans le fichier de config. Pour que mon projet soit plus lisible je sépare chaque fonction (IHM, gestion fichiers,…) dans des fichiers .py séparés.
    Mon code
    Voici un exemple très très simplifié de mon programme :

    config.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
     
    print "in config.py set de ma_var_1"
     
    ma_var_1 = 123
    script.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
     
    print "in script Main ma_var_1 =",ma_var_1
     
    def MyFunction():
    	print "in MyFunction ma_var_1 =",ma_var_1
     
    MyFunction()
    IHM.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
     
    import FileMgnt
     
    FileMgnt.run()
    FileMgnt.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
     
    def run():
    	print "start RUN"
    	execfile("config.py")
    	print "*"*99
    	execfile("script.py")
    Le problème est que dans le fichier script.py la variable globale : ma_var_1 n’est pas connu, même si on rajoute global ma_var_1 avant.

    Je pense avoir un peu cerné le problème car lorsque j’utilise le code suivant (runV2.py) avec les mêmes fichiers de script et config cela fonctionne. Et comme explique plus haut je ne veux pas mettre tout le code dans un même fichier .py car actuellement le programme fait 10 000 lignes.
    Voici le code :

    runV2.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
     
    print "start RUN V1"
    execfile("script1.py")
    print "*"*99
    execfile("script2.py")
    Le problème ne se confine pas qu’aux variables passés de config à script mais aussi aux noms de fonction dans script comme le montre ce script :

    script2.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
     
    print "in Main ma_var_1 =",ma_var_1
     
    def MyFunction():
    	print "in MyFunction ma_var_1 =",ma_var_1
     
    def MyFunction2():
    	MyFunction()
     
    MyFunction2()
    Ce code fonctionne correctement, mais dès que la fonction excefile est dans un autre fichier import cela ne fonctionne plus. Le problème ne se confine pas qu’aux variables passés de config a script mais aussi aux noms de fonction dans script comme le montre ce script :

    script2.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
     
    print "in Main ma_var_1 =",ma_var_1
     
    def MyFunction():
    	print "in MyFunction ma_var_1 =",ma_var_1
     
    def MyFunction2():
    	MyFunction()
     
    MyFunction2()
    Par contre dans ce cas, si on rajoute global MyFunction le script rebloque à l’affichage de la variable. Mais cela n'est pas une solution pour car j’ai une dizaine de fonction dans chaque script et cela alourdi (pour l’humain) la lecture des scripts.

    Ce que je constate :
    Les variables locals() et globals() ne sont pas correctement passés lors d’un appel a une fonction.

    Si vous avez des idées ou des questions pour mieux comprendre mon problème, merci de me répondre.


    Merci d’avance
    Jean-Michel

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Pourquoi utiliser execfile ? Regardez l'exemple des pipes avec subprocess (17.1.3.2. Replacing shell pipeline).

    @+

    (Un code de 10 OOO lignes )

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    #
    # config.py
    ma_var_1 = 123
    print ma_var_1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    #
    # script.py
    import sys
     
    def MyFunction():
        print "in MyFunction ma_var_1 =", sys.argv[1]
     
    MyFunction()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    #
    # FileMgnt.py
    import subprocess
     
    def run():
        print "start RUN"
        config = subprocess.Popen(["python", "config.py"], stdout=subprocess.PIPE)
        var = str(int(config.stdout.read()) * 99)
        print 'Entre les deux', var
        script = subprocess.Popen(["python", "script.py", var], stdout=subprocess.PIPE)
        print 'Au final:', script.stdout.read()

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Bonjour,

    Pourquoi utiliser execfile ? Regardez l'exemple des pipes avec subprocess (17.1.3.2. Replacing shell pipeline).

    @+

    (Un code de 10 OOO lignes )
    Salut PauseKawa,

    Merci de ta réponse mais j'ai oublié de précisé quelque chose : j'utilise py2exe pour transformer en exe car le programme ne s'execute pas forcement sur un pc avec un environement python, donc imposible de faire un subprocess. De plus je souhaite faire un affichage en "temp reel" des print et non afficher tous les print à la fin du script.

    as tu une autre solution ?

    Merci
    Jean-Michel

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par c_jm2 Voir le message
    j'utilise py2exe pour transformer en exe car le programme ne s'execute pas forcement sur un pc avec un environement python
    ? A tu tester ton code sur une machine sans Python ?

    Citation Envoyé par c_jm2 Voir le message
    as tu une autre solution ?
    Faire de FileMgnt un fichier texte qui contient le nom des scripts.
    Faire un readlines de FileMgnt dans l'IHM et mettre le résultat dans une liste.
    Lire la liste et faire un import des scripts pour les exécuter un à un.

    Avec cela fini les problèmes de variables globales.

    @+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut
    J'ai trouvé une solution : les fonctions decorate.

    voici le code:
    script2.py
    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
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
     
    if __name__ == "__main__":
    	ma_var_1 = 123
     
    print "in Main ma_var_1 =",ma_var_1
     
    def addGlobalsFunction(glob=locals()):
    	def addGlobals(fct):
    		for key,value in glob.iteritems():
    			if key not in globals():
    				globals()[key]=value
    		return fct
    	return addGlobals
     
    @addGlobalsFunction()
    def MyFunction(var2):
    	print "in MyFunction ma_var_1 =",ma_var_1,var2
     
    MyFunction(123)
    ce code rajoute toutes les locals du "main" aux globals de la fonction
    pour cela il suffit de rajouter @addGlobalsFunction() juste avant le def de la fonction.

    Je ne sais pas si c'est très bien de faire ca mais ca fonctionne

    Merci a toi PauseKawa

    Jean-Michel

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

Discussions similaires

  1. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 10h49
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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