Python 使用multiprocessing.pool map()时,pyparsing.asDict可能出现编码错误

Python 使用multiprocessing.pool map()时,pyparsing.asDict可能出现编码错误,python,python-2.7,multiprocessing,pyparsing,Python,Python 2.7,Multiprocessing,Pyparsing,我正在尝试使用多处理.pool来加速对使用pyparsing解析的文件的解析,但是每当我尝试此操作时,都会出现多处理.pool.MaybeEncodingError异常 我已经把它缩小到与返回字典(ParseResults.asDict())有关的范围,使用asList(),错误不会发生;但是我实际解析的输入非常复杂,所以理想情况下我想使用asDict 正在解析的实际数据是一个标记元组的Erlang列表,我想将其映射到python列表。这方面的语法相当复杂,因此我得到了一个简化的测试用例(更新为

我正在尝试使用
多处理.pool
来加速对使用
pyparsing
解析的文件的解析,但是每当我尝试此操作时,都会出现
多处理.pool.MaybeEncodingError
异常

我已经把它缩小到与返回字典(
ParseResults.asDict()
)有关的范围,使用
asList()
,错误不会发生;但是我实际解析的输入非常复杂,所以理想情况下我想使用asDict

正在解析的实际数据是一个标记元组的Erlang列表,我想将其映射到python列表。这方面的语法相当复杂,因此我得到了一个简化的测试用例(更新为包含嵌套的dict):

#/usr/bin/env python2.7
从pyparsing导入*
导入多处理
dictionary=Forward()
关键字=单词(字母)
sep=抑制(“:”)
值=(键|字典)
键值=组(键+sep+值)

字典更新:自更新以来,问题发生了重大变化。不可拾取的原始点仍然存在,并留在下方

您在语法中说您使用了一个
分隔列表
,因此让我们将其添加到测试用例中:

data = ['[ foo : [ bar : baz ], cat:dog ]']
您的“
字典”
“语法对象没有理由是python dict,它是一个列表。如果您不是要将分隔符列表更改为其他内容。我已经更新了语法,允许使用
parseAction
进行适当的酸洗:

dictionary = Forward()
key   = Word(alphas)
LP, RP, sep = map(Suppress, "[]:")
value = key | dictionary
key_val = key("key") + sep + value("val")
dictionary <<= LP + delimitedList( key_val ) + RP

def parse_key_val(x): return {x.key:x.val}
key_val.setParseAction(parse_key_val)

def parse_dict(s):
    # Yes, it's a list, not a dict!
    return dictionary.parseString(s).asList()

def parse_list(s):
    return dictionary.parseString(s).asList()
原始答案: 我认为多重处理失败了,因为它不能pickle对象。你认为你有一个口述,但如果你看:

def parse_dict(s):
    val = lang.parseString(s).asDict()
    print type(val["foo"])
    return val
您将发现内部类型是
。我不知道如何递归地应用
pp.Dict
,但一个非常简单的解决方法是更改语法:

value = ( Word(alphas) )
sep   = Suppress(":")
key_val = Group( value + sep + value )
lang = Dict( Suppress('[') + delimitedList( key_val ) + Suppress(']') )
现在允许
pp.Dict
正常运行。值得一提的是,我发现我的许多多处理难题都来自于无法正确序列化的对象,因此通常我首先查看它

一个有用且相关的问题:


谢谢-在我给出的示例中,冒号确实解决了问题,但是在这种情况下,我过度简化了我的测试用例,因为我在真正的语法中遇到了问题。让我试着得到一个更具代表性的测试用例……我已经更新了这个示例——抑制分隔符不足以修复它。我将查找asDict()的源代码。@DaveRigby我已更新了我的答案。我想你的语法有些问题。或者你的例子不够完整。不管怎样,任何新的更新都可以作为一个新问题来回答。再次感谢你,我离你越来越近了。我正在解析的实际语法是erlang数据结构,它实际上映射到一个字典(它是一个任意排列的键值对列表,其中的值可以嵌套)。因此,换句话说,我确实需要返回一个dict,正如测试用例所做的那样。@DaveRigby您最好(在一个新问题中,在这里链接),发布您的语法和一些示例代码+预期输出。《pyparsing》的作者Paul在这里讲了很多,可能会有所帮助,我们作为一个社区可以查看完整的图片。
[[{'foo': {'bar': 'baz'}}, {'cat': 'dog'}]]
def parse_dict(s):
    val = lang.parseString(s).asDict()
    print type(val["foo"])
    return val
value = ( Word(alphas) )
sep   = Suppress(":")
key_val = Group( value + sep + value )
lang = Dict( Suppress('[') + delimitedList( key_val ) + Suppress(']') )