为什么pickle.dump没有写文件?

时间:2014-04-03 06:41:52

标签: python debugging pickle

我目前有一个运行了几天的项目。由于在某些执行步骤中可能会出现错误,因此我挑选了关键步骤,以便能够在正确的步骤重新启动脚本(因此我不必再执行最终执行24小时以上的工作)。

我用pickle存储的一件事是列表steps。此列表包含成功完成的每个步骤。当我再次启动脚本时,它用于跳过步骤。

问题是,在切换模块后,pickle似乎不会更新它。

代码

mainscript.py

import subscript

def set_status(mysql_script_instance_id, status, state=None):
    # [...]
    # update status in database (works as expected)
    # [...]

        if state is not None:
            with open("state.pickle", "wb") as f:
                pickle.dump(state, f)
            logging.debug("Dumped pickle. steps_done: %s" % state['steps_done'])
    logging.info(status)

subscript.py

import mainscript
[...]
logging.info("%s finished." % (step.__name__))
self.state['steps_done'].append(step.__name__)
[...]
logging.debug("self.state['steps_done'] = %s" % self.state['steps_done'])
mainscript.set_status(self.mysql_script_instance_id, "step xy done", self.state)

pickleviewer

#!/usr/bin/env python
import pickle
import pprint
state = pickle.load(open("state.pickle", "rb"))
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(state)

我尝试了什么

我收到了我预期的所有日志消息:

2014-04-03 08:23:07,727 INFO: step1 finished.
2014-04-03 08:23:07,728 DEBUG: self.state['steps_done'] = ['Fetch recordings', 'preparation', 'step1']
2014-04-03 08:23:07,927 DEBUG: Dumped pickle. steps_done: ['Fetch recordings', 'preparation', 'step1']

但是当我看到pickle文件时,我得到了:

{   [...]
    'steps_done': ['Fetch recordings', 'preparation'],
    [...]}

可能是什么错误?我该怎么做才能找到错误?

(如果open不起作用,我会得到一个例外,对吗?)

1 个答案:

答案 0 :(得分:3)

使用绝对文件路径打开pickle文件;通过使用相对路径,您现在正在当前工作目录中编写pickle文件。

您可以通过基于__file__全局的路径来编写与脚本相同的位置:

import os

here = os.path.dirname(os.path.abspath(__file__))

然后使用

with open(os.path.join(here, "state.pickle"), "wb") as f:

创建同一目录中pickle文件的绝对路径。