如何使用 dill

问题描述

我正在尝试用 dill 腌制函数。我想包括整个功能,而不仅仅是对它的引用。这是我的两个文件

fun.py:

import dill
from foo import ppp

def qqq(me):
    return me + 1

print(dill.dumps(ppp,protocol=4,recurse=True,byref=True))
print(dill.dumps(qqq,byref=True))

和 foo.py

def qqq(me):
    return me + 1

当我运行 fun.py 时,我得到以下输出

b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00\x8c\x03foo\x94\x8c\x03ppp\x94\x93\x94.'
b'\x80\x04\x95\x90\x00\x00\x00\x00\x00\x00\x00\x8c\ndill._dill\x94\x8c\x10_create_function\x94\x93\x94(h\x00\x8c\n_load_type\x94\x93\x94\x8c\x08CodeType\x94\x85\x94R\x94(K\x01K\x00K\x01K\x02KCC\x08|\x00d\x01\x17\x00S\x00\x94NK\x01\x86\x94)\x8c\x02me\x94\x85\x94\x8c\x06fun.py\x94\x8c\x03qqq\x94K\x04C\x02\x00\x01\x94))t\x94R\x94}\x94h\rNN}\x94Nt\x94R\x94.'

我希望能够让第一行输出和第二行更加相似,并且在后面重新加载时实际封装函数而不需要上下文。有没有办法做到这一点?

非常感谢! 詹姆斯

解决方法

如果模块 (foo) 安装在两台计算机上,那么除了导入函数之外,不需要做任何事情。因此,我假设问题与仅安装在第一台机器上的模块有关。

这还取决于模块 foo 是“安装”在 sys.path 上还是仅在当前目录中可用。看: https://github.com/uqfoundation/dill/issues/123

如果它只在当前目录中可用,要么使用dill来pickle文件本身或使用类似dill.source.getsource的东西将模块的源提取为字符串,然后将字符串传输为“泡菜”(这就是 ppft 的作用)。

然而,一般来说,dill 通过引用腌制导入的函数,因此假设它们在 load/dump 的两侧都可用。