2011-01-12 7 views
4

내가하는 각 단위 테스트는 파이썬 코드를 파일로 작성한 다음 모듈로 가져 오는 것입니다. 문제는 코드가 변경되지만 추가 import 문이 모듈을 수정하지 않는다는 것입니다.어쨌든 파이썬 바이트 코드 캐시를 지우려면 없습니까?

내가 필요한 것은 모듈에 강제로드를 강제하거나 내부 바이트 코드 캐시를 지우는 것입니다. 어떤 아이디어?

감사합니다.

답변

8

다시 가져 오기 모듈은 모든 가장자리 케이스를 바로 얻을 까다 롭습니다. reload에 대한 설명서에는 그 중 일부가 언급되어 있습니다. 테스트중인 내용에 따라 은 각각 subprocess을 실행하여 통역사의 별도 호출로 가져 오기를 테스트 해보는 것이 좋습니다. 속도는 느려지지만보다 안전하고 정확한 테스트가 가능할 것입니다.

+0

다른 파이썬 해석기로도 테스트를 수행 할 수 있기 때문에이 솔루션이 가장 좋았으며 이제는 훨씬 안전합니다 (테스트가 이제 작동합니다!). – Scott

4

reload()을 사용하십시오.

이전에 가져온 모듈을 다시로드하십시오. 인수는 모듈 객체 이어야하므로 이 성공적으로 가져와야합니다. 이것은 모듈 소스 파일 을 외부 편집기를 사용하여 편집하고 이 파이썬 인터프리터를 떠나지 않고 새 버전을 시험해보고 싶을 때 유용합니다. 반환 값은 모듈 개체 (모듈 인수와 동일한 )입니다.

그러나 모듈을 이미로드해야합니다. 해결 방법은 NameError 결과로 처리하는 것입니다

try: 
    reload(math) 
except NameError: 
    import math 
+0

그러나 이미로드 된 모듈에서만 다시로드를 사용할 수 있습니다. 이 방법을 시도했지만 dir()은로드 된 모듈을 나열하지 않습니다. – Scott

+0

@Scott 내 편집을 참조하십시오. – marcog

3

다른 이름의 모듈에 코드를 작성하십시오. 새 코드를 기존 파일에 쓰고 다시 가져 오기를 시도하면 제대로 작동하지 않습니다.

또는 sys.modules을 신고 할 수 있습니다. 예 :

class MyTestCase(unittest.TestCase): 
    def setUp(self): 
     # Record sys.modules here so we can restore it in tearDown. 
     self.old_modules = dict(sys.modules) 

    def tearDown(self): 
     # Remove any new modules imported during the test run. This lets us 
     # import the same source files for more than one test. 
     for m in [m for m in sys.modules if m not in self.old_modules]: 
      del sys.modules[m] 
0

비슷한 상황입니다. 나중에 공백 들여 쓰기 기술이 문제를 사용함을 발견했습니다. 특히 Windows 플랫폼에서 유니폼 기술이 모듈 전체에 적용되도록하십시오 (예 : 탭 또는 공백 만 사용).

관련 문제