我有一個鹹菜轉儲這是我從一個朋友了,他問我讀它喜歡:Python:如何閱讀pickle dump?
f = open('file.pickle')
import pickle
l = pickle.loads(f.read())
但我得到一個ImportError
說no module named sql.models
有人可以幫助我明白髮生了什麼?
我有一個鹹菜轉儲這是我從一個朋友了,他問我讀它喜歡:Python:如何閱讀pickle dump?
f = open('file.pickle')
import pickle
l = pickle.loads(f.read())
但我得到一個ImportError
說no module named sql.models
有人可以幫助我明白髮生了什麼?
您缺少重建醃製對象所需的代碼。
Pickles存儲可以從中導入類的位置,以及實例屬性。原始模塊仍然需要重新創建模塊。從documentation:
請注意,函數(內置的和用戶定義的)由「完全限定」的名稱引用而不是按值賦值。這意味着只有函數名稱被醃漬,以及定義該函數的模塊的名稱。該函數的代碼及其任何函數屬性都不會被醃製。因此,定義模塊必須可以在取消環境中導入,並且模塊必須包含指定的對象,否則將引發異常。 [4]
類似地,類按名稱引用進行醃製,因此在取消環境中應用相同的限制。需要注意的是無類的代碼或數據的酸洗,所以在下面的例子中,class屬性
attr
在在unpickle環境沒有恢復:class Foo: attr = 'a class attr' picklestring = pickle.dumps(Foo)
這些限制是爲什麼picklable函數和類必須在頂部定義級別的模塊。
換句話說,用於原始數據創建鹹菜包括一個名爲sql.models
模塊中始發一個自定義類中的至少一個實例。
請仔細閱讀任意泡菜,即使是朋友。 pickle只是一種重新生成任意Python結構的堆棧語言。你可以構建一個泡菜,在你的計算機上產生一個祕密的後門服務器,並有足夠的決心和技巧。該pickle
機制的文檔警告你明確:
警告:該
pickle
模塊並非意在對抗錯誤或惡意構造的數據安全。切勿取消從不可信或未經認證的來源收到的數據。
這有been a problem in the past,即使是經驗豐富的開發人員。
我是否需要編寫這些類? –
@DeankankarBajpeyi:我會問你的朋友的代碼;你將無法單獨從鹹菜中重建原來的課程。 –
謝謝。我懷疑他是否想爲我的系統設置一個後門:P但我會小心:D –