Kuroyagi飼育日誌

学んだことの備忘録

Python + Heroku でWebアプリ

概要

以前はRuby+Herokuをやりましたが、Pythonを本格的にやっていくと決めたので同様のことをPythonでも出来るようにします。各項でバージョンによる違いがあればバージョンを分けた項目として記しておきます。





環境設定


アプリ開発前に一番の難関だと思う環境設定についてまとめておきます。





仮想環境の構築


windowspythonをインストールしてそれをそのまま使うのもありなのですが、環境が崩れたときにアンインストールやらで面倒です。そういう風にならないように仮想環境を作ります。仮想環境はフォルダを作って、pythonへのライブラリのインストールや設定変更をフォルダ内だけにとどめておく方法です。そうすることによって、ライブラリの依存関係などでpythonが動かなくなったりしたら、フォルダを消すだけでリセット完了です。オリジナルはインストールした当初の綺麗なままです。


それでは仮想環境を構築しましょう。【記事1】にすっきりとまとめてあるので参考にします。


【記事1】

Python 2.7.13

web.plus-idea.net


今回はpythonというフォルダにそれぞれの仮想環境フォルダを作っていきます。まずはpythonに移動。

cd ほにゃららら\python


そうしたらpy.exeで仮想環境を作成します。

py -2 -m virtualenv python27


作成した仮想環境に入ります。作成したpython27内にあるScrptsフォルダ内のactivate.batを実行すると仮想環境が始まります。実行はパスを指定して実行するかコマンドプロンプトにbatファイルをドラックアンドドロップで放り込んでEnterでいけます。


するとコマンドプロンプトのライン先頭が(Python27)と表示されます。これで仮想環境を構築できました。

Pyhton 3.6.1


python2.7との差異はpy.exeで仮想環境構築する際にvirtualenvではなく、venvを使う点です。以下のようにコマンドすると同じように構築可能です。

py -3 -m venv python36






ライブラリの準備


ライブラリの準備と動作確認を兼ねて【記事2】を試します。これはpythonのバージョンによらず同じ方法でいけました。


【記事2】
qiita.com



まずは記事2に従い、pipでbottleのインストールです。前節で作成したpython2.7用の仮想環境に入った状態で以下のコマンドを実行します。

pip install bottle


確認は以下のコマンド。

pip list
pip listの赤文字対策

pipのバージョンによってはlisコマンドでライブラリ一覧の冒頭に以下の赤い文字が出てきます。確認自体は問題なく出来るのですが、心臓に悪いので表示されないようにします。【記事6】を参考にしました。

DEPRECATION: The default format will switch to columns in the future. You can us
e --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.con
f under the [list] section) to disable this warning.

【記事6】
dev.classmethod.jp


…と、試そうとしたのですが、そもそもどこを探してもpip.iniファイルが見つかりません。調べてみると【記事7】を発見しました。windowsの場合はpip.iniが無ければ作成して書き込む設定を書き込むのですが、どうしても配置場所が記事を真似したつもりでも上手くいきませんでした。その点については【記事8】に具体的な解決策がありました。しかしこれでも上手くいかず…。


【記事7】
www.outoutput.com


【記事8】
qiita.com


ところがなんと!ダメもとでvirtualenvで作成したディレクトリのトップにpip.iniファイルを作成して実行したところ上手くいきました。

Package    Version
---------- -------------
numpy      1.13.0rc2+mkl
pip        9.0.1
scipy      0.19.0
setuptools 28.8.0
wheel      0.29.0


赤い警告も出なくなり一安心です。よく、こういった解説を見ても結局具体的にどのディレクトリに配置すればいいのか素人としては分からず頓挫することがあるので、より具体的なディレクトリ構成を以下に示しておきます。カレントディレクトリは作成した仮想環境フォルダのルートとなっています。結果はコマンドプロンプトでdirコマンドを打った結果です。

$ ~~~> dir

 <DIR>          .
 <DIR>          ..
 <DIR>          Include
 <DIR>          Lib
             60 pip-selfcheck.json
             22 pip.ini
            119 pyvenv.cfg
 <DIR>          Scripts


仮想環境にとって最上位の階層はフォルダのトップと考えれば当然かもしれませんね(笑)

herokuへのデプロイ


あとは記事にしたがって進めていけばheroku openでhello worldと表示されるはずです。しかし、私の場合は色々いじくりすぎてエラーが出るようになってしまったのでその対処を書いておきます。

bad requestだと怒られる場合
git push heroku master


通常はこの後にcompressingなどのプロセスを開始するのですが、そうならずにbad requestと言われてアプリがデプロイできませんでした。いったい何がいけないのか…。gitやらheroku CLIやらを再インストールしたり仮想環境を作り直したりしたのですがそれでも直らず…と、そんなところにネットの海を彷徨っていたらいい記事を発見しました。


