pyenvとanacondaを共存させる時のactivate衝突問題の回避策3種類

  • 181
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

python環境構築決定版の補足です。

pyenvとanacondaのactivate衝突問題とは?

linuxやMacではpyenvを介してanacondaをインストールできます。
更に、anacondaで複数開発環境の切り替えをしたいケースがあると思います。
anacondaでの環境は、source activate <環境名>として切り替えを行えますが、pyenvの下では下記のようなエラーが出てシェルごと落ちます。

$ source activate
#>>> pyenv: -bash: command not found

理由はよくわかりませんが、pyenvがshimスクリプトを使ってpathをのっとっているので、変な事が起こっているのかもしれません。

anacondaがconda activateを採用してくれていれば... orz

解決策

1. pyenvを使わない。

決定版は基本的にこの方法を紹介しています。
この方法ではpyenvはanacondaのインストーラとしてのみ使います。
pyenv経由でanacondaをインストール後に、pathへanacondaのインストールpathを書き込んで、pyenvを無視させます。

$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc
  • メリット: 一番設定が少なく、覚えることが少ない。
  • デメリット: pyenv localが使えない。

この方法では、pathを設定した後はpyenvを全く意識することがなくなります。

環境切り替えは全部source activateを用います。

2. activateをフルパスで実行する。

1.ではpyenv localが使えなくなりますが、これが致命的な人もいると思います。
特にweb開発系の人で、PJ毎にパッケージの依存関係を変えたい人などは、pyenv localで作業フォルダ毎に環境を切り替えた方が効率的だと思います。
単純な解決策ですが、activateをフルパスで指定すれば、condaのactivateを指定して実行できます。

$ source $PYENV_ROOT/versions/anaconda3-2.5.0/bin/activate <環境名>
  • メリット: シンプル
  • デメリット1: activateするのにタイプ量が多い

デメリットはaliasを設定すれば解決しますね。

$ echo 'alias activate="source $PYENV_ROOT/versions/anaconda3-2.5.0/bin/activate"' >> ~/.bashrc
$ source ~/.bashrc

あれ?これでよくね??

pyenv localを使えば作業フォルダごとに環境を切り替えられます。

$ conda create -n py2 python=2.7
$ mkdir py2
$ cd py2
$ pyenv local anaconda3-2.5.0/envs/py2
$ python
#>>>Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec  6 2015, 18:08:32)
#>>>[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2

環境切り替えはactivatepyenv localを併用します。

3. pyenv-virtualenvを入れる

決定版の追記で記載した方法です。
pyenvのプラグインであるpyenv-virtualenvを入れて、pyenv activateを使います。

インストール

$ git clone git://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
souce ~/.bashrc

pyenv-virtualenvの簡単な使い方

$ conda create -n py2 python=2.7
$ mkdir py2
$ cd py2
$ pyenv activate anaconda3-2.5.0/envs/py2
$ python
#>>>Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec  6 2015, 18:08:32)
#>>>[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2

$ pyenv deactivate

source activateを間違えて使うと、やっぱりシェルが落ちるので注意。

メリット: 多分正しい使い方。
デメリット: このためだけにpyenv-virtualenvを入れるのも...

環境切り替えはpyenv activatepyenv localを併用します。

メモ

いずれの方法も仮想環境管理はcondaを用います。(virtualenvは使わない。)
1-3のどれを選ぶかは好みだと思います。私は、今まで1派でしたが最近2派になりました。