我有一个从朋友那里得到的泡菜转储,他让我读它:
f = open('file.pickle')
import pickle
l = pickle.loads(f.read())
但我得ImportError
说no module named sql.models
有人可以帮我理解发生了什么吗?
答案 0 :(得分:5)
您缺少重建pickle对象所需的代码。
Pickles存储可以从中导入类的位置以及实例属性。仍需要原始模块来重新创建模块。来自documentation:
请注意,函数(内置和用户定义)由“完全限定”的名称引用而非值引用。这意味着只有函数名称被腌制,以及定义函数的模块的名称。函数的代码或其任何函数属性都不会被pickle。因此,定义模块必须可以在unpickling环境中导入,并且模块必须包含命名对象,否则将引发异常。 [4]
类似地,类通过命名引用进行pickle,因此适用于unpickling环境中的相同限制。请注意,没有类的代码或数据被pickle,因此在以下示例中,类属性
attr
未在unpickling环境中恢复:class Foo: attr = 'a class attr' picklestring = pickle.dumps(Foo)
这些限制是为什么必须在模块的顶层定义可选择的函数和类。
换句话说,用于创建 pickle的原始数据包括至少一个源自名为sql.models
的模块的自定义类的实例。
小心阅读任意泡菜,即使是朋友。 pickle只是一种重用任意Python结构的堆栈语言。您可以构建一个在您的计算机上生成秘密后门服务器的pickle,具有足够的决心和技能。 pickle
文档明确警告您:
警告:
pickle
模块无意对抗错误或恶意构造的数据。切勿取消从不受信任或未经身份验证的来源收到的数据。
即使对于有经验的开发人员,也有been a problem in the past。