Home Made Garbage

Nginx + uWSGI で「おもしろまじめなAIスピーカーアプリをつくろう」(秀和システム)のサンプルプログラムを動かす

お母ちゃん お母ちゃん  2018.1.23 
ホーム
電子工作
Raspberry Pi
WordPress
IOT

先日お父ちゃんの依頼でサーバでPythonを動かせるようにしたのだけど、

Raspberry Pi & Nginx サーバに uWSGI の追加

こちらの本のサンプルプログラムを動かそうとしたところ 再び Internal Server Error になってしまった。

Python 自体よく知らないので何がなんだかという感じで google 検索に頼りつつ、なんとか動かせるようになったので記録…

元のソースコードを

uWSGI用にするため下記の変更を加えた。

 

変更点のメモ

1行目 – #!/usr/lib/python2.7

まず、自分のpythonの場所を調べるのに下記ページを参考にさせて頂き、

Pythonのインストールパス確認 – PGとして困ったとき用のメモ書き

/usr/lib/python2.7 であることがわかった。

ただ、色々なソースコードを見ていると「#!/usr/bin/env python」と指定されてあるものがあったので何故なのかと調べてみたところ、

「#!/usr/bin/python」と「#!/usr/bin/env python」の違い – 座敷牢日誌

「#!/usr/bin/python」とした場合は、フルパスで指定されているpythonインタプリタを使って実行する。「#!/usr/bin/env python」では環境変数 PATHのなかに含まれているpythonを探して実行する、ということだ。

とのことだった。

#!/usr/bin/env python とした方がバージョンが変わった際に最新バージョンを使用出来るメリットがあるのかな? でも探す、という処理が含まれてしまうから「/usr/lib/python2.7」を指定した方が少し軽くなるのかな。

サンプルプログラムと同じ形式で「/usr/lib/python2.7」を指定しておいた。

7行目 – input = json.load(sys.stdin) をコメントアウト

結局原因がわからなかったのだけど、sys.stdin でエラーが出るようだった。

調べてみたけどよくわからなかった・・・

同じような質問が見つかったけど解決してないようだったし…

json – Python CGI script hangs with uWSGI trying to read sys.stdin – Stack Overflow

jsonをパースするために必要なようなので、違う方法で実装すれば良いんじゃないかと思い、コメントアウトした。

16行目 – data = json.dumps(output)

dump を dumps に変更

8行目をコメントアウトして sys.stdout が使えなくなったのでこちらも変更する必要が生じた。

最初、sys.stdout を除いただけの json.dump(output) で試したらエラーが出てしまった。

調べたら所、dump を dumps にすれば良いっぽかった。

Python – dump dict as a json string – Stack Overflow

dump と dumps は何が違うのか調べてみた。

[Python] JSONを扱う – YoheiM .NET

  • dumps関数:PythonオブジェクトをJSON文字列に変換する
  • dump関数:PythonオブジェクトをJSON形式でファイルに書き込む

ついでに dump の方でファイル書き込みも試してみたら出来た。

ファイルは事前に作成しておかないとエラーが出た。

 

変数に格納

def application の return に渡すため変数に入れた。

18-20行目 – def application(env, start_response):

ここもよく理解は出来ていないのだけど、WSGIアプリケーションのインターフェース に渡すために、def application を使用する必要があるという感じぽい…😲

第1回 WSGIの概要:WSGIとPythonでスマートなWebアプリケーション開発を|gihyo.jp … 技術評論社

 

 

とりあえずこれで無事ブラウザに「{“speech”: “Hello.”}」が表示された!🙌

コメントを残す

メールアドレスが公開されることはありません。コメントのみでもOKです。

TOP