はじめに
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