import subprocess
devEnvPath = "DEVENV.exe 경로"
configName = "Release 나 Debug"
solutionPath = "VC 솔류션 (sln 파일) 경로"
solutionLogPath = "컴파일 결과가 저장될 로그 경로"
devEnvCmd = '%(devEnvPath)s "%(solutionPath)s" /build %(configName)s /out "%(solutionLogPath)s"' % locals()
devEnvProc = subprocess.call(devEnvCmd)
devenv 의 실행 결과는 stdout 으로 출력되는 것이 아니라 로그 파일로 저장됩니다.
그러므로 일단 실행 시켜놓은 다음 로그 파일을 계속 체크하면서
내용을 화면에 뿌려주어야 합니다. (tail -f log.txt 같은 기능을 만들어야 합니다)
def DevEnv_Compile(devEnvPath, solutionPath, configName, interval=0.5):
"VC2005 컴파일"
solutionHead, ext = os.path.splitext(solutionPath)
solutionLogPath = solutionHead + ".log"
# 로그 파일이 존재한다면 삭제한다 (삭제가 안된다면 이미 실행중일 가능성이 높음)
if os.access(solutionLogPath, os.R_OK):
if not RemoveFile(solutionLogPath):
print("DEVENV.MAY_BE_ALREADY_RUNNING")
return
# 컴파일러 실행
devEnvCmd = '%(devEnvPath)s "%(solutionPath)s" /build %(configName)s /out "%(solutionLogPath)s"' % locals()
print("compile:")
print("\t%s" % devEnvCmd)
devEnvProc = RunProcess(devEnvCmd)
try:
print "\twait_for_logging"
while devEnvProc.poll() is None:
if os.access(solutionLogPath, os.R_OK):
break
else:
time.sleep(interval)
print "\tstart"
logFile = open(solutionLogPath)
while devEnvProc.poll() is None:
oldPos = logFile.tell()
line = logFile.readline()
if line:
print("\t%s" % line.rstrip())
else:
time.sleep(interval)
logFile.seek(oldPos)
print "\tend"
except KeyboardInterrupt:
print("\tstop")
KillProcess(devEnvProc)
devenv 는 별도 프로세스로 실행되므로,
파이썬 스크립트가 중단되어도 devenv 는 종료되지 않습니다.
그러므로 ctrl+c 같은 예외 상황이 발생하면 아래에서 만든 KillProcess 로
devenv 를 종료시켜주어야 합니다.


python 을 좋아하는 게임 프로그래머