2013-06-15 5 views
0

У меня есть код VB, который я пытаюсь реплицировать в Python, но я новичок в Python, и его обработка глобальных переменных меня полностью смущает.Python Глобальные переменные Confusion

У меня есть скрипт Python (pytSettings), который импортирует текст из текстового файла и назначает части текста различным строковым переменным. Пример ...

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

    strPhotoInclude = fileContentsS[0] 

Тогда у меня есть второй сценарий (pytBatch), что петли через линии отдельного текстового файла и присваивает части каждой строки текста к другому набору строковых переменных. Внутри этого второго скрипта (pytBatch) мне нужен доступ к переменным из первого скрипта (pytSettings).

Усложнение вопросов, в цикле While второго скрипта (pytBatch), я вызываю третий скрипт (pytGenerate), которому нужен доступ к строковым переменным из первого и второго скриптов.

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 

В приведенном выше примере:

  1. strPhotoInclude установлен в сценарии pytSettings.
  2. strPhotoLocation установлен в сценарии pytBatch
  3. Если strPhotoLocation = «NullField», strPhotoInclude затем устанавливается на «FALSE»
  4. strGenerate называется, как с strPhotoInclude и strPhotoLocation используется в этом коде (не показанного, поскольку до Я могу успешно узнать, как получить переменные из pytSettings в pytBatch, сценариев pytGenerate бесполезно)
  5. pytBatch затем возобновляется и перебирает следующей итерации icnt

Я прочитал десятки нитей на глобальной переменной и попытался размещение gl obal в любом количестве мест, но я просто не могу правильно упорядочить последовательность.

Заранее благодарим за любую помощь, которую вы можете дать.

EDIT to ADD:

OK. Это заставило меня преодолеть первое препятствие, но вызов третьего файла вызывает связанную проблему.

Во втором файле есть цикл, который устанавливает несколько глобальных переменных, запускает третий скрипт, а затем повторяет другую итерацию во втором скрипте для сброса переменных, а затем перезапускает третий скрипт.

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 

Мой третий сценарий (pytGenerate) не может найти глобалов из второго сценария (pytBatch), но их можно найти из первых (pytSettings).

import pytSettings 
import pytBatch 

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

Попытка ссылки на глобальную переменную второго скрипта (strPhoto) приводит к «„модуль“не имеет атрибута„strPhoto“».

+1

Не копировать код, копировать алгоритмы. –

+0

Вы не можете получить доступ к переменным из одного сценария в другом, не импортируя их. – BrenBarn

+0

Что вы подразумеваете под «скриптом»? Являются ли эти полностью отдельные программы независимыми? Являются ли они модулями python, которые все используются вместе в рамках одной программы? –

ответ

1

В функции, вам необходимо объявить переменную как глобальная первая:

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

с несколькими файлами, это по существу то же самое, за исключением переменных также пространство имен в файле:

file1:

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

file2:

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

OK. Я вижу, чего не хватает. В файле2 я не указывал имя файла1 перед переменной. (например, я печатал «print x» вместо «print py1.x») Спасибо Nisan! – user2488121

Смежные вопросы