我正在尝试使用MPI向其他python进程广播模块。当然,模块本身不是pickleable,但__dict__
是。目前,我正在挑选__dict__
并在接收过程中创建一个新模块。这与一些简单的自定义模块完美配合。然而,当我尝试用NumPy做这件事时,有一件事我不能轻易腌制:ufunc
。
我已经阅读过这个帖子,建议挑选__name__
的{{1}}和__module__
,但似乎他们依赖于在重建之前完全构建和存在numpy。我需要避免在接收过程中一起使用ufunc
语句,所以我很好奇所提到的import
语句是否适用于没有getattr(numpy,name)
s的模块包括在内。
另外,我在NumPy文档中的ufunc
上看不到__module__
属性:
http://docs.scipy.org/doc/numpy/reference/ufuncs.html
请提供任何帮助或建议?
编辑:对不起,忘了包含上面提到的帖子。 http://mail.scipy.org/pipermail/numpy-discussion/2007-January/025778.html答案 0 :(得分:3)
在Python中挑选一个函数只会序列化它的名称及其来自的模块。它不会通过线路传输代码,因此在取消连接时,您需要提供与酸洗时相同的库。在unpickling上,Python只是导入有问题的模块,并通过getattr
抓取项目。 (这不仅限于Numpy,但一般适用于酸洗。)
Ufuncs不干净,这是一个疣。你的选择主要是腌制ufunc的__name__
(也许是__class__
),然后手动重建它们。 (它们实际上不是Python函数,并且没有__module__
属性。)