2009-03-03 2 views
1

У меня есть два файла: один находится в веб-корне, а другой - загрузочный блок, расположенный в одной папке над корнем веб-сайта (это программирование CGI Кстати).Переменная Python, назначенная внешним модулем, доступна для печати, но не для назначения в целевом модуле

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

Теперь, в загрузочном файле, я могу распечатать переменную, но когда я пытаюсь присвоить значение переменной, возникает ошибка. Если вы уберете оператор присваивания, ошибки не будут выброшены.

Мне очень интересно, как работает область обзора в этой ситуации. Я могу напечатать переменную, но я не могу ее использовать. Это на Python 3.

index.py

# Import modules 
import sys 
import cgitb; 

# Enable error reporting 
cgitb.enable() 
#cgitb.enable(display=0, logdir="/tmp") 

# Add the application root to the include path 
sys.path.append('path') 

# Include the bootstrap 
import bootstrap 

bootstrap.VAR = 'testVar' 

bootstrap.initialize() 

bootstrap.py

def initialize(): 
    print('Content-type: text/html\n\n') 
    print(VAR) 
    VAR = 'h' 
    print(VAR) 

Спасибо.

Edit: Сообщение об ошибке

UnboundLocalError: local variable 'VAR' referenced before assignment 
     args = ("local variable 'VAR' referenced before assignment",) 
     with_traceback = <built-in method with_traceback of UnboundLocalError object at 0x00C6ACC0> 
+0

Может помочь опубликовать ваше сообщение об ошибке. – monkut

+0

И ваши отступы отображаются в вашем списке bootstrap.py. – monkut

+0

Спасибо за головы, я отредактирую сообщение. – BlueBadger

ответ

3

попробовать это:

 

def initialize(): 
    global VAR 
    print('Content-type: text/html\n\n') 
    print(VAR) 
    VAR = 'h' 
    print(VAR) 
 

Без 'глобальной Var' питон хочет использовать локальный УАК переменного и дать вам «UnboundLocalError: локальный переменный 'Var' ссылку перед присваиванием "

+0

Спасибо, ваше сообщение указал мне в правильном направлении. Дополнительную информацию можно найти здесь. http://stackoverflow.com/questions/370357/python-variable-scope-question – BlueBadger

0

Не объявляйте его глобальным, передайте его и верните, если вам нужно получить новое значение, например:

def initialize(a): 
    print('Content-type: text/html\n\n') 
    print a 
    return 'h' 

---- 

import bootstrap 
b = bootstrap.initialize('testVar') 
+0

Да, это поможет решить проблему, и я использую этот метод в других ситуациях; но в этой ситуации файл index.py не должен выполнять какую-либо обработку, он должен только установить несколько значений. Бутстрап фактически отвечает за загрузку другого класса, который выполняет обработку – BlueBadger