2012-10-04 146 views
10

我是python的新手,正在使用mincemeat处理map问题。运行mincemeat脚本时出现以下错误。全局名称're'未定义

$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|mapfn|43] raw1.py脚本。

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

python中的“全局”变量实际上是作用于它们所绑定的模块/文件;您确实需要将它们导入每个使用它们的文件中。

模块名称只是一个像其他任何东西一样的变量。

+1

您可以看到Satyajit _does_在使用它的同一个文件中导入're'。尽管mincemeat的工作方式不同,但mapfn最终会在无法访问原始导入的上下文中执行。 –

+0

@MichaelFairley:mincemeat.py是一个没有导入的独立文件。 – geoffspear

+1

mincemeat.py是一个正在使用的库,它不依赖're'。但是,即使'mapfn'是在raw1.py中定义的,它最终会在mincemeat.py的上下文中在不同的python进程中执行。 'import'可以(也应该)添加到'mapfn'中,而不是修改库本身。 –

0

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

12

您需要在mapfn本身拥有导入声明。 mapfn在不同的python进程中执行,因此它无法访问声明它的原始上下文(包括导入)。

+0

感谢百思买!这是一个伟大的工具。我想知道,因为这个问题可能是一个普遍的现象,你可以在你的github wiki中提到这个为百果馅? – RAbraham

+0

好主意。完成! –