Я безуспешно пытаюсь использовать модуль с именем 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 GUI остановлен (щелкнул «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()
У обоих одна и та же проблема. Выше тест выполняется только с использованием db.
Причина, по которой я попытался использовать базу данных, заключается в том, что я понимаю, что потоки могут создавать совершенно новый глобальный словарь. Однако 2 первых теста находятся в одном потоке. Циклический находится в отдельном потоке и потенциально может создать такую проблему ...?
Если это поможет, моя программа имеет следующую структуру:
Также есть папка "view" с некоторыми файлами графического интерфейса qt5.
IOServer пытается подключиться к группе серверов OPC-UA с помощью модуля opcua. Никакие потоки там не запускаются вручную, хотя я полагаю, что модуль opcua поддерживает подключение.
Я попытался также напечатать (id (global_data)) вместе с тестами и обнаружил, что идентификатор такой же в IOServer И код верхнего уровня, но изменения внутри cube_control.py # start_view. Разве они не должны всегда относиться к одному и тому же модулю?






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