MacでPythonが動く環境を構築して、Flaskから文字列を返すところまで

Pythonデビューするゾ٩(ˊᗜˋ*)و
なにはともわれ、MacでPythonが動く環境をつくらねば話しにならぬ。
Pythonにはバージョン2系と3系があり、それぞれ互換性がないようだ。特に制約がないなら3系を使うのがよいだろう。
MacのデフォルトのPythonは2系なので、まずはPython3をインストールする。
それから、パッケージ管理ツールを使ってWebフレームワークであるFlaskをインストールする。

環境構築には、pyenvpipenvを使うのがモダンらしい。
ツールの概要を簡単に掴んだ上で、MacでHomebrewを使いインストールしていく。

pyenvとは

pyenvとは、Python自体のバージョンを管理するツールだ。
プロジェクトごとに異なるPythonのバージョンを使っている場合に、簡単にPythonのバージョンを切り替えるために使われる。
なお、Windowsでは使えない。

pipenvとは

pipenvとは、パッケージの管理と、仮想環境を作成するツールだ。
パッケージの管理はpipで行われ、仮想環境の作成にはvirtualenvで行われる。
パッケージとは複数のモジュールをまとめたもので、モジュールは拡張子.pyで書かれたファイルのことだ。(この説明は正確ではないようだが、必要になったときに深掘りしようと思う)
パッケージはThe Python Package Index (PyPI)と呼ばれる場所で共有されており、開発者はパッケージ名と必要であればバージョンを指定することで、簡易にパッケージをインストールすることができる。

PyPI

しかし、pipでパッケージをインストールすると、グローバルにインストールされてしまう。(ただし、オプションでインストール先はコントロールできる模様)
つまり、複数のプロジェクトで開発している場合、不要なパッケージが入ってしまったり、バージョンをそろえられなくなり不便である。
そこで、個々のプロジェクトごとにパッケージをインストールすることができるようにする仕組みが必要になった。それを実現するのが仮想環境だ。

このようなPythonで開発をする上で必要になるパッケージの管理(pip)と仮想環境(virtualenv)をまとめて扱いやすくしたツールがpipenvだ。

MacでPython3.7.3とFlask1.0.2が動く環境構築

では、MacでPythonが動く環境を構築していく。
Homebrewでpyenv、pipenvをインストールする。

pyenvのインストール

$ brew update
$ brew install pyenv
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
$ exec $SHELL -l

pipenvのインストール

$ brew install pipenv
$ echo 'eval "$(pipenv --completion)"' >> ~/.bash_profile
$ exec $SHELL -l

Python3.7.3のインストール

pipenv install --python バージョンによりpipenvは指定したPythonのバージョンがない場合に、pyenvを通してPythonをインストールする。

$ pipenv install --python 3.7.3

コマンド実行後はPipfileファイルとPipfile.lockファイルが生成される。

ディレクトリ

.
├── Pipfile
└── Pipfile.lock

Flask1.0.2のインストール

pipenv install パッケージ名==バージョンにより指定したバージョンのパッケージをインストールする。

$ pipenv install Flask==1.0.2

インストールしたパッケージはPipfileファイルに記載され、[packages]flask = "==1.0.2"の行が追加されている。

Pipfile









 




[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
flask = "==1.0.2"

[requires]
python_version = "3.7"

ここまででPython、Flaskのインストールができた。

FlaskでHTTPリクエストを受け取り、文字列が返せるようにする

FlaskでHTTPリクエストを受け取り、文字列が返せるようにする。

ルーティングを担当するファイルを作成する

ルーティングを担当するファイルhello.pyを用意する。
ファイル名は任意だ。

ディレクトリ




 

.
├── Pipfile
├── Pipfile.lock
└── hello.py

hello.py

from flask import Flask
app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello World!"

from パッケージ名 import オブジェクト(関数や変数、クラス) 文により、flaskパッケージからFlaskオブジェクトを読み込む。
__name__はPythonで使われる特殊変数で、モジュール名が格納されている。これをFlaskオブジェクトに渡すことでインスタンスを初期化している。
@app.routerでルーティングを指定し、def 関数名(): 処理により、ルーティングされた際の処理を記載する。

仮想環境の有効化

今作成したhello.pyを仮想環境によりPython3.7.3、Flask1.0.2が動くようにする。

pipenv shellにより仮想環境を有効にする。

$ pipenv shell
Launching subshell in virtual environment…
~/git/learning-python $  . /Users/nancy/.local/share/virtualenvs/learning-python-DnWY0WUi/bin/activate
(learning-python) ~/git/learning-python $

表示されたディレクトリをのぞいてみると、そこにflaskpython3.7が格納されている。

ls /Users/nancy/.local/share/virtualenvs/learning-python-DnWY0WUi/bin/
flask
python3.7
...略

FlaskでWebサーバーを立ち上げる

$ FLASK_APP=hello.py flask run
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

ブラウザを開くとhello.pyreturnしていた文字列「Hello World」が表示される。 FlaskでHello World

・参考
https://www.m3tech.blog/entry/python-packaging
https://www.python.jp/install/macos/virtualenv.html