今回、みかんの品種を判断するAPIを作成したのですが、コマンドライン上でのみ動くようなものとなっていて、とてもじゃないけど他の人には見せられない、、、ということで、Web上に表示してグラフィカルに操作できて、まぁギリギリアプリっていえなくはないかな!ってレベルにしました。その時色々発見があったので、備忘録として書いておきます。pythonはかけるけど、Webへの繋げ方がわからなーいと困っている皆さんの手助けになれば幸いですたい。※そんなに技術力高い人間ではないので、わかりずらかったり間違っていた時はガンガン行ってください。環境PC:Mac言語:python(3.6.6),php(7.1.7),htmlその他:Apache(MAMP)→試してないけど、Windowsでもそんなに変わらないと思う。object.レモン(100%)こんな感じで、みかんの品種を判断するコード(predict.py)に引数としてjpgの画像を渡すと、その画像がなんの画像かを出力してくれるのが、僕の作ったコードです。これを最終的にlocalhostこんな感じにしました。(見た目のツッコミはコメント欄にて受け付けます、、、)ではでは早速備忘録を書いていきましょう。<h1>みかんの画像をアップしてください。enctype="multipart/form-data"><h1>みかんの画像をアップしてください。"ファイルをアップロードできません。"ファイルが選択されていません。"ファイルをアップロードできません。"ファイルが選択されていません。";}?>画像の受け取り画像の受け取りについては、index.html上で作成したフォームからPOSTで受け取るのですが、今回は書きません。結論からいうと、pythonのコードをコマンドライン上からではなく外部から呼び出す場合には、PHPの「exec()」関数を使います。使い方は、exec(実行する命令,出力結果を入れる,実行後ステータス);のように3つの引数をつけます。※参照を見た人は飛ばして大丈夫です。・実行する命令(ここ重要!)Macだったらターミナル、Windowsだったらコマンドプロンプトのあの画面で入力する内容をそのままここにかけばOKです。実行する命令は、上記の「update.php」を見てもらえばわかる通り、$cmd=’命令’;などで先に書いておいた方がいいです。・出力結果をいれる(詳しくは解説しません)命令を実行した後に出力されたものを全て配列として入れます。引数の後ろ二つはなくても動きますが、のちにテストなどをすることを考えたら入れておいた方がべたー。・実行後ステータス(詳しくは解説しません)命令が正常に終了したかどうかを、0(成功)と1(失敗)で出力します。hogehoge」のような形にして一つ目の引数を入れます。ここで注意をしなくてはいけないのが、pythonのパッケージについてです。hogehoge」のようにコードをかいたら、なんどもエラーが発生しました。keras.modelsこのエラーを見てこのページに飛んできた人もいるかもしれませんね。このエラー自体は、pythonがimportするパッケージを見つけられないというエラーなので、同じディレクトリにパッケージを持って来ればOKーエラー2と思いきや、Numpyなどを使おうとしていた人は、こんな感じなエラーが出てきたかもしません。最終的な回避方法この方法が一番いい方法なのかはさておいて、私はこの問題をこのように回避しました。phpからpythonを読んだ場合と、コマンドラインからpythonを読んだ場合では参照されるpythonが異なるよう。(どっかで設定できるのか?)そして、pythonのimport文でパッケージをimportをするためには、anacondaでインストールしたpythonならanaconda上にあるpythonのフルパスを、そのほかの方法でインストールしたのであれば、そのpythonをどうにかして見つけて、そのフルパスを入力する。この方法なら、anacondaのパッケージ管理機能をちゃんとつかえる見たい。今回はNumpyをimportしてたから、こんな感じなエラーが吐かれたけど、吐かれないんだったらpythonのコードと同じディレクトリにimportするパッケージを入れておいて、直接読み込むのもありかもしれない。いうか、ほかのところに移植することとか考えたら、そっちの方がいいのかもしれない。"__main__":main()このコードの76行目のコードで、みかんの種類とどのくらいの確率でその種類があっているかを出力しています。このままだと問題が発生します。文字コードエラーについては理解できたらまたアップするけど、とりあえず僕がやった回避方法は73,74行目のコードの通り、文字のエンコードを行います。predict.py出力をUTF-8にエンコードする↓phpエンコードされた出力から不要なものを取り除くhex2bin()を使って、16進数表記のUTF-8を日本語にデコードするって感じです。スマートな方法があるのかもしれないですけど、とりあえず今回出力を見たら、python側でエンコードしたもの(レモン)が「b’\xe3\x83\xac\xe3\x83\xa2\xe3\x83\xb3’」で、php(html)側の標準のエンコード結果が「e383ace383a2e383b3」だったので、phpの方に形合わせて見たらええんちゃう??ってことで合わせて見たらしっかりと出力されました。開発日記っぽい日記をかけた気がする笑ちゃんと定期的に更新できるように頑張らないとなーあ、あともし文字コードエラー(Unicodeエラー)の解決方法を知っていて、説明できるぜってひとがいたらぜひコメント欄に書いて欲しいです^^いろんなサイト見たけどわっかりずらくて笑じゃ、今日はこれまで、バイなら。PS.今回書いた記事は、完全に自分自身への備忘録だったので、僕以外の人が見たらなんのコードかわからないものをしようしてしまいました。機会があれば、簡単なファイルを一緒につくって行って理解を深められるような記事を書きたいと思います。Python【Python】エルビス演算子を使えるか?pythonのエルビス演算子結論、pythonは参考演算子を縮めてかけるエルビス演算子はありません。or(‖)演算子を使い、エルビス演算子のように書くことはできます。どれかを超えている可...PHP一覧から「カテゴリ:●●」の表示を消す方法こんにちは。Wordpressのメニューバーをクリックした際に、「検索結果:●●●」や「カテゴリー:●●●」のように表示されるのがウザイので削除しました。冷静に考えてメニューのところでハイライ...JavaScript【Javascript】エルビス演算子を使えるか?JavaScriptのエルビス演算子結論、JavaScriptには三項演算子を縮めてかけるエルビス演算子はありません。or(‖)演算子を使い、エルビス演算子のように書くことはできます。付け方って人それぞれ個性があって面白いですよね。ある程度チーム内の変数の付け方が決まっていて、そのルールに乗っ取るとこれだなって付けたのにも関わらず人によって異なります。久々にMySQL使うなぁと思いながらMySQLにログインしようとすると。私よく考えたらMySQLサーバーを起動していないのに使えるわけなかったですね。コメントをキャンセルメールアドレスが公開されることはありません。※サイトΔホームプログラミングPHPやらしみず実はやらしくはないです。日記その他ED-TECHお仕事フリーランス案件サイトマップホーム検索トップサイドバータイトルとURLをコピーしました。