腌制后的文件是voc_final.pkl,在论文GAMENet中使用的源代码中。
我尝试加载它:
import dill
voc = dill.load(open("voc_final.pkl", 'rb'))
但出现错误:
TypeError: code expected at least 16 arguments, got 15
这很奇怪,因为即使 pickled 文件包含另一个库中的未知类,而该类在我的计算机中不可用。腌制文件的加载应该没问题。我测试了这个场景:
写泡菜:
import dill
class XYZ():
def __init__(self, i):
self.x = i
self.y = {}
def do_something(k):
return k + 10
p = XYZ(10)
with open('test.pkl','wb') as output:
dill.dump(obj={"aaa": p}, file=output)
在另一个 Python 会话中加载 pickle :
import dill
with open('test.pkl','rb') as input:
kkk = dill.load(input)
这工作得很好! 我想知道加载 pickled 文件时可能会出现什么错误?当然,不是像“文件未找到”、“文件正在使用”等小错误。
也许是因为Python版本不同,正如
这里所说:“也不能保证不同版本的Python之间的兼容性,因为并不是每个Python数据结构都可以被模块序列化。”? 再现性
3.11.7
,原作者:
3.6
)。我检查了他们的 Jupyter Notebook,发现他们正在使用 Anaconda 和 Python 3.6。我创建了相同的环境(Python 3.6)并且可以加载腌制文件:
import dill
voc = dill.load(open("voc_final.pkl", 'rb'))
输出:
{'diag_voc': <__main__.Voc at 0x7fb058f14d68>,
'med_voc': <__main__.Voc at 0x7fb058ecce80>,
'pro_voc': <__main__.Voc at 0x7fb058edd0b8>}
如果任何已发布的 Python 源代码包含
requirements.txt
,那就太好了。