1

作为这个问题的后续: 如何腌制一个python函数及其依赖项?

确定方法的依赖关系的好方法是什么?例如,与上面的帖子类似,如果我有一个使用方法 g 和 y 的函数 f,是否有一种简单的方法可以动态获取对 g 和 y 的引用?

此外,我猜你会希望这个方法递归整个函数图,这样如果 y 依赖于 z,你也可以捆绑 z。

我看到迪斯科为此使用了以下模块: https ://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/modutil.py

关于如何解决这个问题的任何其他建议?迪斯科方法似乎是基于模块的,因此您可能需要捆绑比实际执行根方法所需的更多内容。

4

1 回答 1

1

为此,我会使用dill,它可以在 python 中序列化几乎任何东西。Dill 还提供了一些很好的工具,可以帮助您了解在代码失败时导致酸洗失败的原因。

>>> 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 会话。对于您的问题来说,这有点矫枉过正,但它也可以。

于 2013-10-16T21:21:18.620 回答