Python開発環境(pyenv+pipx+poetry)の構築(2020)
この記事では、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 --path)"\nfi' >> ~/.bash_profile
- shellがzshの場合
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init --path)"\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
の編集が大変です。
そこで、パッケージ管理用のツールを使います。
パッケージ管理ツールは色々ありますが、私はPipenv
、Poetry
、Pyflow
を使ったことがありますので、私の所感を以下に記載します。なお、現在はPoetry
に落ち着いています。(早くパッケージ管理のベスプラを見つけたい。。。)
パッケージ管理ツール | 所感 |
---|---|
Pipenv | pyenvと連携してPythonのバージョンを同時に管理できる。 lockファイルを作成する時に時間がかかる場合がある (2020年に入ってから更新頻度が上っているので、解消済?) |
Poetry | PEP 518で提案された pyproject.tomlを採用。 使用するPythonのバージョンを事前にpyenvで指定する必要がある。 lockファイルの作成時間は早いと思う。 pyproject.tomlのnameを空にできないので、templete用のpyproject.tomlをちょっと作りづらい |
Pyflow | rustで作成されている。 パッケージ管理と合わせて、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開発環境の構築手順を紹介しました。ただ、構築手順はまだベスプラが無く、試行錯誤している段階です。今後も定期的に更新していきたいと思います。 この記事が少しでも皆様の参考になると嬉しいです。