$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

zsh-autoenvを使って、virtualenvの自動activate/deactivateを実現する

 pyenv + venvでPython3環境を構築する - $shibayu36->blog; の記事で、特定のPythonプロジェクト用のvirtualenv環境を導入することが出来ました。しかし、このプロジェクトに入るたびにsource venv/bin/activateし、逆に抜ける時にdeactivateするのは

  • 面倒
  • どう考えても実行を忘れる

という問題があります。

 そこでzsh-autoenvというzshプラグインを使って、自動でactivateとdeactivateを出来るようにしたのでメモしておきます。

zplugを導入する

今回の本題から外れますが、zshプラグインの管理ツールをこれまで入れてこなかったので、この機会にzplugを導入しました。

$ curl -sL --proto-redir -all,https https://zplug.sh/installer | zsh

でインストールし、下記設定をするだけの簡単導入でした。

# ---------------- setting for zplug --------------------------
source ~/.zplug/init.zsh

# zsh-autoenvのインストール
zplug "Tarrasch/zsh-autoenv"

# Install plugins if there are plugins that have not been installed
if ! zplug check --verbose; then
    printf "Install? [y/N]: "
    if read -q; then
        echo; zplug install
    fi
fi

# プラグインを読み込み、コマンドにパスを通す
zplug load --verbose

zsh-autoenvを使って自動でactivateとdeactivateを出来るように

 zsh-autoenv とは、

  • ディレクトリに.autoenv.zshを置いておくと、そのディレクトリ以下に入った時に自動でそのファイルを実行してくれる
  • ディレクトリに.autoenv_leave.zshを置いておくと、そのディレクトリから抜ける時に自動でそのファイルを実行してくれる

というものです。これを使えば

が実現できますね。

インストール

 先程zplugを導入したので、.zshrcに以下を追加するだけです。

zplug "Tarrasch/zsh-autoenv"

venv環境を作る

 以下のコマンドでvenv環境を作ります。

$ mkdir python-playground
$ cd python-playground
$ python -m venv venv

これでpython-playground/venvディレクトリ下にpythonの環境が作られました。

zsh-autoenvの設定を行う

 python-playgroundディレクトリにて以下のコマンドを実行し、.autoenv.zsh.autoenv_leave.zshを用意します。

$ echo 'source venv/bin/activate' > .autoenv.zsh
$ echo 'deactivate' > .autoenv_leave.zsh

 これでディレクトリに入ったらactivateし、ディレクトリから出たらdeactivateされるはずです。

確認する

 ではこのディレクトリに入ってみます。

$ cd python-playground
Attempting to load unauthorized env file!
-rw-r--r--  1 shibayu36  staff  25 Apr  1 21:20 /Users/shibayu36/development/src/github.com/shibayu36/python-playground/.autoenv.zsh

**********************************************

source venv/bin/activate

**********************************************

Would you like to authorize it? (type 'yes') yes
$ which python
/Users/shibayu36/development/src/github.com/shibayu36/python-playground/venv/bin/python

 初回はファイルを実行してよいか聞かれるのでyesと答えます。which pythonすると、ディレクトリ配下のpythonを示すようになっているので、cdでディレクトリに入っただけでvirtualenvのactivateがされるようになりました。


 逆にディレクトリを出てみます。

$ cd ..
Attempting to load unauthorized env file!
-rw-r--r--  1 shibayu36  staff  11 Apr  1 21:20 /Users/shibayu36/development/src/github.com/shibayu36/python-playground/.autoenv_leave.zsh

**********************************************

deactivate

**********************************************

Would you like to authorize it? (type 'yes') yes
$ which python
/Users/shibayu36/.anyenv/envs/pyenv/shims/python

 こちらも初回は確認が出るのでyesと答えます。そうするとディレクトリを出るだけでpyenvのpythonを指し示すようになり、自動でdeactivateされるようになりました。

まとめ

 今回はzsh-autoenvを使って、ディレクトリに入った時に自動でvirtualenvをactivateし、ディレクトリから出た時に自動でdeactivateするということをしてみました。zsh-autoenvは他にもいろいろと使えそうで良いですね。