app.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. # encoding: utf8
  2. import os
  3. import shutil
  4. import time
  5. from flask import Flask, request, json
  6. import judgement
  7. import logging
  8. app = Flask(__name__)
  9. logging.basicConfig(level=logging.DEBUG)
  10. @app.route('/')
  11. def hello_world():
  12. return 'Hello World!'
  13. @app.route('/api/judgeTest', methods=['POST'])
  14. def judge_test():
  15. start = time.time()
  16. requestData = request.get_data(as_text=True)
  17. data = json.loads(requestData)
  18. code = data['code']
  19. language = data['language']
  20. cid = str(data['commitId'])
  21. time_limit = int(data['timeLimit'])
  22. memory_limit = int(data['memoryLimit'])
  23. input_list = data['inputList']
  24. output_list = data['outputList']
  25. app_path = os.getcwd()
  26. app.logger.info(app_path)
  27. dir_name = 'commit-' + cid
  28. if os.path.exists(dir_name):
  29. shutil.rmtree(dir_name)
  30. os.mkdir(dir_name)
  31. os.chdir(app_path+'/'+dir_name)
  32. app.logger.info(os.getcwd())
  33. if len(input_list) != len(output_list):
  34. return {"result_list": [{'result': "System Error"}],
  35. 'message': 'test data incompleted'}
  36. td_total = len(input_list)
  37. save_test_cases(input_list, output_list, td_total)
  38. src_file = save_code(language, code)
  39. rst = judgement.judge(src_file, 'testcases', td_total, time_limit, memory_limit, language)
  40. # save_test_cases_by_cid(cid, input_list, output_list, td_total)
  41. # src_file = save_code_by_cid(cid, language, code)
  42. # rst = judgement.judge_by_cid(src_file, 'testcases-'+cid, td_total, time_limit, memory_limit, language,cid)
  43. os.remove(src_file)
  44. shutil.rmtree('testcases')
  45. os.chdir(app_path)
  46. app.logger.info(os.getcwd())
  47. app.logger.info(time.time() - start)
  48. return rst
  49. '''
  50. code: string 源代码
  51. language: string 编程语言{cpp,java,c,python}
  52. timeLimit: int 时间限制
  53. memoryLimit: int 内存限制
  54. inputOutputMapping: hashmap 输入输出对
  55. '''
  56. @app.route('/api/judge', methods=['POST'])
  57. def judge():
  58. start = time.time()
  59. requestData = request.get_data(as_text=True)
  60. data = json.loads(requestData)
  61. code = data['code']
  62. language = data['language']
  63. cid = str(data['commitId'])
  64. time_limit = int(data['timeLimit'])
  65. memory_limit = int(data['memoryLimit'])
  66. input_list = data['inputList']
  67. output_list = data['outputList']
  68. if len(input_list) != len(output_list):
  69. return {"result_list": [{'result': "System Error"}],
  70. 'message': 'test data incompleted'}
  71. td_total = len(input_list)
  72. # save_test_cases(input_list, output_list, td_total)
  73. # src_file = save_code(language, code)
  74. # rst = judgement.judge(src_file, 'testcases', td_total, time_limit, memory_limit, language)
  75. save_test_cases_by_cid(cid, input_list, output_list, td_total)
  76. src_file = save_code_by_cid(cid, language, code)
  77. rst = judgement.judge_by_cid(src_file, 'testcases-'+cid, td_total, time_limit, memory_limit, language,cid)
  78. os.remove(src_file)
  79. shutil.rmtree('main-'+cid)
  80. shutil.rmtree('testcases-'+cid)
  81. app.logger.info(time.time() - start)
  82. return rst
  83. def save_test_cases_by_cid(cid, input_list, output_list, td_total):
  84. dir_name = 'testcases-' + cid
  85. if os.path.exists(dir_name):
  86. shutil.rmtree(dir_name)
  87. os.mkdir(dir_name)
  88. for i in range(0, td_total):
  89. in_file = open(dir_name + '/' + str(i) + '.in', 'w')
  90. in_file.write(input_list[i])
  91. out_file = open(dir_name + '/' + str(i) + '.out', 'w')
  92. out_file.write(output_list[i])
  93. def save_code_by_cid(cid, language, code):
  94. dir_name = 'main-' + cid
  95. if os.path.exists(dir_name):
  96. shutil.rmtree(dir_name)
  97. os.mkdir(dir_name)
  98. src_file = None
  99. if language == 'c':
  100. src_file = open(dir_name+'/'+'main.c', 'w')
  101. elif language == 'cpp':
  102. src_file = open(dir_name+'/'+'main.cpp', 'w')
  103. elif language == 'java':
  104. src_file = open(dir_name+'/'+'Main.java', 'w')
  105. elif language == 'python':
  106. src_file = open(dir_name+'/'+'main.py', 'w')
  107. app.logger.info(src_file.name)
  108. src_file.write(code)
  109. return src_file.name
  110. def save_test_cases(input_list, output_list, td_total):
  111. if os.path.exists('testcases'):
  112. shutil.rmtree('testcases')
  113. os.mkdir('testcases')
  114. for i in range(0, td_total):
  115. in_file = open('testcases/' + str(i) + '.in', 'w')
  116. in_file.write(input_list[i])
  117. out_file = open('testcases/' + str(i) + '.out', 'w')
  118. out_file.write(output_list[i])
  119. def save_code(language, code):
  120. src_file = None
  121. if language == 'c':
  122. src_file = open('main.c', 'w')
  123. elif language == 'cpp':
  124. src_file = open('main.cpp', 'w')
  125. elif language == 'java':
  126. src_file = open('Main.java', 'w')
  127. elif language == 'python':
  128. src_file = open('main.py', 'w')
  129. print(src_file.name)
  130. src_file.write(code)
  131. return src_file.name
  132. if __name__ == '__main__':
  133. app.run()