Общее глобальное состояние в программе 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 вызвало второй экземпляр того же модуля остается загадкой