2012年5月14日月曜日

Online Judge のようなものを作ってみる

最近、部活で後輩たちのテストを多くやるようになってきたので。
採点するのが結構大変かな〜と思って、AOJみたいな感じで問題作っておいて。
formからプログラムを送ると、コンパイルして実行までしてくれるシステムを作った。(もちろんUIはhoge)

さて、どうやって実装したか。

さすがに、プログラムが実行されるまでhttpのレスポンスが帰らないのはクソ実装すぎるので。

別のThreadを使って見ることにした。

Pythonで書いたのだが、モジュールがあったのですぐにかけた。

http://www.python.jp/doc/2.5/lib/module-threading.html
http://techno-st.net/2010/02/06/python-3.html

ここらへんを参考にすればいい。

次に、外部のプログラムの実行。
forkを考えたが、ちょっと調べてみると。

subprocessという標準ライブラリがあったのでそれを使ってみることにした。



import subprocess
subprocess.Popen(["echo", "hoge"]);

こんな感じで書けばecho hogeが実行される。

これは、stdinやstdoutの設定もできるし、そのコマンドが終わるまでプログラムが終わったりしないので、かなり便利だった。
一定時間まって、プロセスが終わっているかとかを確認して終わってなかったらKILLしてTLEにしてしまえばOK

一応、ソースをgithubに上げておきました。

https://github.com/higumachan/oknct_judge


0 件のコメント:

コメントを投稿