The jonki

呼ばれて飛び出てじょじょじょじょーんき

direnvでanacondaの環境を自動で切り替える

tmuxとanacondaを私は使っているのですが,tmuxのpaneをスプリットしたときなど,anacondaの環境がbaseに毎度戻るのが嫌で色々方法を調べてました. やりたいことは,現在のpaneでアクティブなcondaの環境をtmuxにも引き継いで欲しい,ということです.

ただ調べた限り,そのあたりの受け渡しは容易ではなさそうだったので,ディレクトリごとに環境変数を設定できるdirenvを使ってこれを実現することにしました.

今回の記事でできること

  • 特定のディレクトリに入ると,そのディレクトリに設定してある環境変数を読み込み,conda環境を自動でactivateする
  • そのディレクトリを出ると,conda環境がbaseに戻る
  • tmuxとかでpaneを区切ってもカレントディレクトリが変わらない設定をしていれば,conda環境は自動で引き継ぎactivateされる

やりかた

direnvをインストール

% curl -sfL https://direnv.net/install.sh | bash
% echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc

$HOME/.direnvrcにconda activate関数を用意

conda環境名を引数に受け取り,activateする便利関数を用意しておきます.

% vi ~/.direnvrc
activate_conda(){
  eval "$(conda shell.zsh hook)"
  conda activate $1
}

環境を分けたいプロジェクトを作り,専用の.envrcを作成

ここにcondaの環境名を定義します(名前は適当です).

% conda create -n MyAwesomeEnv
% mkdir Awesome
% cd Awesome
% vi .envrc
export THIS_CONDA_ENV=MyAwesomeEnv
activate_conda $THIS_CONDA_ENV
% direnv allow .

ディレクトリの出入りでconda envが変わっていることを確認

ディレクトリの出入りで,自動でbaseとMyAwesomeEnvの環境が変わってるのがわかります.

% conda env list
# conda environments:
#
base                     /home/jonki/anaconda
MyAwesomeEnv          *  /home/jonki/anaconda/envs/MyAwesomeEnv

% cd ../
direnv: unloading
% conda env list
# conda environments:
#
base                  *  /home/jonki/anaconda
MyAwesomeEnv             /home/jonki/anaconda/envs/MyAwesomeEnv

% cd Awesome
direnv: loading ~/work/Awesome/.envrc
---activate_conda(MyAwesomeEnv)
direnv: export +CONDA_PREFIX_1 +THIS_CONDA_ENV ~CONDA_DEFAULT_ENV ~CONDA_PREFIX ~CONDA_PROMPT_MODIFIER ~CONDA_SHLVL ~PATH
% conda env list
# conda environments:
#
base                     /home/jonki/anaconda
MyAwesomeEnv          *  /home/jonki/anaconda/envs/MyAwesomeEnv

Enjoy!

もっと簡単な方法あるよ!って方はぜひ教えて下さい.