2016-03-11 4 views
3

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

Код:

main.py

import other 

isRunning = True 
def shutdown(): 
    global isRunning 
    isRunning = False 

def main(): 
    while isRunning: 
     # some logic here 
     other.check() 

if __name__ == '__main__': 
    main() 

other.py

import main 

def check(): 
    someCondition = #some logic to check the condition 
    if someCondition: 
     main.shutdown() 

код выполняется запуск файла main.py.

Проблема заключается в том, что при вызове other.check() в цикле вызывается функция main.shutdown(), но основной цикл продолжает работать. В основном цикле переменная isRunning всегда True, но я ожидал, что она станет False после установки в функции main.shutdown(). Почему это происходит? Что мне не хватает?

Я мог бы реорганизовать код для более эффективного управления выходом из цикла, но мне интересно узнать, существует ли решение, поддерживающее такую ​​структуру кода.

+0

Возможно, вам понадобится инструкция 'global isRunning' в main(). – barny

ответ

4

Проблема связана с загрузкой файла main.py. Сначала он загружается как __main__, когда вы запускаете его как скрипт. Он также импортируется other.py в качестве его обычного названия main.

Эти две копии полностью отделены друг от друга и имеют отдельные глобальные переменные! Когда other.check вызывает main.shutdown, чтобы изменить глобальную переменную isRunning, она изменяет только main.isRunning, а не __main__.isRunning. Основная функция - проверка __main__.isRunning, которая никогда не изменяется.

Есть несколько способов исправить это. Лучшее, вероятно, должно каким-то образом избавиться от вашего кругового импорта. Хотя циклический импорт может работать нормально в Python, это часто является признаком плохого дизайна. Это очень плохая идея использовать его с любым модулем, который может запускаться как скрипт.

+0

Я знаю, что этот дизайн плох, я просто делал несколько быстрых тестов, чтобы проверить некоторые идеи, и я вступил в эту проблему. Я не знал, что вы описали, это будет очень полезно. Благодарю. –

3

Попробуйте это:

import other 


def main(): 
    while other.run(): 
     # some logic here 
     other.check() 

if __name__ == '__main__': 
    main() 

other.py

import main 

isRunning = True 
def run(): 
    return isRunning 

def check(): 
    global isRunning 
    someCondition = #some logic to check the condition 
    if someCondition: 
     isRunning = False 

Если бы я был вам я хотел бы использовать объекты и классы ..., глобальные методы и переменные не являются «отладки и в обслуживании»

+0

Это не работает. Не знаю, почему. – Yster

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