【記事12】
qiita.com


直りました!いまいち分かっていないのですがremoteリポジトリとの関連付けがおかしくなっていた?


またもやいろいろとやり過ぎて原因がおぼろげにしか把握できていないので、後でもう一度クリーンな初期状態から症状が再現するか確認したいと思います。今まで同じ記事は上手くいっていて、こんな面倒になるようなことなかったのになぜ…。ちなみに上手くいったのはherokuの公式ドキュメンテーションpython項目にあるgetting start with python on herokuという記事です。内容自体は簡単です。


とりあえず今までダメだったものが大丈夫になっているのか確認します。


ようやく【記事2】は成功しました。


原因の範囲がかなり絞られました。今までherokuでcreateした直後にgit push heroku masterでデプロイできていたのですが、何故だか一度remoteリポジトリの指定がおかしくなるようです。remoteリポジトリの指定を修正し、public key用のパスフレーズを入力するとデプロイが成功します。


もう少しgitについて学べば今回の問題が分かるかもしれません。そもそも今はmasterの意味すら理解していません。【記事12】あたりに書いてありそうな予感が…。それか、かつてherokuとgitの導入時に参考にしたサイトを見直すべきですね。


【記事12】
Git - リモートブランチ


以前にも目を通した記事のような気もしますが、いまになってもう一度見ると頭の整理になるので【記事13】も見ておきます。


【記事13】
http://tracpath.com/bootcamp/learning_git_firststep.html






グラフ描画アプリの作成


ようやく環境設定が済んだところで、グラフ描画アプリを作っていきます。【記事3】を参考としました。


【記事3】
qiita.com

ライブラリの準備


Flask, gunicorn, matplotlibの3つをインストールします。Flaskだけコマンドプロンプトを管理者権限で実行しないとエラーになりました。仮想環境に入らずにインストールする時は問題ないみたいです。

デプロイ

Internal server errorとなるので、色々確認してみると…


【記事3】のsin.htmlは文字をそのままコピーすると"sinカーブテスト"の日本語部分文字コードが悪さをするようです。Atomというエディタで見ていたら文字化けしていたので気づきました。早速その部分を直して再デプロイすると無事アプリ稼動。


f:id:cocosuzu:20170701193050p:plain





その他のライブラリ

その他のライブラリでpipによるインストールでは上手くいかない癖のあるライブラリについて書いておきます。

numpyとscipy


セットでインストールしないと問題があるようなので注意。


【1】 wheelをインストー

pip3.6 install wheel

【2】各パッケージをインストー

pip3.6 install numpy
Collecting numpy
  Downloading numpy-1.13.0-cp36-none-win_amd64.whl (7.8MB)
    100% |████████████████████████████████| 7.8MB 100kB/s
Installing collected packages: numpy
Successfully installed numpy-1.13.0


numpyは問題なく成功。

pip3.6 install scipy 
Failed building wheel for scipy
Running setup.py clean for scipy


その他多数行のエラー表示が出ました。調べてみると【記事】のようにダウンロードしてインストールすると上手くいくらしいです。


【記事4】
Python for Windows インストールメモ


また、さらに調べてみるとscipyがnumpyとファイルの共用をしているようで、上手く紐付けてインストールしなければならないらしいです。その点も含めてまとめてある【記事5】にしたがってインストールします。先にnumpyのみインストールに成功しているのですが、上記の理由から一度uninstallしておきます。


【記事5】
qiita.com

pip3.6 uninstall numpy
 Successfully uninstalled numpy-1.13.0


【記事5】の通り下記ファイルをダウンロードします(今の環境はpython3.6/windows7 64bit)。


Assimulo‑2.9‑cp36‑cp36m‑win_amd64.whl
scipy‑0.19.0‑cp36‑cp36m‑win_amd64.whl


インストールします。

pip3.6 install 上記ファイルパス


色々とログは出ますが、結果は以下の通りです。

Installing collected packages: numpy
Successfully installed numpy-1.13.0rc2+mkl
Installing collected packages: scipy
Successfully installed scipy-0.19.0


何も!赤い文字が出ることも無く!インストール成功です。念のため本当にインストールされているかlistで確認します。

>pip3.6 list
numpy (1.13.0rc2+mkl)
pip (9.0.1)
scipy (0.19.0)
setuptools (28.8.0)
wheel (0.29.0)


インストールが成功していることを確認出来ました。



今回学んだ小技集

gitのリモートリポジトリ関連付け

確認
git remote -v
削除

例) herokuとの関連付けを削除

git remote rm heroku
登録
git remote add heroku git@heroku.com:アプリ名.git

.gitフォルダの削除

rd /S /Q .git

herokuのログ確認

heroku logs