全局名称're'未定义

13

我是Python的新手,在使用mincemeat处理MapReduce问题时遇到了以下错误。

$python mincemeat.py -p changeme localhost
error: uncaptured python exception, closing channel <__main__.Client connected at 0x923fdcc> 
(<type 'exceptions.NameError'>:global name 're' is not defined
 [/usr/lib/python2.7/asyncore.py|read|79]
 [/usr/lib/python2.7/asyncore.py|handle_read_event|438] 
 [/usr/lib/python2.7/asynchat.py|handle_read|140]
 [mincemeat.py|found_terminator|96]
 [mincemeat.py|process_command|194]
 [mincemeat.py|call_mapfn|170]
 [raw1.py|mapfn|43])

我的代码放在raw1.py脚本中,该脚本在上面的堆栈跟踪中显示为[raw1.py | mapfn | 43]

import re
import mincemeat

# ...

allStopWords = {'about':1, 'above':1, 'after':1, 'again':1}

def mapfn(fname, fcont):
    # ...
    for item in tList[1].split():
        word = re.sub(r'[^\w]', ' ', item).lower().strip()        # ERROR
        if (word not in allStopWords) and (len(word) > 1):
            # ....

我已经在raw1.py中导入了re。 如果我在mincemeat.py中导入re,则错误不会出现。


3
太好了,很高兴见到来自Coursera大数据课程的同学。 - RAbraham
3个回答

13

您需要在mapfn函数本身中编写导入语句。 mapfn在一个不同的Python进程中执行,因此它无法访问它声明时的原始上下文(包括导入项)。


感谢Mincemeat!这是一个很棒的工具。我在想,既然这个问题可能是一个常见的情况,你能否在你的Mincemeat Github Wiki中提到它? - RAbraham

4
在Python中,“全局”变量实际上是限定在模块/文件范围内的;你需要在每个使用它们的文件中导入它们。
模块名称只是像其他变量一样的变量。

1
你可以看到Satyajit在同一文件中导入了re,并在其中使用它。但由于mincemeat的工作方式,mapfn最终在一个无法访问原始导入的上下文中执行。 - Michael Fairley
@MichaelFairley:mincemeat.py是一个独立的文件,没有导入。 - Wooble
1
mincemeat.py是一个库,它被使用时不依赖于re。然而,尽管mapfn在raw1.py中被定义,但它最终被执行在mincemeat.py上下文的不同python进程中。与其修改库本身,应该将import添加到mapfn中。 - Michael Fairley

0

听起来你已经回答了这个问题。如果你在mincemeat.py中使用re,那么你也需要在那里导入re。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接