Edited at

Conda環境をアクティベイトしたときに特定の処理を実行させる方法

More than 1 year has passed since last update.


はじめに

Anaconda Pytonn を使っていて Conda環境を作成したときに、

そのConda環境をアクティベイトしたタイミングで、

環境変数を設定するといったように特定の処理を行ないたい場合があります。

この方法についての備忘録です。


Condaのディレクトリ構造

Anaconda Python を /home/iisaka/conda/x64 にインストールしたとすると、

次のようにディレクトリが展開されます

$ tree -L 1 /home/iisaka/conda/x64

/home/iisaka/conda/x64
├── bin
├── conda-meta
├── envs
├── etc
├── include
├── lib
├── LICENSE.txt
├── pkgs
├── share
└── ssl

9 directories, 1 file


Conda環境のアクティベイト/ディアクティベイト

Conda環境を作成すると ${_CONDA_ROOT}/envs 以下に 環境名のディレクトリが作成されます。

$ conda create -y -n demo

Conda環境をアクティベイト/ディアクティベイトするタイミングで、

base環境にある activate と deactivate が実行されます。

このスクリプトは次のようになっています。

$ cat /home/iisaka/conda/x64/bin/activate

#!/bin/sh
_CONDA_ROOT="/home/iisaka/conda/x64"
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
_conda_activate "$@"

$ cat /home/iisaka/conda/x64/bin/deactivate

#!/bin/sh
_CONDA_ROOT="/home/iisaka/conda/x64"
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
_conda_deactivate "$@"


Conda環境毎に処理を実行させるように修正

これを次のように修正すると、

${_CONDA_ROOT}/envs/環境名 以下の

/etc/activate.h と etc/deactivate.h が

アクティベイト/ディアクティベイトのタイミングで実行されるようになります。

$ cat /home/iisaka/conda/x64/bin/activate

#!/bin/sh
_CONDA_ROOT="/home/iisaka/conda/x64"
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
if [ -f "$_CONDA_ROOT/envs/$1/etc/activate.sh" ] ; then
\. "$_CONDA_ROOT/envs/$1/etc/activate.sh" || return $?
fi
_conda_activate "$@"

$ cat /home/iisaka/conda/x64/bin/deactivate

#!/bin/sh
_CONDA_ROOT="/home/iisaka/conda/x64"
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
if [ -f "$_CONDA_ROOT/envs/${CONDA_DEFAULT_ENV}/etc/deactivate.sh" ] ; then
\. "$_CONDA_ROOT/envs/${CONDA_DEFAULT_ENV}/etc/deactivate.sh" || return $?
fi
_conda_deactivate "$@"


制限事項

次のように環境変数を設定するときは注意が必要です。

$ cat /home/iisaka/conda/x64/envs/demo/etc/activate.sh

_SAVE_CUDA_ROOT=${CUDA_ROOT}
CUDA_ROOT=/usr/local/cuda-8.0
exoprt CUDA_ROOT

$ cat /home/iisaka/conda/x64/envs/demo/etc/deactivate.sh

if [ ${_SAVE_CUDA_ROOT} != "" ] ; then
CUDA_ROOT=${_SAVE_CUDA_ROOT}
exoprt CUDA_ROOT
unset _SAVE_CUDA_ROOT
else
unset CUDA_ROOT
fi

conda環境をアクティベイトするときに次の方法ではうまく処理できません。

$ conda activate demo

$ echo $CUDA_ROOT

source コマンドでアクティベイトするようにすると期待通りになります。

$ source activate demo

$ echo $CUDA_ROOT
/usr/local/cuda-8.0

$ source deactivate
$ echo $CUDA_ROOT