Description:
add python support we compile it into bytecode before run (see 'judge' and 'run')
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r154:3e585749d18c - - 3 files changed: 34 inserted, 13 deleted

@@ -24,18 +24,21
24 end
24 end
25
25
26 C_COMPILER = "/usr/bin/gcc"
26 C_COMPILER = "/usr/bin/gcc"
27 CPLUSPLUS_COMPILER = "/usr/bin/g++"
27 CPLUSPLUS_COMPILER = "/usr/bin/g++"
28 PASCAL_COMPILER = "/usr/bin/fpc"
28 PASCAL_COMPILER = "/usr/bin/fpc"
29 JAVA_COMPILER = "/usr/bin/javac"
29 JAVA_COMPILER = "/usr/bin/javac"
30 - RUBY_INTEPRETER = "/home/dae/.rvm/rubies/ruby-1.9.2-p320/bin/ruby"
30 + RUBY_INTERPRETER = "/home/dae/.rvm/rubies/ruby-1.9.2-p320/bin/ruby"
31 + PYTHON_INTERPRETER = "/usr/bin/python"
32 + PYTHON_CHECKER = "/usr/bin/pyflakes"
31
33
32 C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
34 C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
33 CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall"
35 CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall"
34 PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
36 PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
35 JAVA_OPTIONS = ""
37 JAVA_OPTIONS = ""
38 + PYTHON_OPTIONS = ""
36
39
37 # Check for the correct number of arguments. Otherwise, print usage.
40 # Check for the correct number of arguments. Otherwise, print usage.
38 if ARGV.length == 0 or ARGV.length > 4
41 if ARGV.length == 0 or ARGV.length > 4
39 puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
42 puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
40 puts
43 puts
41 puts "<source-file> is defaulted to \"source\"."
44 puts "<source-file> is defaulted to \"source\"."
@@ -84,26 +87,26
84 params[:prog_lang] = 'c++'
87 params[:prog_lang] = 'c++'
85 end
88 end
86
89
87 # Compile.
90 # Compile.
88 case params[:prog_lang]
91 case params[:prog_lang]
89
92
90 - when "c"
93 + when "c"
91 command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
94 command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
92 system(command)
95 system(command)
93
96
94 - when "c++"
97 + when "c++"
95 command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
98 command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
96 system(command)
99 system(command)
97
100
98 - when "pas"
101 + when "pas"
99 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
102 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
100 system(command)
103 system(command)
101 FileUtils.mv("output", params[:output_file])
104 FileUtils.mv("output", params[:output_file])
102
105
103 - when "java"
106 + when "java"
104 #rename the file to the public class name
107 #rename the file to the public class name
105
108
106 #get the class name
109 #get the class name
107 classname = 'DUMMY'
110 classname = 'DUMMY'
108 File.foreach(params[:source_file]) do |line|
111 File.foreach(params[:source_file]) do |line|
109 md = /\s*public\s*class\s*(\w*)/.match(line)
112 md = /\s*public\s*class\s*(\w*)/.match(line)
@@ -114,24 +117,39
114 system(command)
117 system(command)
115 if File.exists?(classname + ".class")
118 if File.exists?(classname + ".class")
116 File.open(params[:output_file],"w") {|file| file.write("#!/bin/sh\n/usr/bin/java #{classname}\n")}
119 File.open(params[:output_file],"w") {|file| file.write("#!/bin/sh\n/usr/bin/java #{classname}\n")}
117 File.chmod(0755, params[:output_file])
120 File.chmod(0755, params[:output_file])
118 end
121 end
119
122
120 - when "ruby"
123 + when "ruby"
121 - command = "#{RUBY_INTEPRETER} -c #{params[:source_file]} > #{params[:message_file]}"
124 + command = "#{RUBY_INTERPRETER} -c #{params[:source_file]} > #{params[:message_file]}"
122 system(command)
125 system(command)
123 File.open(params[:output_file],"w") do |out_file|
126 File.open(params[:output_file],"w") do |out_file|
124 - out_file.puts "#!#{RUBY_INTEPRETER}"
127 + out_file.puts "#!#{RUBY_INTERPRETER}"
125 File.open(params[:source_file],"r").each do |line|
128 File.open(params[:source_file],"r").each do |line|
126 out_file.print line
129 out_file.print line
127 end
130 end
128 end
131 end
129 File.chmod(0755, params[:output_file])
132 File.chmod(0755, params[:output_file])
133 +
134 + when "python"
135 + command = "#{PYTHON_CHECKER} #{params[:source_file]} > #{params[:message_file]}"
136 + if system(command)
137 + #compile to python bytecode
138 + command = "#{PYTHON_INTERPRETER} -m py_compile #{params[:source_file]}"
139 + puts "compile: #{command}"
140 + system(command)
141 + puts "pwd: " + Dir.pwd
142 + Dir.new('.').each {|file| puts file}
143 + File.open(params[:output_file],"w") do |out_file|
144 + out_file.puts "#!#{PYTHON_INTERPRETER} #{params[:source_file]}c"
145 + end
146 + File.chmod(0755, params[:output_file])
147 + end
130
148
131 - else
149 + else
132 talk("ERROR: Invalid language specified!")
150 talk("ERROR: Invalid language specified!")
133 open(params[:message_file],"w") do |f|
151 open(params[:message_file],"w") do |f|
134 f.puts "ERROR: Invalid language specified!"
152 f.puts "ERROR: Invalid language specified!"
135 end
153 end
136 exit(127)
154 exit(127)
137 end
155 end
@@ -50,13 +50,13
50 puts " <test-result-directory> is defaulted to ./test-result"
50 puts " <test-result-directory> is defaulted to ./test-result"
51 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
51 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
52 exit(127)
52 exit(127)
53 end
53 end
54
54
55 language = ARGV[0]
55 language = ARGV[0]
56 - if language != "c" && language != "c++" && language != "pas" && language != "java" && language != "ruby"
56 + if language != "c" && language != "c++" && language != "pas" && language != "java" && language != "ruby" && language != "python"
57 log "You specified a language that is not supported: #{language}."
57 log "You specified a language that is not supported: #{language}."
58 exit(127)
58 exit(127)
59 end
59 end
60
60
61 source_file = ARGV[1]
61 source_file = ARGV[1]
62 if File.exist?(source_file) == false
62 if File.exist?(source_file) == false
@@ -108,12 +108,13
108 log "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
108 log "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
109 exit(127)
109 exit(127)
110 else
110 else
111 call_and_log("Cannot move the compiled program to #{test_result_dir}") {
111 call_and_log("Cannot move the compiled program to #{test_result_dir}") {
112 FileUtils.mv("a.out",test_result_dir)
112 FileUtils.mv("a.out",test_result_dir)
113 if language == "java" then Dir["*.class"].each { |file| FileUtils.mv(file,test_result_dir)} end
113 if language == "java" then Dir["*.class"].each { |file| FileUtils.mv(file,test_result_dir)} end
114 + if language == "python" then Dir["*.pyc"].each { |file| FileUtils.mv(file,test_result_dir)} end
114 }
115 }
115 FileUtils.rm_rf("#{sandbox_dir}/.")
116 FileUtils.rm_rf("#{sandbox_dir}/.")
116 end
117 end
117
118
118 require "#{problem_home}/script/test_dsl.rb"
119 require "#{problem_home}/script/test_dsl.rb"
119 load "#{problem_home}/test_cases/all_tests.cfg"
120 load "#{problem_home}/test_cases/all_tests.cfg"
@@ -132,12 +133,13
132
133
133 log "Test number: #{test_num}"
134 log "Test number: #{test_num}"
134
135
135 call_and_log("Cannot copy the compiled program into #{sandbox_dir}") {
136 call_and_log("Cannot copy the compiled program into #{sandbox_dir}") {
136 FileUtils.cp("#{test_result_dir}/a.out", sandbox_dir, :preserve => true)
137 FileUtils.cp("#{test_result_dir}/a.out", sandbox_dir, :preserve => true)
137 if language == "java" then Dir["#{test_result_dir}/*.class"].each { |file| FileUtils.cp(file,sandbox_dir)} end
138 if language == "java" then Dir["#{test_result_dir}/*.class"].each { |file| FileUtils.cp(file,sandbox_dir)} end
139 + if language == "python" then Dir["#{test_result_dir}/*.pyc"].each { |file| FileUtils.cp(file,sandbox_dir)} end
138 }
140 }
139
141
140 begin
142 begin
141 execute("#{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
143 execute("#{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
142 rescue
144 rescue
143 # do nothing
145 # do nothing
@@ -93,15 +93,16
93 case language
93 case language
94 when "java"
94 when "java"
95 # for java, we have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
95 # for java, we have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
96 run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s clone -s wait4 -p /usr/bin/ -p ./ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
96 run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s clone -s wait4 -p /usr/bin/ -p ./ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
97 when "ruby"
97 when "ruby"
98 run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s wait4 -s clone -s set_robust_list -s futex -s sigaltstack -p /dev/urandom -p ./ -p /home/dae/.rvm/rubies/ruby-1.9.2-p320/ -p #{problem_home}/ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
98 run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s wait4 -s clone -s set_robust_list -s futex -s sigaltstack -p /dev/urandom -p ./ -p /home/dae/.rvm/rubies/ruby-1.9.2-p320/ -p #{problem_home}/ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
99 - when "c++"
99 + when "python"
100 - run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
100 + #this code just run without any checking
101 - else
101 + run_command = "#{problem_home}/script/box -T -t #{time_limit} -p #{problem_home}/ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
102 + else # for c++, pascal, we do the normal checking
102 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
103 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
103 end
104 end
104
105
105
106
106 log "Running test #{test_num}..."
107 log "Running test #{test_num}..."
107 log run_command
108 log run_command
You need to be logged in to leave comments. Login now