Python開発環境(pyenv+pipx+poetry)の構築(2020)

2020年7月25日

この記事では、Pythonの開発環境の構築手順を紹介します。

構築手順の概要は、以下の通りです。

  • Pythonのバージョン管理をpipenvで実施
  • pipでインストールするコマンドの管理をpipxで実施
  • Pythonのパッケージ管理をpoetryで実施

それでは、順に手順を紹介してきます。

Pythonのバージョン管理

まず、以下の理由からデフォルトでインストールされているPythonをそのまま利用したくありません。

  • デフォルトのPythonのバージョンは、OSやディストリビューションによって異なる(そもそもインストールされていない可能性もあり)。
  • デフォルトのPythonはシステムで利用されている可能性があるので、できるだけ汚したくない。
  • プロジェクトごとに、任意のバージョンのPythonを利用したい。
  • 個人利用ならば、常に最新バージョンのPythonとともに歩みたい。

そこで、pyenvを利用します。pyenvを使うと好きなバージョンのPythonのインストールとその切替が容易にできるようになります。つまり、Pythonの仮想環境を自由に作成できます。

pyenvのインストール

公式のインストール方法に従ってインストールを進めます。

まず、以下のコマンドでpyenvをクローンします。
MacOSの場合は、homebrewでもpyenvをインストールできますが、Linuxと環境を揃えたいので、私は、MacOSでもgithubからクローンします。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

次にshellにpyenvへのPATHを通します。(私はzshを利用しています。)

  • shellがbashの場合
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
  • shellがzshの場合
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc

以下のコマンドでshell起動時に pyenv init が実行されるようにします。

  • shellがbashの場合
    echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
  • shellがzshの場合
    echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

最後に以下のコマンドでshellを再起動して、インストール完了です。

exec "$SHELL"

pyenvによるPythonのインストールと指定

pyenvを利用してPythonをインストールします。
pyenvの詳細な使い方は公式や他の方のWeb記事を参照いただければと思います。
以下のコマンドでインストールしたいPythonを探します。
色々なバージョンのPythonが表示されますが、今回は最新の安定板である3.8.4をインストールします。

pyenv install --list

以下のコマンドでPython 3.8.4をインストールします。

pyenv install 3.8.4

pyenv globalコマンドでインストールしたPythonをデフォルトで使用するようにします。

# globalとして、3.8.4を指定
pyenv global 3.8.4

# Pythonのバージョンの確認
python --version

# <出力例>
Python 3.8.4

なお、任意のディレクトリで以下のpyenv localコマンドを実施するとそのディレクトリ配下で指定バージョンのPythonが利用できるようになります。
そのため、プロジェクトごとに異なるバージョンのPythonを利用したい場合は、pyenv installコマンドで必要なバージョンのPythonをインストールしてから、プロジェクトのディレクトリに移動してpyenv localコマンドで利用するPythonのバージョンを指定します。

# 任意のディレクトリ(今回はproject1)に移動
cd project1

# project1配下で利用するpythonのバージョンとして3.8.4を指定
pyenv local 3.8.4

pipでインストールするコマンドの管理

Pythonには、pipでインストールできるコマンドが多数あります。
ただこれらのコマンドをインストールすると、インストールしたPythonのパッケージの依存関係に影響があったり、他のバージョンのPython(コマンドをインスールしていないPython)を使う場合にインストールしたコマンドが実行できなくなる場合があります。

そこで、pipxをインストールすることで、アプリケーション用の仮想Python環境を作成して、自由にアプリケーションを実行できるようにします。

pipxのインストール

公式のインストール方法に従ってインストールを進めます。
MacOSの場合は、homebrewでもpipxをインストールできますが、Linuxと環境を揃えたいので、pyenvでglobalに設定したPythonのpipでインストールします。

# pyenv globalを実施済の想定
pip install pipx

次に以下のコマンドでshellにpipxでインストールされるアプリケーションへのPATHを通します。
~/.local/binへのPATHを通しているだけのようですので、以下コマンドを実行せずに手動でPATHを通しても問題ありません。

pipx ensurepath

なお、以下のコマンドの指示に従うとshellでpipxの補完を利用できるようになります。

