保存工作区-将所有变量保存到文件中。Python没有';(我没有)

保存工作区-将所有变量保存到文件中。Python没有';(我没有),python,serialization,Python,Serialization,我不明白。非常简单且功能明显: 你有任何编程语言的代码,你运行它。在这段代码中,您生成变量,然后使用一个命令将它们(值、名称,即所有内容)保存到一个文件中。保存后,您也可以使用简单的命令在代码中打开这样的文件。 它在matlab(保存工作区,加载工作区)中工作得非常好——在python中有一些奇怪的“pickle”协议,它总是产生错误,而我所要做的就是保存变量,并在另一个会话中再次加载它(???) f、 e.不能用变量保存类(在Matlab中没有问题) 不能在cPickle中加载数组(但可以保存

我不明白。非常简单且功能明显: 你有任何编程语言的代码,你运行它。在这段代码中,您生成变量,然后使用一个命令将它们(值、名称,即所有内容)保存到一个文件中。保存后,您也可以使用简单的命令在代码中打开这样的文件。 它在matlab(保存工作区,加载工作区)中工作得非常好——在python中有一些奇怪的“pickle”协议,它总是产生错误,而我所要做的就是保存变量,并在另一个会话中再次加载它(???) f、 e.不能用变量保存类(在Matlab中没有问题) 不能在cPickle中加载数组(但可以保存它们(?????) 为什么不让它变得更容易呢?
有没有办法用值保存当前变量,然后加载它们?

您所描述的是Matlab环境功能,而不是编程语言。 您需要的是一种存储某个对象的序列化状态的方法,这几乎可以在任何编程语言中轻松完成。在python世界中,pickle是实现它的最简单的方法,如果您能够提供关于它产生的错误的更多细节,人们可能会向您提供关于这方面的更多细节。
一般来说,对于面向对象语言(包括python),将您的状态封装到单个对象中,然后对其进行序列化和反序列化,然后存储/加载此类实例,这是一种很好的方法。对这些对象的pickle和unpickle对于许多开发人员来说都非常有效,因此这一定是您的实现所特有的。

PiCloud实现了一个更为奇特的pickle,但我找不到代码。我看到了一个


通常在Python中,实例化对象没有任何一种方法来重新创建它们,在某些情况下,它特别困难(如打开的文件),因为它需要几个步骤来重新创建。

既然您在谈论Matlab,您可能想试试IPython,这是一个用于Python的shell,提供了比执行Python时获得的标准解释器shell多得多的功能

该功能包括加载/保存工作区会话、在会话输入之外创建宏等功能,这可能更像是您在Matlab中使用的功能(我实际上使用了这两种功能,并且发现IPython更加优雅,但是YMMV):


我不同意在Matlab中保存变量是一个环境函数的说法。matlab中的“save”语句是一个函数,是matlab语言的一部分,而不仅仅是一个命令。它是一个非常有用的函数,因为您不必担心文件i/o的琐碎细节,它可以处理来自标量、矩阵、对象和结构的各种变量。

这是一个旧线程,但是我想我还是应该把它扔出去——科学的Python开发环境允许您通过
变量资源管理器来实现这一点。那里有一个按钮
保存数据
,它将您的整个工作区打包到一个
.spydata
文件中,您可以稍后重新加载该文件。当你在项目之间切换时,它就像一种魅力

下面是一个很好的方法(使用模块dill)。谢谢你的回复。cPickle可以很好地处理简单变量,但我有一个50mb的大数据库。我在这里描述了哪里出了问题——不幸的是,我没有得到答案,所以我陷入了困境。我需要保存列表,但由于此错误,当我保存列表时,它不会加载。所以我在寻找另一种方法。似乎您的问题与Pickle无关,而是与您的代码隐式依赖的某个库有关。我将尝试在原始线程中用我的想法回答您,但这肯定与pickle无关,尽管pickle(或一般序列化)大型数据集(50mb是用于序列化的大型数据集)不是一个好主意,您可能需要寻找替代方案。您可能需要研究MongoDB或CouchDB之类的文档存储,以JSON格式存储数据?现在获取picloud代码要容易得多——它是pypi格式的,所以“pip安装云”可以工作。有关pickle任意python代码及其依赖项的示例,请参见。