作为这个问题的后续行动: How to pickle a python function with its dependencies?
确定方法依赖关系的好方法是什么?例如,类似于上面的帖子,如果我有一个使用方法g和y的函数f有一种简单的方法来动态获取对g和y的引用吗?
此外,我猜你会希望这个方法能够递归整个函数图,这样如果y依赖于z,你也可以捆绑z。
我看到disco使用以下模块: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/modutil.py
有关如何解决此问题的任何其他建议?迪斯科方法似乎是基于模块的,因此您可能需要捆绑超过实际执行根方法所需的内容。
答案 0 :(得分:1)
为此,我使用dill,它可以序列化python中的几乎任何东西。 Dill还有some good tools帮助您了解在代码失败时导致酸洗失败的原因。
>>> import dill
>>> dill.loads(dill.dumps(your_bad_object))
>>> ...
>>> # if you get a pickling error, use dill's tools to figure out a workaround
>>> dill.detect.badobjects(your_bad_object, depth=0)
>>> dill.detect.badobjects(your_bad_object, depth=1)
>>> ...
如果你绝对想要,可以使用dill的badobjects
(或其他检测函数之一)递归地潜入对象的引用链,然后弹出不可触摸的对象,而不是每次调用它深度,如上所述。
此外,objgraph对测试套件也非常方便。
>>> # visualize the references in your bad objects
>>> objgraph.show_refs(your_bad_object, filename='your_bad_object.png')
或者,正如我在上面提到的帖子中提到的,你可以使用dill在一个命令中挑选整个python会话。这对你的问题有点矫枉过正,但也有效。