app.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. '''
  14. code: string 源代码
  15. language: string 编程语言{cpp,java,c,python}
  16. timeLimit: int 时间限制
  17. memoryLimit: int 内存限制
  18. inputOutputMapping: hashmap 输入输出对
  19. '''
  20. @app.route('/api/judge', methods=['POST'])
  21. def judge():
  22. start = time.time()
  23. requestData = request.get_data(as_text=True)
  24. data = json.loads(requestData)
  25. code = data['code']
  26. language = data['language']
  27. cid = str(data['commitId'])
  28. time_limit = int(data['timeLimit'])
  29. memory_limit = int(data['memoryLimit'])
  30. input_list = data['inputList']
  31. output_list = data['outputList']
  32. if len(input_list) != len(output_list):
  33. return {"result_list": [{'result': "System Error"}],
  34. 'message': 'test data incompleted'}
  35. td_total = len(input_list)
  36. # save_test_cases(input_list, output_list, td_total)
  37. # src_file = save_code(language, code)
  38. save_test_cases_by_cid(cid, input_list, output_list, td_total)
  39. src_file = save_code_by_cid(cid, language, code)
  40. rst = judgement.judge(src_file, 'testcases-'+cid, td_total, time_limit, memory_limit, language)
  41. os.remove(src_file)
  42. shutil.rmtree('main-'+cid)
  43. shutil.rmtree('testcases-'+cid)
  44. app.logger.info(time.time() - start)
  45. return rst
  46. def save_test_cases_by_cid(cid, input_list, output_list, td_total):
  47. dir_name = 'testcases-' + cid
  48. if os.path.exists(dir_name):
  49. shutil.rmtree(dir_name)
  50. os.mkdir(dir_name)
  51. for i in range(0, td_total):
  52. in_file = open(dir_name + '/' + str(i) + '.in', 'w')
  53. in_file.write(input_list[i])
  54. out_file = open(dir_name + '/' + str(i) + '.out', 'w')
  55. out_file.write(output_list[i])
  56. def save_code_by_cid(cid, language, code):
  57. dir_name = 'main-' + cid
  58. if os.path.exists(dir_name):
  59. shutil.rmtree(dir_name)
  60. os.mkdir(dir_name)
  61. src_file = None
  62. if language == 'c':
  63. src_file = open(dir_name+'/'+'main.c', 'w')
  64. elif language == 'cpp':
  65. src_file = open(dir_name+'/'+'main.cpp', 'w')
  66. elif language == 'java':
  67. src_file = open(dir_name+'/'+'Main.java', 'w')
  68. elif language == 'python':
  69. src_file = open(dir_name+'/'+'main.py', 'w')
  70. app.logger.info(src_file.name)
  71. src_file.write(code)
  72. return src_file.name
  73. def save_test_cases(input_list, output_list, td_total):
  74. if os.path.exists('testcases'):
  75. shutil.rmtree('testcases')
  76. os.mkdir('testcases')
  77. for i in range(0, td_total):
  78. in_file = open('testcases/' + str(i) + '.in', 'w')
  79. in_file.write(input_list[i])
  80. out_file = open('testcases/' + str(i) + '.out', 'w')
  81. out_file.write(output_list[i])
  82. def save_code(language, code):
  83. src_file = None
  84. if language == 'c':
  85. src_file = open('main.c', 'w')
  86. elif language == 'cpp':
  87. src_file = open('main.cpp', 'w')
  88. elif language == 'java':
  89. src_file = open('Main.java', 'w')
  90. elif language == 'python':
  91. src_file = open('main.py', 'w')
  92. print(src_file.name)
  93. src_file.write(code)
  94. return src_file.name
  95. if __name__ == '__main__':
  96. app.run()