我目前有一个运行了几天的项目。由于在某些执行步骤中可能会出现错误,因此我挑选了关键步骤,以便能够在正确的步骤重新启动脚本(因此我不必再执行最终执行24小时以上的工作)。
我用pickle存储的一件事是列表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)
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)
#!/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
不起作用,我会得到一个例外,对吗?)
答案 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文件的绝对路径。