pipx completions

pipxでのコマンドのインストール

以下のコマンドで指定したコマンドをインストールできます。

pipx install <コマンド名>

参考までに私がインストールしているコマンドを紹介します。

# jupyter lab
pipx install jupyterlab
# コードチェッカー
pipx install flake8
# import順序の自動整理
pipx install isort
#機械学習モデルのライフサイクル管理
pipx install mlflow

Pythonのパッケージ管理

Pythonではrequirements.txtを元にpipでパッケージの管理を行えますが、依存関係の管理を正確に行うためには、requirements.txtの編集が大変です。

そこで、パッケージ管理用のツールを使います。
パッケージ管理ツールは色々ありますが、私はPipenvPoetryPyflowを使ったことがありますので、私の所感を以下に記載します。なお、現在はPoetryに落ち着いています。(早くパッケージ管理のベスプラを見つけたい。。。)

パッケージ管理ツール所感
Pipenvpyenvと連携してPythonのバージョンを同時に管理できる。
lockファイルを作成する時に時間がかかる場合がある (2020年に入ってから更新頻度が上っているので、解消済?)
PoetryPEP 518で提案された pyproject.tomlを採用。
使用するPythonのバージョンを事前にpyenvで指定する必要がある。
lockファイルの作成時間は早いと思う。
pyproject.tomlのnameを空にできないので、templete用のpyproject.tomlをちょっと作りづらい
Pyflowrustで作成されている。
パッケージ管理と合わせて、Pythonのバージョン管理ができる。
PEP 582に対応済のため、.venvが不要(作成されない)。
pyproject.tomlのnameを空にできる。

rust製のPyflowが個人的に好きなのですが、PEP 582に対応した結果、.venvを作成しない点が私の開発環境(Emacs + elpy)では、致命的でした。
いつかPyflowにしてみたいですが、現在は、上記の点からPoetryを利用しています。

Poetryのインストール

公式のインストール方法に従ってインストールを進めます。

まず、以下のコマンドでPoetryをインストールします。
なお、私の環境では、コマンド末尾のpythonはpyenvでglobalに指定したpython3をさしています。この末尾のpython部分は適宜自分の環境のpythonを指定してください。

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python

なお、Poetryも上述のpipxでインストールしたくなりますが、(公式でpipxでのインストールが非推奨)のため、pipxではインストールしません。

また、Poetry では、デフォルトで .venv がホームディレクトリ内に作成されますが、管理の都合上、.venvはプロジェクトディレクトリ内に作成されることが望ましいため、以下のコマンドを実行してプロジェクトディレクトリ内に.venvを作成するようにします。

poetry config virtualenvs.in-project true

Python開発環境の作成

pyenvとPoetryのインストールが完了しましたので、実際にプロジェクトのPython開発環境を作成します。

まず、プロジェクト用ディレクトリを作成して、移動します。ここでは、project1というディレクトリにします。

mkdir project1
cd project1

次にプロジェクトで使用するPythonをpyenvでインストールします。今回は、Python 3.7.8を使用することにします。(既にインストール済の場合はPython 3.7.8対応不要)

pyenv install 3.7.8

インストールしたPythonをプロジェクト用ディレクトリで有効化します。これでプロジェクト用ディレクトリ配下ではインストールしたPythonがデフォルトで使用されます。

pyenv local 3.7.8

以下のコマンドを実行して、pyproject.tomlを作成します。
対話形式で進むので、適宜入力していきます。

poetry init

以下のコマンドでプロジェクトに必要なパッケージを追加します。この際にpyproject.tomlとpoetry.lockが自動的に更新されます。

poetry add <パッケージ名>

なお、poetry installコマンドでpyproject.tomlに従ってパッケージをインストールすることもできます。

Poetryの詳細なコマンドは、公式をご参照ください。

以上で、project1ディレクトリ内にPython3.7.8の開発環境が構築できました。後は好みのエディタを使って開発を進めていくだけです。

終わりに

今回は、私のPython開発環境の構築手順を紹介しました。ただ、構築手順はまだベスプラが無く、試行錯誤している段階です。今後も定期的に更新していきたいと思います。
この記事が少しでも皆様の参考になると嬉しいです。