我正在尝试使用名为“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模块中,我试图将数据存储在一个简单的python对象和内存数据库中的ZODB的dict中:
#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。
我尝试使用db的原因是我理解线程可以创建一个全新的全局字典。然而,2个第一次测试是在同一个线程中。循环的是自己的线程,可能会产生这样的问题......?
如果它有助于我的程序按以下结构组织:
还有一个带有一些qt5 GUI文件的“view”文件夹。
IOServer尝试使用opcua模块连接到一堆OPC-UA服务器。没有线程在那里手动启动,虽然我认为opcua模块确实保持连接。
我还尝试将(id(global_data))与测试一起打印,并发现IOServer和顶级代码中的ID相同,但在cube_control.py #start_view 中更改。这些模块总是应该引用相同的模块吗?
答案 0 :(得分:0)
我还不确定究竟发生了什么。但显然这是通过删除名为manager的文件夹中的 init .py文件来解决的。现在所有导入的模块名为" global_data"指向相同的ID。
如何使用 init .py文件导致同一模块的第二个实例仍然是个谜?