2012-10-04 11 views
10

Jestem nowym użytkownikiem Pythona i praca nad mapą zmniejsza problem z mielonym mięsem. Otrzymuję następujący błąd podczas uruchamiania skryptu mincemeat.globalna nazwa "re" nie jest zdefiniowana

$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]) 

Mój kod spoczywa w raw1.py skryptu, który jest podany w powyższym stacktrace jako [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): 
      # .... 

Zaimportowałem już re w raw1.py. Błąd nie pojawia się, jeśli importuję plik re w pliku mincemeat.py.

+3

hurra, z radością widzę kolegę z kursu big data na Courserze. – RAbraham

Odpowiedz

3

Zmienne "globalne" w pythonie są w rzeczywistości ograniczone do modułu/pliku, do którego są przypisane; musisz zaimportować je do każdego pliku, który ich używa.

Nazwa modułu to tylko zmienna, jak cokolwiek innego.

+1

Możesz zobaczyć, że Satyajit _does_ import 're' w tym samym pliku, w którym jest używany. Zrób tak, jak działa mincemeat, mapfn kończy działanie w kontekście, w którym nie ma dostępu do oryginalnego importu. –

+0

@MichaelFairley: mincemeat.py to osobny plik bez importu. – geoffspear

+1

mincemeat.py jest biblioteką, która jest używana bez zależności od 're'. Jednakże, mimo iż 'mapfn' jest zdefiniowany w raw1.py, kończy się wykonywanie w innym procesie Pythona w kontekście mincemeat.py. Zamiast modyfikować samą bibliotekę, 'import' może (i powinien) być dodany do' mapfn'. –

0

Wygląda na to, że już odpowiedziałeś na to pytanie. Jeśli użyjesz ponownie w mincemeat.py, musisz również zaimportować tam ponownie.

12

Musisz mieć instrukcję importu w samym mapfn. mapfn zostaje wykonany w innym procesie Pythona, więc nie ma dostępu do oryginalnego kontekstu (w tym importu), w którym został zadeklarowany.

+0

Dzięki za mięso mielone! To wspaniałe narzędzie. Zastanawiam się, skoro to pytanie może być częstym zjawiskiem, możesz to wspomnieć w swojej wiki github dla mięsa mielonego? – RAbraham

+0

Dobry pomysł. Gotowe! –

Powiązane problemy