とーますメモ

Ruby on Rails / Goなどの学習メモ

【Python】Python初心者がMac上で環境構築をしてみる

homebrewが既に入っており、Python3環境を作成するのが前提。

新しい言語を使用するときに、自分がまず調べることは以下の2つ。

1)デバック方法の把握
2)グローバル環境を汚染せず「プロジェクト毎の環境(バージョン及びパッケージ)」が構築できるツールの使用法

1)については以下で書いたので、2)ついて今回はまとめる。
thoames.hatenadiary.jp

① Pythonバージョンを自由に変更して使用する方法

「pyenv」を使う方法が一般的みたい。
複数の異なるバージョンのPythonを利用したいときに使用する。
3.3.0と3.3.1といった細かいバージョンわけまで管理可能。
2系と3系との切り替えにも便利。

インストール

$ brew install pyenv

パスを通す

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

バージョン確認

$ pyenv --version

インストール可能なバージョンを確認

$ pyenv install --list

現時点(2019/02/10)での最新の2系(2.7.15)と3系(3.7.2)の安定版バージョンをインストール

$ pyenv install 2.7.15
$ pyenv install 3.7.2

pyenvを通してインストールされたバージョンの確認

$ pyenv versions

※ちなみにアンインストールしたい場合は以下。簡単。

$ pyenv uninstall <version>

[変更前] 現在のPythonのバージョン確認

$ python -V

3.7.2をグローバル環境で使用する例

$ pyenv global 3.7.2

現在いるディレクトリ内だけで特定バージョンを使用したい場合は、globalではなくlocalコマンドを利用する。
localコマンドを利用すると、そのディレクトリ内にPythonバージョンが記載された.python-versionファイルが作成される。
またglobal及びlocalの両方が設定されている場合、localのPythonバージョンが優先される。
なので、まずは普段使いするバージョンをglobalで設定し、
プロジェクト毎にバージョン変更する場合は、localを使用するという使い方になる。

2.7.15をローカル(現在のディレクトリ内だけ)で使用する例

$ pyenv local 2.7.15

[変更後] 現在のPythonのバージョン確認

$ python -V

この時点で、pyenvで指定したバージョンに変更されていればOK。
変更されていない場合は、以下の記事を参照
pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法 - Qiita

② [簡易版・小規模] Pythonパッケージをプロジェクトごとにインストール/使用する方法

Python2では「virtualenv」という仮想環境ツールを別途インストールし使用するが
Python3.3からはこのツールの機能が「venv」という名前で標準ライブラリに取り込まれたので
この記事では「venv」を使用する。

「project-hoge」という名前の仮想環境を作成する例
※ 「-m」オプションを使うと、インストールされているモジュールをスクリプトとして実行できる。

$ mkdir ~/Python/env
$ cd ~/Python/env
$ python -m venv project-hoge

※仮想環境作成時に、どの仮想環境内でどのPythonバージョンを使用するかを決めることができるので
pyenv localコマンドを使用する必要がないとのこと。詳細は以下の記事より。
Rubyist が pyenv を使うときに知っておいてほしいこと - Qiita


「project-hoge」仮想環境を有効化

$ cd ~/Python/env
$ source hoge/bin/activate

上記のコマンドを打つことで、仮想環境を有効化するとコマンドプロンプトの頭に仮想環境名が
入り、現在どの仮想環境内で作業しているのかがわかるようになる。
仮想環境有効化した状態で、パッケージなどを好きにインストールすると、インストールしたパッケージは
仮想環境内だけで適用されるため、他の仮想環境内からは見えなくなる。

「project-hoge」仮想環境を無効化

(project-hoge) ユーザ名$ deactivate

③ [中規模以上] Pythonパッケージをプロジェクトごとにインストール/使用する方法

