【问题标题】:How to backup and restore python current working environment?如何备份和恢复python当前工作环境?
【发布时间】:2013-07-09 10:54:07
【问题描述】:

我想写一个函数'backup(filename)'来存储当前Python环境下的所有工作数据(对象?),以及'restore(filename)'再次恢复数据/对象。就像R的save.image(file="workspace21.RData")load(file="workspace21.RData")一样,可以对系统进行快照。

如何写“备份”和“恢复”?或者是否有任何软件包可以做到这一点?

【问题讨论】:

  • 你的意思是像pickle
  • 有点像泡菜。我需要它来腌制整个工作区,但一些 python 对象不是可腌制的,所以我怀疑腌制是解决方案。
  • 例如 matplotlib.figure.Figure 对象不可腌制,cPickle.dump(fig, open("Z:\\pic.pkl",'w'), cPickle.HIGHEST_PROTOCOL) 会有TypeError: 预期的字符串或 Unicode 对象,发现 NoneType
  • 嗯,我发现 this 这听起来与尝试腌制 matplotlib 数字有关。 @pelson 说 1.2 版应该支持酸洗,但如果我自己没有尝试,我无法发表评论。
  • matplotlib 图只是一个示例,可能存在其他类型的不可腌制对象。

标签: python backup


【解决方案1】:

pickle 模块似乎是一个解决方案,但它并不能真正为您保存整个环境。试试这个:

import pickle

def backup(fileName):
    pickle.dump(globals(), open(fileName,'w'), pickle.HIGHEST_PROTOCOL)

def restore(fileName):
    globals().update(pickle.load(open(fileName,"rb"))) 

这将不起作用,因为模块对象不可提取。您还将遇到打开文件描述符和其他对象的问题。有关(部分)解决方案,请参阅此问题的答案:

How can I save all the variables in the current python session?

因此,虽然您无法为您的问题找到一个通用的解决方案,但如果有帮助,您可以使用上面的 sn-p 作为起点编写一些可以保存您的一些(全局)对象的东西。

【讨论】:

  • 对我来说还有一个问题是如何通过函数将存储的变量从腌制文件加载到 global() 命名空间。 def restore(fileName): cPickle.load(open(fileName,"rb")) 似乎无法将变量恢复到全局命名空间。
  • 你可以这样做:globals().update(cPickle.load(open(fileName,"rb")))
【解决方案2】:

有点开箱即用,但如果这很重要并且您确实需要完整的解决方案,您可以在虚拟机中运行 python 并使用快照来保存会话状态。是否实用取决于您的用例。

【讨论】:

  • 好提示。虽然它是一个有点重量级的解决方案。
【解决方案3】:

你应该看看pickle documentation。你还有an example,可以帮助你做你想做的事。

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2012-01-14
    • 2011-07-02
    相关资源
    最近更新 更多