2012-05-12 3 views
3

아래의 복제 코드를 참조하십시오.Python 리로드 모듈이 즉시 적용되지 않습니다.

메모리 누수를 추적하면 reload (모듈)가 즉시 적용되지 않는 것으로 나타났습니다.

아래의 프로그램은 0,1,2,3,4를 인쇄해야하지만, 빨리 실행하면 0,0,0,3,3 등과 같은 순서를 인쇄합니다. sleep() 함수의 시간을 1 초로 늘리면이를 수정하는 것으로 보입니다.

이 코드는 문제를 재현하기 위해 좀 더 실제적인 코드의 차가운 버전이며 실제 애플 리케이션의 상황을 처리해야합니다.

누구나 안정성을 보장하는 방법에 대해 알고 있습니까?

저는 윈도우에 있는데, cpython27 32 비트입니다.

감사합니다.

 
# this program assumes folder lib\mymodule exists and contains __init__.py 
import time 
import io 
import gc 
modulefile = 'c:\\python27\\lib\\mymodule\\simplemodule.py' 
for cnt in range(5): 
    modulecode = """def runmodule(): 
    return %i 
"""%(cnt) 
    obj = io.open(modulefile, u'wb') 
    obj.write(modulecode) 
    obj.close() 
    if cnt==0: 
     import mymodule.simplemodule 
    else: 
     reload(mymodule.simplemodule) 
    gc.collect() 
    print mymodule.simplemodule.runmodule() 
    time.sleep(0.05) 
+1

실제 응용 프로그램에서'reload()'를 사용하고 있습니까? 나는 그것이 대화 형 편의를위한 것이라고 생각했다. –

+1

이것은 재로드를위한 정당한 사용 사례입니다. 소스 파일이 변경 될 때마다 (자동 또는 편집에 관계없이) * reload *는 * sys.modules *에 캐시 된 버전을 우회하는 방법입니다. –

답변

4

문제는이 undelying 파일에 대한 오래된 경우가 아니면 PYC이 재생되지 것입니다. 파일 수정 시간을 1 초 해상도로 확인하면 업데이트가 무시되고 업데이트 된 소스 대신 최신 pyc이 호출됩니다.

  • 수입 또는 다시로드 사이 의 pyc 파일을 제거하십시오.

  • 또는 환경 변수 을 설정할 수 있습니다.

  • execfile을 사용하여 가져 오기 논리를 무시할 수도 있습니다.

관련 문제