簡単なパッケージをインストールするぐらいなら、②で紹介した方法でも良いが
パッケージが複雑に絡み合うようなプロジェクトを作成する場合などでは
「パッケージ管理」を滞りなく行ってくれるツールを使ったほうがよい。
記事を書いている時点で、「Pipenv」と「Poetry」というツールが候補に上がったが
以下の理由で最終的に「Pipenv」を使用することにした。

1)単純にGithubのスター数が圧倒的に、Pipenvが多かった
2)日本語情報がPipenvの方が多そうだった
3)PipenvからPoetryへの以降はそれほど難しそうではない

インストール

$ pip install pipenv

プロジェクトのディレクトリを作成し、初期ファイルを作成
サンプル用のflaskプロジェクトを作成

$ mkdir ~/Python/projects/flask
$ cd ~/Python/projects/flask

# 以下のようにしてしまうと、「~/.local/...」で仮想環境がまとめられてしまう。
# 自分の場合は、プロジェクトディレクトリ内に、仮想環境を作成してほしかったので
# 
# $ pipenv install

次に「pipenv install」を行って、初期ファイルの「Pipfile」と「Pipfile.lock」を作成するのだが
そのままコマンドを入力してしまうと、「~/.local/...」で仮想環境がまとめられてしまう。
自分の場合は、プロジェクトディレクトリ内に、仮想環境を作成してほしかったので
PIPENV_VENV_IN_PROJECTという環境変数を以下のように設定する。

またpipenvのコマンドを補完をサポートしてくれる「pipenv --completion」の設定も追加

パスを通す

$ echo 'export PIPENV_VENV_IN_PROJECT=true' >> ~/.bash_profile
$ echo 'eval "$(pipenv --completion)"' >> ~/.bash_profile
$ source ~/.bash_profile

初期ファイル作成

$ pipenv install  

上記のようにすることで、仮想環境は、プロジェクト内の「.venv」というディレクトリ内に作成される。

仮想環境を有効化

$ pipenv shell

仮想環境外から仮想環境内のコマンドを叩くときは以下のようにする。
仮想環境外からpythonコマンドを叩く例

$ pipenv run python

仮想環境内で「exit」コマンドを使用すれば、仮想環境から抜けられる。

次にflaskをインストール

$ pipenv install flask

flaskがインストールされていることを確認

$ pipenv shell
(flask) bash-x.x$ pip list

または

$ pipenv run pip list

app.pyを作成

# coding: utf-8

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/ja')
def hello_world_ja():
    return 'こんにちは 世界!'

if __name__ == '__main__':
    app.run()

※ 初期状態だと、flaskの実行環境(Environment)が「production」になっているので
「WARNING: Do not use the development server in a production environment.」というエラーがでる。
このエラーを消すために、FLASK_ENV環境変数にdevelopmentを指定する。

$ echo 'export FLASK_ENV=development' >> ~/.bash_profile
$ source ~/.bash_profile

flaskを起動

$pipenv run python app.py

起動に成功したら、「http://127.0.0.1:5000/」にアクセスすることで
「Hello World!」が表示される。

備考

元々、Pythonを使おうと思ったのは単純に簡単なFlaskを使用したWebサービスを作ってみたかったから。
FlaskについているWebサーバはあくまでも開発用っぽいので、実際に大量のアクセスをさばくような
Webサービスを開発するとなると、ApacheなりNginxなりを使用する必要がありそう。

検索してみたら、いい感じのuwsgi + Nginx + flaskのdockerイメージが合ったので
本番環境を構築するときは、これを使ってみたい。
uwsgi-nginx-flask-dockerでFlaskを楽々Docker運用 - Qiita



[参考]
pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法 - Qiita
pyenv を用いた Python3 インストール - Qiita
Python 仮想環境 | pyenv と vertualenv による Python の開発環境の構築
Pythonの環境管理ツール良し悪し - Zopfcode
Rubyist が pyenv を使うときに知っておいてほしいこと - Qiita
Python3 Pipenvの導入メモ - ikap
[Flask] Flaskの基本的な構成(を思い出す) | Today's Commit