我有来自BeautifulSoup
的汤,我无法腌制。当我尝试pickle对象时,python解释器默默地崩溃(这样它就不能作为例外处理)。我必须能够使用multiprocessing
包(用于在对象之间传递它们来腌制对象)来挑选对象以返回对象。我该如何解决/解决问题?不幸的是,我无法发布该页面的html(它不公开),我一直无法找到问题的可重现的例子。我试图通过循环汤和酸洗单个组件来隔离问题,产生错误的最小的东西是<class 'BeautifulSoup.NavigableString'>
。当我打印对象时,它打印出u'\n'
。
答案 0 :(得分:5)
NavigableString
类使用的pickle
或cPickle
无法序列化multiprocessing
。但是,您应该可以使用dill
序列化此类。 dill
具有pickle
接口的超集,可以序列化大部分python。 multiprocessing
仍然会失败,除非您使用multiprocessing
使用dill
的{{1}}分叉,名为pathos.multiprocessing
。
在此处获取代码:https://github.com/uqfoundation。
有关更多信息,请参阅: What can multiprocessing and dill do together?
http://matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/
答案 1 :(得分:2)
如果您不需要漂亮的汤对象本身,但汤的某些产品,即文本字符串,您可以在酸洗之前从较大的对象中删除BeautifulSoup属性,方法是将以下代码添加到类定义中:
class MyObject(MyObject):
def __getstate__(self):
for item in dir(self):
item_type = str(type(getattr(self, item)))
if 'BeautifulSoup' in itype:
delattr(self, item)
return self.__dict__
答案 2 :(得分:1)
事实上,正如dekomote所建议的那样,你只需要采取一种优势,即你可以将汤转换为unicode字符串,然后再将unicode字符串转回汤中。
所以恕我直言,你不应该尝试通过多处理包传递汤对象,而只是代表汤的字符串。