2017-01-23 8 views
-1

파이썬 모듈 테스트를위한 래퍼를 작성하려고합니다. 이 래퍼는 환경을 시뮬레이트 한 다음 execfile을 통해 다른 파이썬 모듈을 시작합니다. 테스트 할 파이썬 모듈이 많습니다 (> 200).서브 모듈 자체를 변경하지 않고 호출 된 서브 모듈의 전역 변수가 변경되지 않도록 하시겠습니까?

이러한 모듈에는 시뮬레이트 된 환경에 존재하지 않는 (절대 생성 할 수없는) 절대 파일 경로가 포함 된 하드 코딩 된 변수가 있습니다. 그 파일 경로는 옵션 파일에 대한 경로이며, 스크립트는 읽을 것입니다. 각 모듈마다 정확히 하나의 옵션 파일이 있으며이 옵션 파일에 대한 파일 경로는 항상 동일한 전역 변수에 저장됩니다. 변수 이름은 각 모듈에서 동일합니다 : optionFile).

optionFile = "Path to Option file" 

나의 생각은 내가 테스트 모듈을 실행하기 전에 내가 어쩌면 기존 경로와이 전역 변수 "optionFile을"미리 설정 수 있다고했다. 그러나 실행 된 모듈은 하드 코드 된 값으로 "optionFile"을 덮어 쓰게되므로이 기능만으로는 도움이되지 않습니다.

globals 객체의 __setattr__ 함수를 덮어 쓰는 방법이 있는지 궁금해서 특정 변수 이름에 아무런 영향을 미치지 않으면 서 시도했지만 성공하지 못했습니다. 이것이 효과가 있으며 어떤 제안이 있다고 생각하십니까?

그래서 대답은 것 같다 우리가 여기있어 첫인상을 바탕으로

+1

모듈의 코드 특성은 무엇입니까? 모듈 최상위 수준에 있다면 운이 없어 질 수 있습니다. 즉, 파일에'optionFile = "/ some/path"가 있고 그 다음 바로 다음 행에서'open (optionFile)'을 수행하면'optionFile'의 값을 변경할 수 없습니다. 중에서. 'open' 함수 (또는'optionFile'과 상호 작용하기 위해 모듈이 사용하는 다른 함수)를 monkeypatching하는 것이 더 나을 것입니다. – BrenBarn

+0

좋은 해석 : 설명하신 내용은 파이썬 모듈의 성격과 정확히 같습니다. (. 열린 함수를 사용하여 어떻게 할 수 있습니까? ...이 옵션 파일의 모든 확장이 같은 (.opt). 열려있는 기능을 ".opt"로 끝나는 파일에 대한 모든 시작 요청을 하드 코드 버전 (내 replacementoption-file)으로 "다시 라우팅"하면이 작업이 가능합니까? – and0r

+0

질문이 불분명 한 것 같습니다. 나에게 제목은 변수가 변경되는 것을 막을 수있는 방법을 요구하지만 신체는 변수를 변경하는 방법을 묻는다. – Goyo

답변

0

"는 전역의 __setattr__을 변경할 수 없습니다로 반대 (하지 ... 왜 이해가 안하지만)을 보인다 아니".

편집 :
이유는 여기서 작동하지 않는 이유는 전역 "전역"개체가 없다는 것입니다. 대신 각 모듈에는 고유 한 전역 변수가있는 "개인"네임 스페이스가 있습니다. 이 네임 스페이스는 모듈이로드 된 후에 만들어집니다. 전역 네임 스페이스는 확실히 변경 될 수 있습니다. 단, 모듈이 이미로드 된 후에 만 ​​사용해야합니다 (이는 응용 프로그램 시나리오에서 도움이되지 않습니다). BrenBarn에게 감사의 말을 전합니다. 기술 문제가 될 것 EDIT

내 특정에 대한 해결의
END를 변경하는 파이썬에 내장 된 오픈 기능을 대신.

# Keep original pointer to the actual Open-function 
realOpen = open 

# Overwrite the name of the Open-function to implement own logic 
def open(filename, mode='r'): 
    if filename.endswith(".opt"): 
     print "Rerouting opening command" 
     realOpen("myCentralOptionFile.opt","r") 

    else: 
     realOpen(filename,mode) 

주의 :이 해결 방법은 더 이상 제목과 관련이 없습니다.

+1

"전역 개체"가 없습니다. 전역 변수는 모듈 네임 스페이스에 저장됩니다. 그 네임 스페이스를 변경하는 것이 가능하지만, 문제는 모듈이로드 된 후에야 모든 코드가 이미 실행되고'optionFile'으로 무엇을 하든지간에 끝낼 때까지 할 수 없다는 것입니다. 원하는 것은 모듈의 일부 ('optionFile'을 정의하는 부분)를 실행 한 다음 그 값을 변경하기 위해 "일시 중지"하지만, 그렇게 할 수는 없습니다. 모든 것이 든 다른 것이 든 : 전체 모듈을 실행하거나 전혀 실행하지 마십시오. – BrenBarn