2012-10-04 2 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

만우절, coursera의 빅 데이터 코스에서 동료 학생을 만나서 기쁘게 생각합니다. – RAbraham

답변

3

파이썬의 "글로벌"변수는 실제로 바인딩 된 모듈/파일로 범위가 지정됩니다. 그것들을 사용하는 모든 파일에서 파일을 가져와야합니다.

모듈 이름은 다른 것과 같은 변수 일뿐입니다.

+1

Satyajit이 사용 된 것과 동일한 파일에서 Satyajit이're'을 가져 오는 것을 볼 수 있습니다. 민스 미트가 작동하는 방식으로 수행하지만 mapfn은 원래 가져 오기에 액세스 할 수없는 컨텍스트에서 실행됩니다. –

+0

@MichaelFairley : mincemeat.py는 가져 오기가없는 별도의 파일입니다. – geoffspear

+1

mincemeat.py는're'에 의존하지 않는 라이브러리입니다. 그러나, 'mapfn'이 raw1.py에 정의되어 있어도, mincemeat.py 문맥에서 다른 파이썬 프로세스 내부에서 실행되기 시작합니다. 라이브러리 자체를 수정하는 대신'import'가'mapfn'에 추가 될 수 있습니다. –

0

이미이 질문에 답변 해 주신 것 같습니다. mincemeat.py에서 re를 사용하면 re를 import해야합니다.

12

mapfn에 가져 오기 명령문이 있어야합니다. mapfn은 다른 파이썬 프로세스에서 실행되기 때문에 선언 된 원래 컨텍스트 (가져 오기 포함)에 액세스 할 수 없습니다.

+0

미식가 감사합니다! 그것은 훌륭한 도구입니다. 나는이 질문이 일반적인 사건 일 수 있기 때문에 궁금해서, 미스 미트에 대한 github 위키에서 이것을 언급 할 수 있습니까? – RAbraham

+0

좋은 생각입니다. 끝난! –

관련 문제