13

我是 python 新手,正在研究 mincemeat 的地图减少问题。运行 mincemeat 脚本时出现以下错误。

$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):
            # ....

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

4

3 回答 3

13

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

于 2012-10-06T02:46:49.487 回答
4

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

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

于 2012-10-04T10:16:42.870 回答
0

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

于 2012-10-04T10:17:15.703 回答