小林ノエルのエンジニア的忘備録

フリーランス兼会社員エンジニアが技術とかリモートワークのこととかをツラツラ書いていきます

pyenvでインストールしたanacondaでenvironmentを作成してactivateするまで

pyenvでanacondaをインストールして、environmentを作成してactivateするまでハマったのでその手順をメモ

問題にぶち当たるまで

pyenvが入っていることを前提としてすすめる。

まずはanacondaのインストール。pyenv install -lして、その時の最新のものを入れておけが良いと思う。

$ pyenv install anaconda3-5.3.1

成功した後、anacondaを使うプロジェクト(ディレクトリ)配下でanacondaを使うように指定する。

$ pyenv local anaconda3-5.3.1
$ pyenv versions
pyenv versions
  system
  3.7.6
  3.7.7
  3.8.2
* anaconda3-5.3.1

つぎに、そのプロジェクトで使用するenvironmentを作成する。

$ conda create -n myenv python=3.7.7

この時condaのバージョンが古いとupdateするように促されるのでいったんCtrl+Cなどで中断してcondaを最新のものにupdateして、再度environmentを作成する。

$ conda update -n base -c defaults conda
$ conda create -n myenv python=3.7.7

そしていざこの作成したenvironmentをactivateしようとすると下記のようなエラーが出る。

conda activate myenv

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.

解決方法1

指示に従ってconda init zshなどとすると.zchconfigに下記のような行が加わる。

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/hogehoge/.pyenv/versions/anaconda3-5.3.1/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/Users/hogehogel/.pyenv/versions/anaconda3-5.3.1/etc/profile.d/conda.sh" ]; then
        . "/Users/hogehoge/.pyenv/versions/anaconda3-5.3.1/etc/profile.d/conda.sh"
    else
        export PATH="/Users/hogehoge/.pyenv/versions/anaconda3-5.3.1/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

これで新しいターミナル(タブ)を起動するとその時点でanacondaのbase environmentがactivateされた状態になる。

実際にやってみる。 上記のような状態で新しいターミナルを立ち上げる(zshを想定)。すると

(base) ➜  ~

のようにbase environmentがactivateされているのがわかる。

またこれはpyenv globalで指定したpythonとは別ものになる。

(base) ➜  ~ python --version
Python 3.7.2
(base) ➜  ~ which python
/Users/hogehoge/.pyenv/versions/anaconda3-5.3.1/bin/python
(base) ➜  ~ pyenv versions
  system
  3.7.6
  3.7.7
* 3.8.2 (set by /Users/hogehoge/.pyenv/version)
  anaconda3-5.3.1
  anaconda3-5.3.1/envs/myenv

anacondaしか使わないという環境なら問題ないかもだが、pyenvを使って素のpythonと共存するとなると競合して面倒なことになりそうでけっこう気持ちわるい。

解決方法2

こちらの方法のほうがスマートだと思う。

色々ググってたらこのようなIssueを見つけた。

Windows error: "conda activate" fails because shell is not initialized · Issue #3371 · conda/conda-build · GitHub

このコメントが参考になる。

上記の.zshconfigに書き込まれる内容をよく見てみるとconda' 'shell.zsh' 'hook'をevalしているのがわかる。なので自分が必要なタイミングでやれば良いということのようだ。

eval "$(conda shell.zsh hook)"
(base) ➜  python --version
Python 3.7.2

元に戻りたい時はconda deactivateでいける。

なお、同Issue内の最初のほうにconda-buildをupdateすればいけるよ的なコメントもあったのでそれも試したが駄目だった。

その他

そもそもpyenv versionsの結果に作成した仮想環境がリストアップされているのでpyenv local anaconda3-5.3.1/envs/myenvで指定すれば使えるのかなと思ったのだが、切り替わったあとにcondaコマンドを打つとコマンドが見つからないと怒られるのでこの使い方は駄目なのかなぁと思った。

環境

  • macOS Catalina 10.15.5
  • pyenv 1.2.18