ハカセノオト

moon indicating dark mode
sun indicating light mode

2020 年版 python 環境構築

October 25, 2020

筆者環境

  • MacBook Pro (16-inch, 2019)
  • macOS Catalina version 10.15.7

概要

  • python のバージョン管理までできるツールと、パッケージのバージョン管理のみしかできないツールがある。
  • python 標準の venv は、python 自体のバージョンは管理できない
  • pyenv で python version —> venv で package version 管理するなど
  • Pipenv が一番モダン。python version も package version も一緒に、賢く管理できる
  • システムで使う大元の(デフォルト)python は pyenv でインストールして、その上で pipenv/venv を使えば良いと思う
toolpythonpackage
venvFalseTrue
pyenvTrueTrue
PipenvTrueTrue
AnacondaTrueTrue
  • Anaconda は、色んなものが入っていて重たいので、使わなくて良いと思う

pyenv

Ref: https://github.com/pyenv/pyenv

pyenv 環境構築

pyenv のインストール

$ brew install pyenv

python のインストール

$ pyenv install -l # pyenv でインストール可能な python バージョンの確認
$ pyenv install 3.8.3 # version 3.8.3 をインストール

デフォルトの python を設定する。(設定前は mac に preinstall されている python)

pyenv global 3.8.3

インストールしている python version と、現在使っている python version を確認する。

$ pyenv versions
system
* 3.8.3 (set by /Users/Hiroshi.Nishigami/.pyenv/version)

プロジェクトの python version を指定する。

$ pyenv local 3.8.3

venv

venv を使うことで、プロジェクトごとのパッケージのバージョンを切り替えることができる。

$ python -m venv .venv

./.venv ディレクトリが生成される。

仮想環境に入る。

$ source .venv/bin/activate

仮想環境から抜ける。

$ deactivate

Pipenv

Ref: Pipenv: Python Dev Workflow for Humans pipenv 2020.8.13 documentation

  • pipenv は、JavaScript の NPM などから inspiration を得て作られたツール ( ref )
  • pip を内部で使っており requirements.txt を扱えるなど、pip の上級互換ツールみたいなもの
  • dev 環境と、prod 環境でインストールするパッケージを区別できる
  • python version が同じ場合、仮想環境間で共通の binary を利用するので、disk に無駄なコピーができることはない。
  • インストールされたパッケージのみ仮想環境ごとに保持されている

pipenv 環境構築

下記のように、pipenv を brew からインストールした場合、pipenv 専用に python binary がインストールされる。

brew install pipenv

私がやったときだと、以下の場所に brew によって python 3.9 がインストールされている。

/usr/local/Cellar/python@3.9/3.9.0/bin/python3

任意の python version で pipenv を使いたい場合は、pip でインストールする。

$ pip install pipenv

任意の python version の仮想環境を作る。

$ pipenv install --python 3.8.3

実行すると、Pipfile が生成され、仮想環境の情報が記載される。

Pipfile に記載された仮想環境に入る。

$ pipenv shell

仮想環境から抜ける。

$ exit # ctrl + d

既に Pipfile があるディレクトリの仮想環境をインストールする。

$ pipenv install --dev
$ pipenv shell

pipenv で anaconda を管理したい場合

$ pipenv --python=/path/to/python --site-packages

で別途インストールした anaconda の python binary の path を指定すれば良さそう。

Advanced Usage of Pipenv pipenv 2020.8.13.dev0 documentation

pipenv で作った仮想環境に入っている時に、その仮想環境情報を prompt に表示する。

function virtualenv_info(){
# Get Virtual Env
if [[ -n "$VIRTUAL_ENV" ]]; then
# Strip out the path and just leave the env name
venv="${VIRTUAL_ENV##*/}"
else
# In case you don't have one activated
venv=''
fi
[[ -n "$venv" ]] && echo "(venv:$venv) "
}
# disable the default virtualenv prompt change
export VIRTUAL_ENV_DISABLE_PROMPT=1
VENV="\$(virtualenv_info)";
# the '...' are for irrelevant info here.
export PS1="... ${VENV} ..."

Ref: How do I change the default virtualenv prompt?

以下のようなかんじ。

2020 10 26 15 02 20

Ref: https://github.com/hnishi/dotfiles/blob/4d2e81db08762d8c873c555c3ea61296caefcf91/.bashrc#L142-L188

デフォルトの仮想環境ごとのパッケージ保存先

~/.local/share/virtualenvs/your_env/lib/python3.8/site-packages/

以下のように、python bunary はリンクになっている。

$ ls -l ~/.local/share/virtualenvs/your_env/bin/python
lrwxr-xr-x 1 username staff 60 10 26 14:16 /Users/username/.local/share/virtualenvs/your_env/bin/python -> /Users/username/.pyenv/versions/3.8.3/bin/python3.8

formatter: autopep8

Ref: GitHubじゃ!Pythonじゃ!

インストール

by pipenv

$ pipenv install --dev autopep8

by pip

$ pip install autopep8

実行

単一のファイルに対して実行。(aggressive level 2)

$ autopep8 --in-place --aggressive --aggressive tutorial_orm.py

recursive に実行 (—in-place or —diff オプションが必要)。

test というディレクトリに対して、再帰的に実行。

$ autopep8 --diff -r test # 変更箇所の確認
$ autopep8 --in-place -r test # 変更の反映

linter: flake8

Ref: Flake8: Your Tool For Style Guide Enforcement flake8 3.8.4 documentation

単一のファイルに対して実行。

$ flake8 tutorial_orm.py

再帰的に実行

$ flake8 # カレントディレクトリ以下のファイルに対して

テスト: python 標準の unittest

Ref: unittest --- ユニットテストフレームワーク Python 3.9.0 ドキュメント

単一のファイルに対して実行。

$ python -m unittest tests/test_something.py

再帰的に実行。

$ python -m unittest

引数無しで実行すると テストディスカバリ が開始されます:

テストファイル名を識別するパターン (デフォルトは test*.py)

カバレッジの取得: coverage

Ref: Coverage.py Coverage.py 5.3 documentation

  • Python の標準でインストールされている単体テストフレームワークの unittest にはカバレッジを取得する機能がないので、coverage を組み合わせて使う

インストール

$ pipenv install -d coverage

単一のファイルに対して単体テストを実行。

$ coverage run -m unittest discover

カレントディレクトリに、 .coverage ファイルが生成される。

カバレッジレポートの出力。

$ coverage report -m

もし、coverage がインストールしたパッケージまで走査している場合、 --source オプションで、プロジェクトディレクトリを指定する。

$ coverage run --source . --omit test*.py -m unittest

--omit test*.py を指定することで、テストコードのテストコードは対象外とする。

レポート出力は、通常通り。

$ coverage report -m

Ref: preventing python coverage from including virtual environment site packages


hnishi のブログ


技術系の記事など。
綺麗に書こうとすると続かない気がするので、割と雑に、備忘録的に書いていく方針。
内容に誤りがあった場合などのご連絡は、Twitter の DM などで頂けると幸いです。