Общее глобальное состояние в программе qt5 python 3.6

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

from view import cube_control
from ioserver.ioserver import IOServer
from manager import config_manager, global_data
if __name__ == "__main__":
    #sets up initial data
    config_manager.init_manager()
    #modifies data
    io = IOServer()
    #verify global data modified from IOServer.__init__
    global_data.test() #success
    #start pyqt GUI
    cube_control.start_view()

Все идет нормально. Однако в последней строке cube_control.start_view() он вводит этот код:

#inside cube_control.py
def start_view():
    #verify global data modified from IOServer.__init__
    global_data.test() #fail ?!?!
    app = QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

Запуск global_data.test() в этом случае завершается неудачно. печать всего глобального состояния показывает, что теперь он каким-то образом возвращается к настройке данных с помощью config_manager.init_manager()

Как это возможно?

Во время работы Qt у меня есть планировщик, который вызывается каждые 10 секунд, а также сообщает о неудачном тесте.

Однако, как только графический интерфейс Qt остановлен (нажат "x"), и я запускаю тест из консоли, он снова проходит успешно.

Внутри модуля global_data я попытался сохранить данные в виде dict внутри как простого объекта python, так и ZODB в базе данных памяти:

#inside global_data
state = {
    "units" : {}
}
db = ZODB.DB(None) #creates an in memory db
def test(identity="no-id"):
    con = db.open()
    r = con.root()
    print("test online: ", r["units"]["local-test"]["online"], identity)
    con.close()

Оба имеют одинаковую проблему. Выше тест проводится только с использованием БД.

Причина, по которой я попытался использовать базу данных, заключается в том, что я понимаю, что потоки могут создавать совершенно новый глобальный словарь. Однако 2 первых теста находятся в одной теме. Циклический находится в своем собственном потоке и может потенциально создать такую ​​проблему...?

Файловая организация

Если это помогает, моя программа организована со следующей структурой:

Также есть папка "view" с некоторыми файлами графического интерфейса qt5.

IOServer пытается подключиться к группе серверов OPC-UA с помощью модуля opcua. Там не запускаются никакие потоки, хотя я полагаю, что модуль opcua остается подключенным.

Идентификатор global_data ()

Я попытался также напечатать (id(global_data)) вместе с тестами и обнаружил, что идентификатор идентичен в коде IOServer AND верхнего уровня, но изменяется внутри cube_control.py # start_view. Разве они не должны всегда относиться к одному и тому же модулю?

1 ответ

Я до сих пор не уверен, что именно произошло. Но, видимо, это было решено удалением файла init.py внутри папки с именем manager. Теперь все импорты модуля с именем "global_data" указывают на один и тот же идентификатор.

Как использование файла инициализации.py вызвало второй экземпляр того же модуля остается загадкой

Другие вопросы по тегам