direnv と pyenv による Python 環境の管理

Pythonの開発者として、私たちのほとんどは仮想環境についてよく知っています。

新しいプロジェクトで作業するときに最初にすることの1つは、環境を作成することです。

そのためにvirtualenvやvenvを使うのが一般的です。

新しいプロジェクトで使用するパッケージはそれぞれ異なり、1つのPythonのバージョンにしか対応していないこともあります。

繰り返し行うことは、自動化の対象になります。

この記事では、 direnvpyenv がどのようにそれを助けてくれるかを見ていきます。

余談ですが、最近のIDEはすでにこれらのステップを自動化しているものがあります。

例えば、PyCharmはプロジェクトを初期化するときに仮想環境を作成します。

これらのステップをすべて自動化することは、そのような機能をサポートするIDEを使用する場合には素晴らしい勝利ですが、より一般的なソリューションはIDEにとらわれないものであるべきです。

仮想環境(virtualenv)の問題点

GitHubであるプロジェクトを見つけ、それをいじりたいとします。

Pyweather は、現在地の拡張天気予報を要求し、ターミナルに表示するシンプルなスクリプトです。

このスクリプトを自分のマシンで試すには、以下のような手順を踏みます。

$ git clone https://github.com/lcofre/pyweather.git
$ cd pyweather


次に、仮想環境を作成し、スクリプトが使用するパッケージをインストールします。

$ virtualenv --python=python3 env
$ source env/bin/activate
(env) $ pip install requirements.txt


そして、スクリプトを実行することができます。

(env) $ ./pyweather.py


仮想環境を作成し、プロジェクトのルートフォルダーに保存しました。

そのフォルダーにいる間に、sourceコマンドで環境を有効にする必要がありました。

作業が終わったら、deactivateコマンドを実行して仮想環境から離脱します。

(env) $ deactivate


これらのステップはすべて私たちの責任です。

では、 direnv がどのようにこれを自動化してくれるのか見てみましょう。

DIREV

direnv` は主にカレントディレクトリに依存する環境変数をロードするために作られ、多くのシェルに対応する拡張機能を備えています。

この例では bash を使用しますが、 direnv は他の多くのシェルもサポートしています。

さらに重要なのは、Pythonの仮想環境を管理することができるようになることです。

インストールするには bash が提供するインストーラを実行します。

ディストリビューションのパッケージマネージャを使用することもできますが、 bash インストーラは利用可能な最新バージョンをインストールすることを保証してくれます。

$ curl -sfL https://direnv.net/install.sh | bash


ここで、 direnvbash にフックする必要があります。

次に ~/.bashrc を編集して、リロードします。

$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
$ source ~/.bashrc


こうすると、direnv がシェルにリンクされ、プロンプトの前に常に実行されるようになります。

バックグラウンドで動作していることに気づくことはありません。

direnvは現在のフォルダに何かをロードする必要があるかどうかをチェックします。

これは.envrc` という名前のファイルがあるかどうかをチェックし、そこに何を読み込むべきかの指示が書かれています。

Python仮想環境をロードするには、 layout コマンドを実行し、その後にPythonのバージョンを指定します。

$ echo 'layout python' > .envrc


また、Python 3を使用する場合は、次のようにします。

$ echo 'layout python3' > .envrc


これらを実行すると、パス上にある python または python3 の実行ファイルを探すように direnv に指示します。

.envrcファイルを作成するとすぐに、direnv` がそのフォルダにアクセスできるようにする必要があるという警告が表示されます。

今すぐそうしましょう。

$ direnv allow


direnv: loading .envrc
...
New python executable in /home/myuser/untitled/.direnv/python-3.6.9/bin/python3
...
Installing setuptools, pkg_resources, pip, wheel...direnv:
done.
direnv: export +VIRTUAL_ENV ~PATH


出力に見られるように、仮想環境はすぐに作成されました。

しかし、プロンプトは変更されないので、最初に書かれた環境の名前は表示されません。

あとは、前節で作成した環境と同じように、必要なパッケージをインストールします。

$ pip install -r requirements.txt


direnv` はバックグラウンドで静かに環境を有効にします。

このディレクトリから移動するたびに、環境は解除されます。

$ cd ..


direnv: unloading


システムにインストールされているすべてのバージョンのPythonを使用できるのであれば、 direnv があれば十分です。

ここで、pyweatherスクリプトが非常に特殊なバージョンを要求していると仮定しましょう。

pyenv

pyenvは Python 用のバージョン管理ユーティリティです。

特に、プロジェクト単位で Python のバージョンを変更することができます。

バージョン2.21.0からはdirenv` がサポートしているので、これらを併用することで、私たちの環境で使用するバージョンをより高いレベルで管理することができます。

まずは、 pyenv をインストールすることから始めましょう。

$ curl -L https://pyenv.run | bash


そして、ターミナルから常にアクセスできるようにします。

$ echo 'export PATH="~/.pyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
$ source ~/.bashrc


ここで、pyweatherスクリプトが非常に特殊なPythonのバージョン、3.6.2を必要とするとしましょう。

まず、そのバージョンのPythonをインストールする必要があります。

$ pyenv install 3.6.2


そして、そのバージョンを使用するようにプロジェクトを設定します。

$ echo 'layout pyenv 3.6.2' > .envrc
$ direnv allow


Pythonのバージョンを確認することで、期待通りに動作していることを確認できます。

$ python --version


Python 3.6.2


もし、Pythonのバージョンを変更する必要があれば、.envrcファイルのレイアウトを変更すれば十分でしょう。

この2つのユーティリティのおかげで、レイアウトを任意のPythonバージョンに変更することができ、仮想環境はすぐに更新されます。

また、 direnvpyenv の両方を使用するもう一つの利点は、 .envrc ファイルをプロジェクトリポジトリでバージョン管理できることです。

これにより、すべての貢献者は、必要なユーティリティとPythonのバージョンをインストールすれば、プロジェクトの意図通りに環境を設定することができます。

結論

仮想環境は、ある意味 Python の開発ワークフローから切り離されたものです。

プロジェクトで作業する前に、仮想環境の設定と起動を忘れないようにしなければなりません。

direnvpyenv` のおかげで、これらすべてを自動化することができ、プロジェクトフォルダを入力すると、バックグラウンドですべての作業が行われます。

両方のユーティリティのインストールは簡単ではありませんが、一度行えば、多くの時間を節約できます。

また、正しい仮想環境とPythonのバージョンで作業しているという確信が常に持てます。

タイトルとURLをコピーしました