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
script.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
IHM.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()
FileMgnt.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()
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.
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")
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
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 :
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")
script2.py
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 :
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()
script2.py
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.
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 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
Partager