⛳
Python仮想環境のbest practiceの模索
概要
- Pythonによるコーディングに必要なものは以下
- Pythonのバージョン管理
- パッケージ管理
- いくつかの仮想環境の構築方法を試した
- pyenv + venv
- poetry
- anaconda
- 今後も更新し、体系的にまとめたい
なぜ仮想環境が必要か?
Pythonを用いたコーディングについて、必要なものは以下の通り。
- Pythonのバージョン管理
- 3.7.6などの特定のバージョンを使いたい
- パッケージ管理
- numpy, pandasなどのプロジェクトに必要なパッケージを管理したい
- パッケージのバージョンや依存関係も管理したい
Pythonのバージョンと使用するパッケージは、プロジェクトごとに異なることが多いため、プロジェクト毎に異なる開発環境があると良い。
使用するコンピュータの元の環境を汚染しないように、プロジェクト毎に作成する開発環境を仮想環境と呼んだりする。
Pythonのバージョン管理
Pythonのバージョン管理には、以下のようなツールがある。
- pyenv
パッケージ管理
パッケージ管理には、以下のようなツールがある。
- pipenv
- poetory
- pyflow
仮想環境manager
仮想環境の作成と管理を行うツール。また、依存関係管理などの追加機能も提供する。
- anaconda
- venv
- virtualenv
組み合わせパターンと使用例
pyenv + venv
Installation
- venvはpython3.3以降に標準でインストールされているらしい
- pyenvのインストール方法は以下の通り
# githubからcloneする場合
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# Homebrewを使用する場合
brew install pyenv
- pyenvをインストール後、PATHを通す
# bashの場合
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bshrc
echo 'eval "$(pyenv init -)"' >> ~/.bshrc
source ~/.bashrc
# zshの場合
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc
- 以下のコマンドを入力して、pyenvがインストールされているか確認
pyenv --version
Usage
- pyenvで必要なバージョンをインストール(3.7.6など)
# 実行例
pyenv install 3.7.6
- Pythonのバージョン切り替え
# 実行例
pyenv local 3.7.6
- venvで仮想環境を作成
# 実行例
python -m venv venv
- 仮想環境に入る
# 実行例
source venv/bin/activate
- pipを必要に応じてupgrade
# 実行例
pip install --upgrade pip
-
requirements.txt
を参照して、必要なパッケージをインストール
# 実行例
pip install -r requirements.txt
感想
- pyenvは、Pythonのバージョン管理に便利
- 新しいパッケージをインストールしたり、バージョンを変更したりする場合は
requirements.txt
を更新する必要がある- 更新作業は
pip freeze
で行えるため容易だが、たまに忘る
- 更新作業は
pyenv + poetry
Installation
- pyenvのインストールは上記を参照
- poetryをインストール
# 実行例1 (home dirで実行)
curl -sSL https://install.python-poetry.org | python3 -
# その後、PATHを通す。基本的にはインストール後に表示されるメッセージに従えば良い
# 実行例2 Homebrew
brew install poetry
- 以下のコマンドで、poetryがインストールされているか確認
poetry -V
新規プロジェクトの場合
- pyenvで使用したいPythonバージョンをインストール
# 実行例
pyenv install 3.9.6
- インストールしたPythonバージョンに切り替え
# 実行例
pyenv local 3.9.6
- poetryで新規プロジェクト作成
# 実行例
poetry new new_project_name
- 新規プロジェクトで仮想環境を作成
# 実行例
cd new_project_name
poetry install
既存のプロジェクトに適用する場合
- poetryを既存のプロジェクトにルートなどで初期化
# 以下を実行後、対話的にいろいろな質問が来る
poetry init
- 仮想環境を作成し、依存関係をインストール
# いくつかのoptionあり
poetry install
その後の運用
- パッケージの追加
# 実行例
poetry add numpy
-
requirements.txt
からパッケージを追加する例
for package in $(cat requirements.txt); do poetry add "${package}"; done
- インストール済みパッケージの更新
# ドライランで更新対象のパッケージを確認
poetry update --dry-run
# 実際に更新
poetry update
- 仮想環境でのプログラムの実行
# 実行例1
poetry run python python_file.py
# 実行例2
poetry shell
python python_file.py
感想
- 自動的に仮想環境を作成してくれて便利
- 新しくパッケージをインストールしたら、自動的にpoetryの設定ファイルが更新されて便利
- パッケージの公開もできるらしい、いいね
- ロックファイルを作ることにより、異なる環境間でも必ず同じバージョンのパッケージがインストールされるらしい。良い。
-
pyenv + venv
の上位互換というイメージ
Anaconda
Installation
- Anacondaの記事は豊富にあるため、説明は別の記事に譲る
Usage
- conda環境を新しく作成
- 環境名:myenv
- python:3.7.6
# 実行例
conda create -n myenv python=3.7.6
- conda環境に入る
# 実行例
conda activate myenv
- パッケージのインストール
- pipかcondaのどちらか一方を使用することに決める
- pipとcondaを両方使用すると、競合する可能性がある(競合したら解決がめんどくさい)
- conda環境から出る
# 実行例
conda deactivate
- conda環境を削除
# 実行例
conda remove -n myenv --all
感想
- pyenv + venvよりはコマンドを打つ労力が少ない
- venvディレクトリを作成する必要がない。その場所も気にしなくて良い。
- condaとpipで競合しないようにすることはとても重要
- 多様なPythonバージョンが利用できるわけでは無い?(要調査)
- 仮想環境の依存関係はyamlファイルなどに出力できる
- そのyamlファイルから新しく仮想環境を作成することもできる.
さいごに
いくつかのパッケージ・Pythonバージョン管理ツールを紹介した。どれがbestかはまだ模索中。(いろいろ試したり、異なる環境でも一貫して使えるかなどを調べたい。)
ちなみに、筆者はpyenv + venv
が多い。これは今回紹介した中では、一番マニュアル感が強い印象。
不明点、もしくは記載の間違いなどあれば、ぜひコメントを頂けるとても助かります。(m_ _m)
Discussion