我试图使用名为“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\u control.start\u 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_())
在这种情况下,运行全局_data.test()失败。打印整个全局状态显示它现在以某种方式恢复到config_manager.init_manager()的数据设置
这怎么可能
当Qt运行时,我有一个调度程序,每10秒调用一次,同时报告一个失败的测试
然而,一旦QtGUI停止(单击“x”),并且我从控制台运行测试,它就会再次成功
在全局_数据模块中,我尝试将数据存储在一个简单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的原因是我了解线程可以创建一个全新的全局字典。但是,前两个测试在同一线程中。循环线程在自己的线程中,可能会造成这样的问题
如果有帮助的话,我的计划是按照以下结构组织的:
还有一个“视图”文件夹,其中包含一些qt5 GUI文件
IOServer尝试使用opcua模块连接到一组OPC-UA服务器。那里没有手动启动线程,尽管我认为opcua模块需要保持连接
我还尝试将(id(全局_数据))与测试一起打印,发现IOServer和顶级代码中的id相同,但多维数据集控件.py#start_视图中的id发生了变化。这些不应该总是指同一个模块吗
我还不确定到底发生了什么事。但显然,这是通过删除名为manager的文件夹中的init.py文件解决的。现在,名为“global_data”的模块的所有导入都指向相同的ID
使用init.py文件如何导致同一模块的第二个实例仍然是个谜
相关问题 更多 >
编程相关推荐