1

我有一个从朋友那里得到的泡菜垃圾堆,他让我读起来像:

f = open('file.pickle')
import pickle
l = pickle.loads(f.read())

但我得到一个ImportError说法no module named sql.models

有人可以帮我了解发生了什么吗?

4

1 回答 1

5

您缺少重建腌制对象所需的代码。

Pickles 存储可以从中导入类的位置以及实例属性。仍然需要原始模块来重新创建模块。从文档中:

请注意,函数(内置的和用户定义的)是通过“完全限定”名称引用而不是值来腌制的。这意味着只有函数名和定义函数的模块的名称被腌制。函数的代码和它的任何函数属性都没有被腌制。因此,定义模块必须在 unpickling 环境中是可导入的,并且模块必须包含命名对象,否则将引发异常。[4]

类似地,类是通过命名引用来腌制的,因此在 unpickling 环境中适用相同的限制。请注意,没有任何类的代码或数据被腌制,因此在以下示例中,类属性attr不会在 unpickling 环境中恢复:

class Foo:
    attr = 'a class attr'

picklestring = pickle.dumps(Foo)

这些限制是为什么必须在模块的顶层定义可提取函数和类的原因。

换句话说,用于创建泡菜的原始数据包括至少一个自定义类的实例,该类源自名为sql.models.

一定要小心阅读任意泡菜,即使是来自朋友的。pickle 只是一种重新创建任意 Python 结构的堆栈语言。有足够的决心和技巧,您可以构建一个在您的计算机上生成秘密后门服务器的泡菜。该pickle文档明确警告您:

警告:该pickle模块并非旨在防止错误或恶意构建的数据。永远不要取消从不受信任或未经身份验证的来源收到的数据。

在过去一直是个问题,即使对于有经验的开发人员也是如此。

于 2013-04-16T19:54:06.493 回答