Пример #1
0
 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
Пример #2
0
    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