Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

20180312追記

2017-12-20付けでリリースされたconda 4.4.0でconda activateが採用されたようです。
conda/CHANGELOG.md
現状では source activateが廃止されたわけではないようですが、conda activateが推奨されています。

最近dockerがこなれてきた (proxy越しwindows環境でもストレスを感じない)ため、pyenvを挟む必要性が減っており、私もdocker-anacondaに移行していますが、参考まで。

コメントで情報いただきました。
ありがとうございます。

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
source ~/.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派になりました。

y__sama
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away