2013-06-15 4 views
0

J'ai du code VB que j'essaie de répliquer en Python, mais je suis nouveau sur Python et sa gestion des variables globales me rend complètement confus.Confusion de variables globales Python

J'ai un script Python (pytSettings) qui importe du texte à partir d'un fichier texte et assigne des parties du texte à diverses variables de chaîne. Exemple ...

def main(): 
    strFileS = "/Users/username/Desktop/settings.txt" 
    fileHandleS = open(strFileS, 'r') 
    fileContentsS = fileHandleS.readlines() 
    fileHandleS.close() 

    strPhotoInclude = fileContentsS[0] 

Ensuite, j'ai un second script (pytBatch) qui boucle à travers les lignes d'un fichier texte séparé et attribue des portions de chaque ligne de texte à un autre ensemble de variables de chaîne. Dans ce second script (pytBatch), j'ai besoin d'accéder aux variables du premier script (pytSettings). Pour compliquer les choses, dans la boucle While du second script (pytBatch), j'appelle un troisième script (pytGenerate) qui a besoin d'accéder aux variables de chaîne des premier et second scripts.

def main():  
    strFileB = "/Users/username/Desktop/batch.txt" 
    fileHandleB = open(strFileB, 'r') 
    fileContentsB = fileHandleB.readlines() 
    fileNumLines = len([l for l in fileContentsB if l.strip(' \n') != '']) 
    fileHandleB.close 

    icnt = 0 
    while icnt < (fileNumLines): 
     fileHandleB = open(strFileB, 'r') 
     fileLine = fileHandleB.readlines() 
     strLineTemp = fileLine[icnt] 
     strLineTempI = strLineTemp.find("|") 
     strPhotoLocation = strLineTemp[0:strLineTempI] 
     if strPhotoLocation == "NullField": 
      strPhotoInclude = "FALSE" 
     else: 
      strPhotoInclude = strPhotoInclude 

     pytGenerate.main() 

     icnt = icnt +1 

Dans l'exemple ci-dessus:

  1. strPhotoInclude est situé dans le script pytSettings.
  2. strPhotoLocation est situé dans le script pytBatch
  3. Si strPhotoLocation = « NullField », strPhotoInclude est ensuite réglé sur « FAUX »
  4. strGenerate est appelé, à la fois strPhotoInclude et strPhotoLocation utilisés dans ce code (non représenté parce que Je peux réussir à apprendre comment obtenir les variables de pytSettings à pytBatch, pytGenerate de script est inutile)
  5. pytBatch reprend ensuite et une boucle à travers la prochaine TNCO itération

J'ai lu des dizaines de discussions sur la variable globale et essayé placer le gl déclaration obale dans un certain nombre d'endroits, mais je ne peux pas obtenir le bon séquençage.

Merci d'avance pour toute aide que vous pouvez donner.

ÉDITER pour ajouter:

OK. Cela m'a permis de surmonter le premier obstacle, mais l'appel au troisième fichier cause un problème connexe. Dans le second fichier, une boucle définit plusieurs variables globales, exécute le troisième script, puis boucle une autre itération dans le second script pour réinitialiser les variables, puis réexécute le troisième script.

import pytSettings 
pytSettings_main() 

def main(): 
    '''code that loads the text file omitted''' 
    global strPhoto 
    icnt = 0 
    while icnt < (fileNumLines): 
     strPhoto = strLineTemp 
     '''reset photo include to false if photo if no photo filename provided''' 
     if strPhoto == "NullField": 
      pytSettings.strPhotoInclude = "FALSE" 
     else: 
      pytSettings.strPhotoInclude = "TRUE" 

    '''call the Generate script''' 
    pytGenerate.main() 

    '''iterate to next line of the input text file''' 
    icnt = icnt +1 

Mon troisième scénario (pytGenerate) ne peut pas trouver les GLOBALS du second script (pytBatch), mais peut les trouver à partir de la première (pytSettings).

import pytSettings 
import pytBatch 

def main(): 
    print pytSettings.strMarginTop '''this works''' 
    print pytBatch.strPhoto  '''this does not''' 

La tentative de faire référence à la deuxième variable globale des résultats de votre script (strPhoto) dans " 'module' n'a pas d'attribut 'strPhoto'".

+1

Ne pas répliquer le code, répliquer les algorithmes. –

+0

Vous ne pouvez pas accéder aux variables d'un script dans un autre sans les importer. – BrenBarn

+0

Que voulez-vous dire par "script"? S'agit-il de programmes complètement distincts qui sont gérés indépendamment? Sont-ils des modules python qui sont tous utilisés ensemble dans un seul programme? –

Répondre

1

En fonction, vous devez déclarer la variable comme première mondiale:

>>> def some_function(): 
>>>  global x 
>>>  x = 5 
>>> x # before executing f() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'x' is not defined 

>>> f() 
>>> x # after executing f() 
5 

Avec plusieurs fichiers, il est essentiellement la même, à l'exception des variables sont également espaces de noms par le fichier:

fichier1:

## py1.py 
def main(): 
    global x 
    x = 10 

fichier2:

## py2.py 
import py1 
py1.main() 
print py1.x 
+0

OK. Je vois ce qui me manquait. Dans le fichier 2, j'omettais le nom du fichier 1 avant la variable. (Par exemple, je tapais "print x" au lieu de "print py1.x") Merci Nisan! – user2488121