파이썬 모듈 테스트를위한 래퍼를 작성하려고합니다. 이 래퍼는 환경을 시뮬레이트 한 다음 execfile을 통해 다른 파이썬 모듈을 시작합니다. 테스트 할 파이썬 모듈이 많습니다 (> 200).서브 모듈 자체를 변경하지 않고 호출 된 서브 모듈의 전역 변수가 변경되지 않도록 하시겠습니까?
이러한 모듈에는 시뮬레이트 된 환경에 존재하지 않는 (절대 생성 할 수없는) 절대 파일 경로가 포함 된 하드 코딩 된 변수가 있습니다. 그 파일 경로는 옵션 파일에 대한 경로이며, 스크립트는 읽을 것입니다. 각 모듈마다 정확히 하나의 옵션 파일이 있으며이 옵션 파일에 대한 파일 경로는 항상 동일한 전역 변수에 저장됩니다. 변수 이름은 각 모듈에서 동일합니다 : optionFile).
optionFile = "Path to Option file"
나의 생각은 내가 테스트 모듈을 실행하기 전에 내가 어쩌면 기존 경로와이 전역 변수 "optionFile을"미리 설정 수 있다고했다. 그러나 실행 된 모듈은 하드 코드 된 값으로 "optionFile"을 덮어 쓰게되므로이 기능만으로는 도움이되지 않습니다.
globals 객체의 __setattr__
함수를 덮어 쓰는 방법이 있는지 궁금해서 특정 변수 이름에 아무런 영향을 미치지 않으면 서 시도했지만 성공하지 못했습니다. 이것이 효과가 있으며 어떤 제안이 있다고 생각하십니까?
그래서 대답은 것 같다 우리가 여기있어 첫인상을 바탕으로
는
모듈의 코드 특성은 무엇입니까? 모듈 최상위 수준에 있다면 운이 없어 질 수 있습니다. 즉, 파일에'optionFile = "/ some/path"가 있고 그 다음 바로 다음 행에서'open (optionFile)'을 수행하면'optionFile'의 값을 변경할 수 없습니다. 중에서. 'open' 함수 (또는'optionFile'과 상호 작용하기 위해 모듈이 사용하는 다른 함수)를 monkeypatching하는 것이 더 나을 것입니다. – BrenBarn
좋은 해석 : 설명하신 내용은 파이썬 모듈의 성격과 정확히 같습니다. (. 열린 함수를 사용하여 어떻게 할 수 있습니까? ...이 옵션 파일의 모든 확장이 같은 (.opt). 열려있는 기능을 ".opt"로 끝나는 파일에 대한 모든 시작 요청을 하드 코드 버전 (내 replacementoption-file)으로 "다시 라우팅"하면이 작업이 가능합니까? – and0r
질문이 불분명 한 것 같습니다. 나에게 제목은 변수가 변경되는 것을 막을 수있는 방법을 요구하지만 신체는 변수를 변경하는 방법을 묻는다. – Goyo