2012-10-04 10 views
10

私はpythonに新しく、地図上で作業していますが、mincemeatの問題を軽減できます。 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

hurray、courseraの大きなデータコースの仲間を見てうれしいです。 – RAbraham

答えて

3

Pythonの「グローバル」変数は、実際にはバインドされているモジュール/ファイルにスコープされています。それらを使用するすべてのファイルでそれらをインポートする必要があります。

モジュール名は他のものと同じような変数です。

+1

Satyajitは、使用されているのと同じファイルに 're'をインポートしています。しかし、ミンスクミートがうまくいくように、mapfnは元のインポートにアクセスできないコンテキストで実行されます。 –

+0

@MichaelFairley:mincemeat.pyは、インポートのない別のファイルです。 – geoffspear

+1

mincemeat.pyは、 're'に依存しない、使用されているライブラリです。しかし、 'mapfn'がraw1.pyで定義されていても、mincemeat.pyのコンテキストで別のpythonプロセスの中で実行されてしまいます。ライブラリ自体を変更するのではなく、 'import'を' mapfn'に追加することができます。 –

0

あなたは既にこの質問に答えているようです。 mincemeat.pyでreを使用する場合は、reをimportする必要があります。

12

mapfnにインポートステートメントが必要です。 mapfnは、別のPythonプロセスで実行されるため、宣言された元のコンテキスト(インポートを含む)にアクセスすることはできません。

+0

mincemeatありがとう!それは素晴らしいツールです。私はこの質問が一般的な出来事であるかもしれないので疑問に思っていました、あなたはミンスミーのためのあなたのgithub wikiでこれを言えるでしょうか? – RAbraham

+0

良いアイデア。完了! –

関連する問題