Pythonの開発者として、私たちのほとんどは仮想環境についてよく知っています。
新しいプロジェクトで作業するときに最初にすることの1つは、環境を作成することです。
そのためにvirtualenvやvenvを使うのが一般的です。
新しいプロジェクトで使用するパッケージはそれぞれ異なり、1つのPythonのバージョンにしか対応していないこともあります。
繰り返し行うことは、自動化の対象になります。
この記事では、 direnv
と pyenv
がどのようにそれを助けてくれるかを見ていきます。
余談ですが、最近の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
ここで、 direnv
を bash
にフックする必要があります。
次に ~/.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バージョンに変更することができ、仮想環境はすぐに更新されます。
また、 direnv
と pyenv
の両方を使用するもう一つの利点は、 .envrc
ファイルをプロジェクトリポジトリでバージョン管理できることです。
これにより、すべての貢献者は、必要なユーティリティとPythonのバージョンをインストールすれば、プロジェクトの意図通りに環境を設定することができます。
結論
仮想環境は、ある意味 Python の開発ワークフローから切り離されたものです。
プロジェクトで作業する前に、仮想環境の設定と起動を忘れないようにしなければなりません。
direnvと
pyenv` のおかげで、これらすべてを自動化することができ、プロジェクトフォルダを入力すると、バックグラウンドですべての作業が行われます。
両方のユーティリティのインストールは簡単ではありませんが、一度行えば、多くの時間を節約できます。
また、正しい仮想環境とPythonのバージョンで作業しているという確信が常に持てます。