Python仮想環境のbest practiceの模索

2023/03/02に公開

概要

  • 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

  1. pyenvで必要なバージョンをインストール(3.7.6など)
# 実行例
pyenv install 3.7.6
  1. Pythonのバージョン切り替え
# 実行例
pyenv local 3.7.6
  1. venvで仮想環境を作成
# 実行例
python -m venv venv
  1. 仮想環境に入る
# 実行例
source venv/bin/activate
  1. pipを必要に応じてupgrade
# 実行例
pip install --upgrade pip
  1. 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

新規プロジェクトの場合

  1. pyenvで使用したいPythonバージョンをインストール
# 実行例
pyenv install 3.9.6
  1. インストールしたPythonバージョンに切り替え
# 実行例
pyenv local 3.9.6
  1. poetryで新規プロジェクト作成
# 実行例
poetry new new_project_name
  1. 新規プロジェクトで仮想環境を作成
# 実行例
cd new_project_name
poetry install

既存のプロジェクトに適用する場合

  1. poetryを既存のプロジェクトにルートなどで初期化
# 以下を実行後、対話的にいろいろな質問が来る
poetry init
  1. 仮想環境を作成し、依存関係をインストール
# いくつかの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

  1. conda環境を新しく作成
  • 環境名:myenv
  • python:3.7.6
# 実行例
conda create -n myenv python=3.7.6
  1. conda環境に入る
# 実行例
conda activate myenv
  1. パッケージのインストール
  • pipかcondaのどちらか一方を使用することに決める
  • pipとcondaを両方使用すると、競合する可能性がある(競合したら解決がめんどくさい)
  1. conda環境から出る
# 実行例
conda deactivate
  1. conda環境を削除
# 実行例
conda remove -n myenv --all

感想

  • pyenv + venvよりはコマンドを打つ労力が少ない
    • venvディレクトリを作成する必要がない。その場所も気にしなくて良い。
  • condaとpipで競合しないようにすることはとても重要
  • 多様なPythonバージョンが利用できるわけでは無い?(要調査)
  • 仮想環境の依存関係はyamlファイルなどに出力できる
    • そのyamlファイルから新しく仮想環境を作成することもできる.

さいごに

いくつかのパッケージ・Pythonバージョン管理ツールを紹介した。どれがbestかはまだ模索中。(いろいろ試したり、異なる環境でも一貫して使えるかなどを調べたい。)
ちなみに、筆者はpyenv + venvが多い。これは今回紹介した中では、一番マニュアル感が強い印象。

不明点、もしくは記載の間違いなどあれば、ぜひコメントを頂けるとても助かります。(m_ _m)

参考

Poetryをサクッと使い始めてみる
VSCodeとPoetryで作るPython開発環境

Discussion