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 :

Problème: NameError: global name 'x' is not defined


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Août 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Août 2015
    Messages : 10
    Par défaut Problème: NameError: global name 'x' is not defined
    Bonjour à tous,

    J'ai actuellement un problème sur un script python qui doit lire différents autres scripts (un VBS, deux en Matlab et un en Python).
    Tout se passe bien pour l'ouverture et la compilation des trois premiers scripts mais j'ai un problème quand il doit ouvrir et compiler le script python.
    Pour vous donner une petite introduction à mon problème, le script python qui doit être compilé par l'autre a trois fonctions: Une principale qui est lancée directement et deux secondaires qui sont lancées dans la principale.
    Hélas, quand le script arrive au niveau de l'appel de la première fonction secondaire, il me retourne l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NameError: global name 'ReadTXTFile' is not defined
    Le premier script ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def ExecuteScript():
        #Compilation de tous les autres programmes
        #Running Python script
        sys.argv = [LPstr, dbcstr]
        execfile(path3 + '\\script2.py')
     
    ExecuteScript()
    Le second script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def ExecuteScript():
        Variable1 =  sys.argv[0] + '\\Ref_' + sys.argv[1] + '\\DOC\\' + sys.argv[1] + '.txt'
        Variable2 = ["INJ", "ECM"]
        Variable3 = "REAL"
        trames_layout = ReadTXTFile(Variable1, Variable2, Variable3)
     
    def ReadTXTFile(Variable1, Variable2, Variable3):
        #Toute la fonction
     
    ExecuteScript()
    Le plus curieux est que quand je remplace les arguments de la variable1 par des constantes, le programme fonctionne. J'ai, bien sûr, mis des breakpoints pour voir si c'était les arguments qui posaient problème mais non car j'ai réutilisé les mêmes arguments trouvés avec les breakpoints pour les mettre en constantes dans le second script (ctrl + C, ctrl + V pour avoir la même syntaxe ).

    Je vous remercie d'avance pour vos réponses.

    Cordialement,

    Jules.

  2. #2
    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
    Salut,

    Si vos scripts sont indépendants, il serait préférable de passer par subprocess.call("python script.py p1 p2") plutôt que d'initialiser sys.argv puis exécuter un script dans le même espace de nommage que l'appelant.

    Si vos scripts ne sont pas indépendants, "import" et un appel de fonction serait plus approprié.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import sys
     
    def main(a, b, c): # la fonction principale.
          pass
     
    if __name__ == '__main__':
         a, b, c = sys.argv
         main(a, b, c)
    Dans ce cas, le script peut être exécuté directement et va exécuter le bloc conditionné par __name__ == '__main__'. On se contente de récupérer les paramètres passé à la ligne de commande avant d'appeler "main", la fonction principale.

    On pourra facilement utiliser ce script là via import:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import script
    script.main(a, b, c)
    en se passant d'execfile et de l'initialisation de sys.argv.

    Sauf à expliquer pourquoi vous ne pouvez pas utiliser l'un ou l'autre de ces mécanismes simples, je ne suis pas sûr que grand monde passe du temps à essayer de comprendre pourquoi votre execfile ne fonctionne pas, d'autant que vous ne fournissez pas assez d'informations/code permettant de reproduire le problème constaté.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Août 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Août 2015
    Messages : 10
    Par défaut
    Merci pour votre réponse.

    J'ai essayé de faire en sorte d'être concis pour vous mettre les informations que je pensais nécessaires pour la comprehension du problème. De plus, les programmes sont trop longs pour mettre la totalité sur le forum.

    J'avais déjà essayé avec subprocess.call mais les deux scripts ne sont absolument pas dans le même dossier, peut-être aussi que je m'y prends assez mal étant debutant en Python. Ensuite, je pense que les deux programmes sont indépendants (si independent veut dire qu'ils n'ont pas forcément besoin l'un de l'autre pour fonctionner), mais j'ai besoin des paramètres entrés par l'utilisateur pour les transmettre au second script.

    En fait ce script sert à appeler tous les programmes dont j'ai besoin se trouvant à différents endroits sur un réseau. Il crée d'abord un dossier pour accueillir tous les résultats (fichier Simulink, fichier contenant les paramètres...) ensuite, il lance chaque programme tour à tour et enregistre les résultats dans ce dossier et il finit par mettre celui-ci sur le réseau.

    Sinon, par rapport à subprocess.call, est-il possible d'avoir quelque chose de la forme: subprocess.call("python path\\script2.py arg1 arg2") ?
    Si oui, je réutilise juste arg1 et arg2 dans le second script sans les declarer avant?

    Cordialement,

    Jules.

  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
    Salut,

    Citation Envoyé par Noxcious Voir le message
    J'ai essayé de faire en sorte d'être concis pour vous mettre les informations que je pensais nécessaires pour la compréhension du problème. De plus, les programmes sont trop longs pour mettre la totalité sur le forum.
    Comme vous débutez pas facile de savoir ce qui est nécessaire ou pas ou de réduire votre code juste assez pour reproduire le problème constaté. A défaut, il faut que le lecteur imagine ou ajoute des instructions pour essayer de... çà prend du temps et le résultat est incertain car pour peu qu'on reproduise quelque chose, peut être que ce ne sera pas la même cause.

    Sinon, par rapport à subprocess.call, est-il possible d'avoir quelque chose de la forme: subprocess.call("python path\\script2.py arg1 arg2") ?
    Si oui, je réutilise juste arg1 et arg2 dans le second script sans les déclarer avant?
    Pour rendre la chose paramétrable, il faut "formatter" la chaine de caractères:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    path = ...
    arg1 = ...
    arg2 = ...
    subprocess.call('python %s %s %s' % (os.path.join(path, "script2.py"), arg1, arg2))
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Août 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Août 2015
    Messages : 10
    Par défaut
    Merci pour votre réponse.

    Le script ne sort plus d'erreur. J'aurai juste une dernière question, dans le second script pour utiliser les variables, j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from script1 import arg1, arg2
    Malheureusement, ça ne fonctionne pas, est-ce le bon moyen d'utiliser les variables mises en argument?

    Merci d'avance. Bonne soirée.

    Cordialement,

    Jules.

  6. #6
    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
    Salut,

    Citation Envoyé par Noxcious Voir le message
    Est-ce le bon moyen d'utiliser les variables mises en argument?
    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    path = ...
    arg1 = ...
    arg2 = ...
    subprocess.call('python %s %s %s' % (os.path.join(path, "script2.py"), arg1, arg2))
    Le script2 recevra les chaines de caractères correspondantes dans sys.argv.
    Vous pourrez les récupérez en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arg1, arg2 = sys.argv[1], sys.argv[2]
    Je ne comprends pas ce que vient faire "import" si vous avez pris l'option "subprocess.call".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. NameError: name 'self' is not defined
    Par amiraO dans le forum Général Python
    Réponses: 4
    Dernier message: 17/04/2011, 10h38
  2. NameError: global name 'thread' is not defined
    Par Balbuzard dans le forum Général Python
    Réponses: 6
    Dernier message: 15/07/2009, 06h52
  3. références croisées objets NameError: global name is not defined
    Par loicmidy dans le forum Général Python
    Réponses: 2
    Dernier message: 13/06/2009, 15h41
  4. NameError: global name 'entr2' is not defined
    Par noquioz dans le forum Tkinter
    Réponses: 18
    Dernier message: 24/11/2008, 11h20
  5. NameError: name 'excel' is not defined
    Par billyrose dans le forum Général Python
    Réponses: 3
    Dernier message: 14/07/2008, 17h37

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