1

我有一个 Python 模块,它作为无线手持计算机的服务器运行。每次手持设备向服务器发送消息时,模块都会确定它是什么类型的消息,然后组合成适当的响应。因为响应通常取决于状态,所以我在需要保留/共享处理每种类型消息的各个函数之间的信息时使用全局变量。

我遇到的问题是当应用程序关闭时(无论出于何种原因),全局变量值(当然)丢失了,所以重新启动应用程序时它与手持设备不同步。我需要一种可靠的方法来存储这些值以进行恢复。

我到目前为止(但还没有让它工作)的方向是每次更新时将变量名称及其值写入磁盘上的 CSV 文件 - 然后(当应用程序启动),查找该文件并使用它将变量分配给它们以前的状态。我编写或读取文件没有问题,但由于某种原因,这些值没有被分配。

我可以发布代码以获取评论/帮助,但在此之前,我想先弄清楚我是否走错了方向。是否有更好(或至少更可取)的方法来保存和恢复这些值?

谢谢,JDM

====

跟进。这可能有点笨拙,但这就是我所拥有的并且它正在工作。我关心的唯一全局变量是以“CUR_”开头的全局变量。我不得不使用tempDict1,因为解释器似乎不喜欢直接迭代globals().

    进口泡菜
    CUR_GLO1 = 'valglo1'
    CUR_GLO2 = 'valglo2'
    CUR_GLO3 = 'valglo3'

    定义保存球():
        tempDict1 = globals().copy()
        tempDict2 = {}
        对于 tempDict1 中的键:
            if (key[:4]=='CUR_'):tempDict2[key] = tempDict1[key]
        pickle.dump(tempDict2,open('tempDict.p','wb'))

    定义检索球():
        tempDict = pickle.load(open('tempDict.p','rb'))
        globals().update(tempDict)
4

1 回答 1

2

把它写下来作为答案..

我认为您想要做的是一种应用程序检查点形式。

您可以使用Pickle 模块方便地保存和加载 Python 变量。这是一个如何使用它的简单示例。这个关于 Stackoverflow 的讨论这个注释似乎同意,尽管我的一部分认为必须有更好的方法。

顺便说一句,您不需要将所有内容都放入字典中。只要您以正确的顺序转储和加载变量,并确保您不更改它,在中间插入数据等,您就可以转储和加载几个变量。不过,像您一样使用字典确实消除了排序依赖性。

% 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}
>>> 
于 2012-12-16T20:20:00.967 回答