微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 dill

如何解决如何使用 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 的两侧都可用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。