目次
AWS EC2 で作ったファイル処理のサンプルをテストしてもらうために簡易的なサーバを作りました。 そのときの方法をまとめています。
状況
音声認識の処理で、 wav ファイルを処理して結果を別ファイルに出力するコマンドがありました。 必要なコンポーネントを揃えて実行できるようにはしたのですが、まわりの人にコマンドを評価してもらうには、コマンドを簡単に実行できるようにしておく必要がありました。
そこで、あらかじめインストールされている Python を利用して、アップロードされたファイルを処理して、出力されたファイルを読み込み表示するサーバを作りました。
環境
- AWS EC2
- Python 2.7.6
- OS: Ubuntu 64bit 14.04.3 LTS
サーバコード
まずはディレクトリ・ファイルを次のように作ります。
- server_test/
- cgi-bin/
- test.py
- tmp/ (権限は 777 にしておきます)
- cgi-bin/
そして test.py
の中に次のコードを書き込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/usr/bin/python # -*- coding: utf-8 -*- import cgi import os form = cgi.FieldStorage() print "Content-type: text/html" print print "<!DOCTYPE html>" print "<html lang="ja">" print "<meta name="viewport" content="initial-scale=1.0" />" print "<head>" print "</head>" print "<body>" if "wav" in form: waveFile = form["wav"] if waveFile.file: # save file fout = file("tmp/last.wav", "wb") while True: chunk = waveFile.file.read(1024 * 1024 * 10) if not chunk: break fout.write(chunk) fout.close() # calculate os.system("some_command -i tmp/last.wav") # read output fin = file("tmp/last.rec", "r") rec = fin.read() fin.close() # format and show print "<pre>" print rec print "</pre>" print "<form method="post" enctype="multipart/form-data">" print "<input type="file" name="wav" />" print "<button>Submit</button>" print "</form>" print "</body>" print "</html>" |
アップロードされたファイルを tmp/last.wav
に保存してコマンドを実行し、 出力されたファイル、 ここでは tmp/last.rec
を読み込んで画面に表示します。 コードを見ていただければ分かるとおり、ファイルは同じ名前でどんどん上書きします。 あくまでサーバコードの実行結果をシェアするためのコードですので、たくさんアクセスがあることなんて想定していません。
サーバは、 server_test
ディレクトリで次のコマンドを実行して起動します。 80番ポートで起動します。
1 |
sudo python -m CGIHTTPServer 80 |
sudo
で実行しないと、80番ポートの確保ができません。
ブラウザからアクセスすると画面が表示されます。
コード内のコマンドは、 server_test
をカレントディレクトリとして実行されます。
もし、コマンドの標準出力を画面に表示したい場合は次のようにするとうまくいきます。 (もちろん、ファイルにリダイレクトして保存した後、ファイルを読み込む形でもできます。)
1 2 3 4 5 6 |
import subprocess p = subprocess.Popen( "some command", stdout=subprocess.PIPE, shell=True) (rec, err) = p.communicate() |
標準出力を 変数rec
に保存して、 print rec
で画面に表示できます。