手作業で行っていたpipenv installをdirenvのlayoutに任せてみた

pipenv installの手続きをdirenvのlayoutに任せてみました。とてもらくちんです。
2021.07.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Pythonの仮想環境をセットアップする必要がでてくると、これまでは以下の手続きを取っていました。

% pipenv sync --dev
% direnv edit .
source .venv/bin/activate
% direnv allow .

.envrcは既にグローバルの .gitignore へ追加済みの上で、惰性の操作になりつつあったので余り気にしていませんでしたが、ディレクトリ内にPipenv.lockファイルが無い状態でうっかり実行するとエラーになるのが鬱陶しい。

移動したらこのあたりの操作が全部勝手に行われると楽なんだけどな、と思いながらdirenvを弄っていたところ layout コマンドの存在を知り、もしやと思いソースコードを辿ってみた結果 layout pipenv の存在を見つけました。

direnvを通しての手軽な仮想環境設営手順について書いてみることにします。

layout コマンドについて

direnv についてはhomebrew等で導入してください。

brew install direnv

layoutコマンドは仮想環境設定の手続きをdirenvが引き受けるもので、やっていることは環境変数の判定や仮想環境作成等、これまで手作業やrcファイル等に記述していたものとなります。

今回利用するpipenvの場合。Pipfileを有無チェックと、virtualenv作成、そしてvirtualenvのパスを通しつつの環境変数設定で、日頃無意識なりでやっていることを自動で賄ってくれます。

layout_pipenv() {
  PIPENV_PIPFILE="${PIPENV_PIPFILE:-Pipfile}"
  if [[ ! -f "$PIPENV_PIPFILE" ]]; then
    log_error "No Pipfile found.  Use \`pipenv\` to create a \`$PIPENV_PIPFILE\` first."
    exit 2
  fi


  VIRTUAL_ENV=$(pipenv --venv 2>/dev/null ; true)


  if [[ -z $VIRTUAL_ENV || ! -d $VIRTUAL_ENV ]]; then
    pipenv install --dev
    VIRTUAL_ENV=$(pipenv --venv)
  fi


  PATH_add "$VIRTUAL_ENV/bin"
  export PIPENV_ACTIVE=1
  export VIRTUAL_ENV
}

layout pyenv もあるのですが、既にpipenvを使っている場合はvirtualenvのパスが異なるため今回は使いません。

実際に使ってみる

.envrc に追加して有効にします。

% echo "layout pipenv" >> .envrc
% direnv allow .
direnv: ([/usr/local/bin/direnv export zsh]) is taking a while to execute. Use CTRL-C to give up.
Creating a virtualenv for this project...
Pipfile: /path/to/Pipfile
Using /path/to/bin/python3.7m (3.7.10) to create virtualenv...
⠙ Creating virtual environment...created virtual environment CPython3.7.10.final.0-64 in 3043ms
  creator CPython3Posix(dest=/path/to/.venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/xxxx/Library/Application Support/virtualenv)
    added seed packages: pip==21.1.3, setuptools==57.0.0, wheel==0.36.2
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

✔ Successfully created virtual environment!
Virtualenv location: /path/to/.venv
Installing dependencies from Pipfile.lock (384f77)...

% which python
/path/to/.venv/bin/python

pipenv sync ではないため、lockファイルの更新差分反映については手動で行う必要があります。

あとがき

これまではvirtualenvの設定を手動で、activateの呼び出しをdirenvで行っていました。今後は基本一通りをdirenvに任せることにしようと思います。