LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-11

はじめに

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
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3