如何获取 python 函数的酸洗依赖项?
Posted
技术标签:
【中文标题】如何获取 python 函数的酸洗依赖项?【英文标题】:How to get a python function's dependencies for pickling? 【发布时间】:2012-04-10 02:08:14 【问题描述】:作为对这个问题的跟进: How to pickle a python function with its dependencies?
确定方法的依赖关系的好方法是什么?例如,类似于上面的帖子,如果我有一个使用方法 g 和 y 的函数 f,是否有一种简单的方法可以动态获取对 g 和 y 的引用?
此外,我猜您可能希望此方法递归整个函数图,这样如果 y 依赖于 z,您也可以捆绑 z。
我看到迪斯科为此使用了以下模块: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/modutil.py
关于如何解决这个问题的任何其他建议? disco 方法似乎是基于模块的,因此您可能需要捆绑比实际执行 root 方法所需的更多内容。
【问题讨论】:
【参考方案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 会话。这对你的问题来说有点过分了,但它也可以。
【讨论】:
以上是关于如何获取 python 函数的酸洗依赖项?的主要内容,如果未能解决你的问题,请参考以下文章