为什么pickle.dump 不写文件?

Mar*_*oma 3 python debugging pickle

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

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

问题是,在我切换模块后,pickle 似乎没有更新它。

代码

主脚本文件

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)
Run Code Online (Sandbox Code Playgroud)

下标.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)
Run Code Online (Sandbox Code Playgroud)

泡菜查看器

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

我试过的

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

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']
Run Code Online (Sandbox Code Playgroud)

但是当我查看泡菜文件时,我得到:

{   [...]
    'steps_done': ['Fetch recordings', 'preparation'],
    [...]}
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ers 6

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

您可以根据__file__全局路径在与脚本相同的位置写入:

import os

here = os.path.dirname(os.path.abspath(__file__))
Run Code Online (Sandbox Code Playgroud)

然后使用

with open(os.path.join(here, "state.pickle"), "wb") as f:
Run Code Online (Sandbox Code Playgroud)

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