2012-10-04 13 views
10

Sono nuovo in Python e lavorare su una mappa riduce il problema con carne tritata. Sto ottenendo il seguente errore durante l'esecuzione dello script mincemeat.nome globale 're' non definito

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

Il mio codice riposa in raw1.py script che è dato nella stacktrace sopra come [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): 
      # .... 

Ho già importato re in raw1.py. L'errore non viene visualizzato se importare re in mincemeat.py.

+3

hurray, felice di vedere un collega studente del corso Big Data a Coursera. – RAbraham

risposta

3

Le variabili "globali" in python sono effettivamente associate al modulo/file a cui sono associate; devi importarli in ogni file che li utilizza.

Un nome di modulo è solo una variabile come qualsiasi altra cosa.

+1

È possibile vedere che Satyajit _does_ importa 're' nello stesso file in cui è utilizzato. Per quanto riguarda il funzionamento di mincemeat, mapfn termina l'esecuzione in un contesto in cui non ha accesso alle importazioni originali. –

+0

@MichaelFairley: mincemeat.py è un file separato senza importazione. – geoffspear

+1

mincemeat.py è una libreria in uso che non ha dipendenze da 're'. Tuttavia, anche se 'mapfn' è definito in raw1.py, finisce per essere eseguito all'interno di un diverso processo python nel contesto di mincemeat.py. Invece di modificare la libreria stessa, l'importazione può (e dovrebbe) essere aggiunta a 'mapfn'. –

0

Sembra che tu abbia già risposto a questa domanda. Se utilizzi re in mincemeat.py, dovrai importare re anche lì.

12

È necessario avere la dichiarazione di importazione in mapfn stesso. mapfn viene eseguito in un processo Python diverso, quindi non ha accesso al contesto originale (incluse le importazioni) in cui è stato dichiarato.

+0

Grazie per carne tritata! E 'un ottimo strumento. Mi chiedevo poiché questa domanda potrebbe essere un evento comune, potresti menzionarlo nel tuo wiki di github per mincemeat? – RAbraham

+0

Buona idea. Fatto! –

Problemi correlati