def compile(codeName, exeName, compileType): """ :param codeName: 要被编译的代码名 :param exeName: 要被执行的可执行文件名 :param compileType: 选择的编译器类型 :return: """ #当shell语句成功实现才返回真,否则返回值,不进以后续操作 fileName = 'compile_' + codeName + '_' + exeName + '_' + compileType + '.sh' Log.CompileLog("------------------------------------------") Log.CompileLog("file Name : " + fileName) Log.CompileLog("------------------------------------------") if not OJRunner.__createCompileShellFile(codeName, exeName, compileType): Popen('rm ' + DATA.HOST_SHELL_PATH + '/' + fileName, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True) return False result = DockerRunner.runCompile(fileName) Log.CompileLog("------------------------------------------") Log.CompileLog('Create Exe') Log.CompileLog("------------------------------------------") Popen('rm ' + DATA.HOST_SHELL_PATH + '/' + fileName, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True) Log.CompileLog("------------------------------------------") Log.CompileLog(result) Log.CompileLog("------------------------------------------") if len(result) != 2: return False return True
def __createCompileShellFile(codeName, exeName, compileType): """ :param codeName: 要被编译的代码名,只要写文件名,不用后缀 :param exeName: 要被执行的可执行文件名,只要写文件名,不要用缀 :param compileType: 选择的编译器类型(c,cpp,java,python) :return: """ #选择编译器类型,若是python则要将代码从代码文件夹移动至可执行文件夹,若是JAVA则要在编译后,从代码文件夹剪切。CLASS文件到可移行文件夹 #文件名由comepile_codeName_exeName_compileType.sh,其中,codeName中包括了用户ID,题目编号和日期,保证不重复 Log.CompileLog("CODE NAME : " + codeName + " EXE NAME : " + exeName + " COMPILE TYPE : " + compileType) compileName = '' if compileType == 'c': compileName = 'gcc ' + DATA.DOCKER_CODES_PATH + '/' + codeName + '.c -o ' + DATA.DOCKER_EXES_PATH + '/' + exeName elif compileType == 'cpp': compileName = 'g++ ' + DATA.DOCKER_CODES_PATH + '/' + codeName + '.cpp -o ' + DATA.DOCKER_EXES_PATH + '/' + exeName elif compileType == 'java': compileName = 'javac ' + DATA.DOCKER_CODES_PATH + '/' + codeName + '.java\n' compileName += 'mv ' + DATA.DOCKER_CODES_PATH + '/' + exeName + '.class ' + DATA.DOCKER_EXES_PATH elif compileType == 'python': compileName = 'cp ' + DATA.DOCKER_CODES_PATH + '/' + codeName + '.py ' + DATA.DOCKER_EXES_PATH Log.CompileLog("COMPILE NAME : " + str(compileName)) #生成编译的sh文件 try: fileName = 'compile_' + codeName + '_' + exeName + '_' + compileType + '.sh' Log.CompileLog("FILE NAME IN CREATE COMPILE SHELL : " + str(fileName)) p = Popen('touch ' + DATA.HOST_SHELL_PATH + '/' + fileName, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True) file = open(DATA.HOST_SHELL_PATH + '/' + fileName, "w") file.write('#! /bin/bash\n') file.write(compileName + '\n') file.write("echo $?") Popen("chmod 777 " + DATA.HOST_SHELL_PATH + '/' + fileName, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True) except Exception, e: return False