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 を使えば良いと思う
tool | python | package |
---|---|---|
venv | False | True |
pyenv | True | True |
Pipenv | True | True |
Anaconda | True | True |
- Anaconda は、色んなものが入っていて重たいので、使わなくて良いと思う
- 昔は、scientific なパッケージが pip で利用できなかったらしく、Anaconda が重宝されたとか
- Anaconda のパッケージ管理には、pip ではなく conda を使う
- たまに、pip では利用できないが、conda で利用できるパッケージがある
- conda は Intel MKL を使った numpy を配布しており、pip は OpenBLAS を使った numpy を配布しているようで、Anaconda の numpy が pip の numpy より早くなるという話がある
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 versionssystem* 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 Envif [[ -n "$VIRTUAL_ENV" ]]; then# Strip out the path and just leave the env namevenv="${VIRTUAL_ENV##*/}"else# In case you don't have one activatedvenv=''fi[[ -n "$venv" ]] && echo "(venv:$venv) "}# disable the default virtualenv prompt changeexport VIRTUAL_ENV_DISABLE_PROMPT=1VENV="\$(virtualenv_info)";# the '...' are for irrelevant info here.export PS1="... ${VENV} ..."
Ref: How do I change the default virtualenv prompt?
以下のようなかんじ。
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/pythonlrwxr-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