我编写了Python脚本来处理大量的大型文本文件,可能会运行大量的时间。有时,需要停止正在运行的脚本并在以后恢复它。停止脚本的可能原因是程序崩溃,磁盘“空间不足”情况或许多其他必须执行此操作的情况。我想为脚本实现一种“停止/恢复”机制。
我将使用 pickle 和信号模块实现它。
我很高兴听到如何用pythonic方式做到这一点。
谢谢!
答案 0 :(得分:4)
这里有一些简单的东西可以帮助你:
import time
import pickle
REGISTRY = None
def main(start=0):
"""Do some heavy work ..."""
global REGISTRY
a = start
while 1:
time.sleep(1)
a += 1
print a
REGISTRY = pickle.dumps(a)
if __name__ == '__main__':
print "To stop the script execution type CTRL-C"
while 1:
start = pickle.loads(REGISTRY) if REGISTRY else 0
try:
main(start=start)
except KeyboardInterrupt:
resume = raw_input('If you want to continue type the letter c:')
if resume != 'c':
break
运行示例:
$ python test.py
To stop the script execution type CTRL-C
1
2
3
^CIf you want to continue type the letter c:c
4
5
6
7
8
9
^CIf you want to continue type the letter c:
$ python test.py
答案 1 :(得分:1)
如果您要阅读大文件,只需使用文件句柄,一次读取一行,根据需要处理每一行。如果你想保存python会话,那么只需使用dill.dump_session
- 它将保存所有现有对象。其他答案将失败,因为pickle
无法挑选文件句柄。但是,dill
可以序列化几乎每个python对象 - 包括文件句柄。
Python 2.7.9 (default, Dec 11 2014, 01:21:43)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> f = open('bigfile1.dat', 'r')
>>> data = f.readline()
>>>
>>> dill.dump_session('session.pkl')
>>>
然后退出python会话,然后重新启动。当您load_session
时,您会加载dump_session
来电时存在的所有对象。
dude@hilbert>$ python
Python 2.7.9 (default, Dec 11 2014, 01:21:43)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> dill.load_session('session.pkl')
>>> len(data)
9
>>> data += f.readline()
>>> f.close()
>>>
这很简单。
在此处获取dill
:https://github.com/uqfoundation
答案 2 :(得分:0)
执行可以让它睡不着觉,或者(除了安全例外),脚本的状态可以是pickle
d,压缩和存储。
http://docs.python.org/library/pickle.html
http://docs.python.org/library/marshal.html
http://docs.python.org/library/stdtypes.html(5.9)