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)
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不起作用,我会得到一个例外,对吗?)
使用绝对文件路径打开你的泡菜文件;通过使用相对路径,您现在正在当前工作目录中编写泡菜文件。
您可以根据__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文件的绝对路径。