我有一个Python模块,作为无线掌上电脑的服务器运行。每次掌上电脑向服务器发送消息时,模块都会确定它是什么类型的消息,然后组装适当的响应。因为响应通常依赖于状态,所以我使用全局变量来保存/共享处理每种消息类型的各个函数之间的信息。
我遇到的问题是当应用程序关闭时(无论出于何种原因),全局变量值(当然)都会丢失,因此在重新启动应用程序时它与掌上电脑不同步。我需要一种可靠的方法来存储这些值以进行恢复。
我到目前为止的方向(但尚未开始工作)是将变量名称及其值写入磁盘上的CSV文件,每次更新时 - 然后(当应用程序启动),查找该文件并使用它将变量分配给以前的状态。我在编写文件或阅读文件时没有任何问题,但由于某种原因,这些值并没有被分配。
我可以发布评论/帮助的代码,但在此之前我想知道我是否只是首先走错了方向。是否有更好(或至少是更好的)方法来保存和恢复这些值?
感谢, JDM
====
跟进。它可能是一个笨拙的触摸,但这是我拥有的,它的工作。我关心的唯一全局变量是以“CUR_”开头的全局变量。我不得不使用tempDict1
,因为解释器似乎不喜欢直接在globals()
上进行迭代。
import pickle CUR_GLO1 = 'valglo1' CUR_GLO2 = 'valglo2' CUR_GLO3 = 'valglo3' def saveGlobs(): tempDict1 = globals().copy() tempDict2 = {} for key in tempDict1: if (key[:4]=='CUR_'):tempDict2[key] = tempDict1[key] pickle.dump(tempDict2,open('tempDict.p','wb')) def retrieveGlobs(): tempDict = pickle.load(open('tempDict.p','rb')) globals().update(tempDict)
答案 0 :(得分:2)
将其写成答案..
我认为你想做的是一种application checkpointing。
您可以使用Pickle module方便地保存和加载Python变量。这是simple example如何使用它。 This discussion on Stackoverflow和this note似乎同意,尽管我的一部分认为必须有更好的方法。
顺便说一句,您不需要将所有内容都放入字典中。只要以正确的顺序转储和加载变量,并确保不更改它,在中间插入数据等,您就可以转储并加载多个变量。像你一样使用字典确实删除了排序依赖。
% python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> foo=123
>>> bar="hello"
>>> d={'abc': 123, 'def': 456}
>>> f=open('p.pickle', 'wb')
>>> pickle.dump(foo, f)
>>> pickle.dump(bar, f)
>>> pickle.dump(d, f)
>>> ^D
% python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> f=open('p.pickle','rb')
>>> foo=pickle.load(f)
>>> foo
123
>>> bar=pickle.load(f)
>>> bar
'hello'
>>> d=pickle.load(f)
>>> d
{'abc': 123, 'def': 456}
>>>