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 :

Utilisation d'execfile pour executer un code d'un autre module


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 2
    Par défaut Utilisation d'execfile pour executer un code d'un autre module
    Bonjour,

    Je souhaite exécuter le contenu d'un programme python (par exemple python2.py) à partir d'un programme python1.py.
    Or lorsque l'exécution est lancée au sein du bloc d'instructions du 1er programme (après le if __name__ == "main"), le 2ème est exécuté avec succès. En revanche, lorsque il est lancé à partir d'une fonction définie hors bloc d'instructions, le 2ème est "mal lu", i.e. lu en partie seulement. En effet, des fonctions et classes sont définies avant les instructions et ces définitions de classes ne sont pas lues automatiquement. Je vous montre un exemple de code, parce que ce n'est pas très clair pour l'instant.

    python1.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def lancer() :
        execfile("python2.py")
     
    if __name__ == __"main"__ :
       lancer()
    python2.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
     
    class MaClasse1 :
       def __init__ (self) :
          self.num = int()
          self.strg = str()
     
    class MaClasse2 :
       def __init__(self) :
          self.cl = MaClasse1()
     
    if __name__ == __"main"__ :
       a = MaClasse1()
       a.num = 1
       a.strg = "ça marche"
       b = MaClasse2()
       b.cl = a
       print b.cl.strg
     
    ##########################
    Si j'exécute python1.py, l'instance de classe MaClasse2 (i.e., b) n'arrive pas à être définie car le compilateur ne comprend pas ce qu'est MaClasse1 dans la définition de MaClasse2 (alors même qu'il vient de créer une instance de la classe MaClasse1 (i.e. a) avec succès).
    C'est exactement pareil si j'importe un module (disons math) et que j'utilise une fonction sqrt() dans la définition d'une fonction ou d'une classe que je créée en amont du bloc d'instructions. Alors si une instruction utilise une de ces classes ou fonctions, il ne reconnait pas sqrt() comme si je n'avais pas importé le module math (alors que je l'ai fait bien sûr!).

    Ce qui est étrange, c'est que ce problème n'arrive pas si l'execfile est situé effectivement dans le bloc d'instructions dans mon programme python1.py. Et malheureusement, je suis obligée de le lancer à partir d'une fonction (ça serait un peu long à expliquer ici...).

    Quelqu'un a-t'il déjà rencontré ce problème ? Je ne vois pas trop ce que je pourrais faire à vrai dire. J'ai essayé quelques petites choses sans succès et je ne trouve aucune indication dans la doc python/forums en tous genres.

    Merci de votre aide,
    Aude

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    Bonjour et bienvenue sur le forum

    Pourquoi vouloir utiliser execfile dans ce cas précis alors qu'il y a un mécanisme d'import en Python ou même la possibilité de lancer un processus ?

    exemple en utilisant le mécanisme d'import:

    python2.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
    class MaClasse1 :
       def __init__ (self) :
          self.num = int()
          self.strg = str()
     
    class MaClasse2 :
       def __init__(self) :
          self.cl = MaClasse1()
     
    def main():
       a = MaClasse1()
       a.num = 1
       a.strg = "ça marche"
       b = MaClasse2()
       b.cl = a
       print b.cl.strg
     
    if __name__ == __"main"__ :
        main()
    python1.py:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import python2
     
    def main() :
        python2.main()
     
    if __name__ == __"main"__ :
       main()
    est ce que ceci peut te convenir ?

  3. #3
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Citation Envoyé par kango Voir le message
    Pourquoi vouloir utiliser execfile dans ce cas précis alors qu'il y a un mécanisme d'import en Python ou même la possibilité de lancer un processus ?
    Même remarque.

    Ceci étant écrit, je voix quand même deux cas où l'on pourrait avoir envie de lancer un fichier Python :
    1. On travaille avec Python 3 dans le fichier n°1, et on a besoin d'un 2nd qui ne fonctionne qu'avec Python 2.
    2. On a un système de plug-in et on ne veut pas faire "crasher" le logiciel lors du test de fonctionnement d'un plug-in.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut globals
    Salut,
    L'explication est compliquée donc je ne vais pas m'y risquer.
    En gros, pour résoudre MyClass1 il faut que 'globals' ait été construit pour l'y trouver. Pour l'aider à ne pas attendre d'avoir lu le fichier avant de pouvoir utiliser son 'globals', il faut l'aider un peu...

    Dans 'lancer':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def lancer() :
        dd = {}
        execfile("python2.py", dd)
    -W
    PS:
    if __name__ == __"main"__ :
    s'écrit:
    if __name__ == "__main__" :
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 2
    Par défaut
    Oui merci beaucoup, ça marche très bien.

    Je n'avais pas pensé à importer de cette façon et à mettre le bloc de='instructions au sein d'une fonction (il se trouve que mes blocs d'instructions ont des tailles significatives:-)).

    Pour un premier message sur ce forum, je crois que c'est un très bon début pour moi!

Discussions similaires

  1. [XL-2003] problème pour executer mon code sur un autre pc
    Par jess59 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/06/2009, 09h24
  2. peut-on utiliser les CLR pour appeler du code Java ?
    Par Mathusalem dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/09/2008, 13h42
  3. Réponses: 1
    Dernier message: 17/04/2007, 13h07
  4. [VBA-E] Aide pour éxécuter mon code en cliquant sur un bouton dans excel.
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 53
    Dernier message: 29/05/2006, 13h47

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