先日、以下の記事でLinux上でのpython環境構築にはpyenvが良いと書いたのですが、
pyenvでPython環境を構築する - Palmsonntagmorgen
少し気が変わってきました。
以下、現状の考えをまとめます。
私もPythonにはそこまで詳しくないので、良い方法をご存じの方がおられましたらご教示ください。
目的
Python系の既存ツールを使えるための環境づくり。
既存ツールには2系と3系で書かれたものがあるので、どれでもインストールできるようにするためには、
2系と3系の環境を共存させる必要がある。
(ので、例えば2系のツールしか当面必要ありませんという人ならそもそもpyenvが要りません)
現在のツールの状況
今のところ、NGS周辺の解析ツールは2系で書かれたツールが多数を占めています。
たとえばMACS2は2系でしか動きません。
2系のサポートは2020年までなのでいずれは3系に移行していくのでしょうが、
現時点ではどちらか一つ選ぶとしたら2系にせざるを得ないでしょう。
(開発者のやる気を考えると、現在2系で書かれているツール群の大半は3系に書き直されることはないでしょうし…)
一方、Anacondaを想定したツールも増えてきており(biocondaとか)、これからPythonで開発される解析ツールはAnacondaベースになっていくのではないかと思います。
なので、やるべきはAnaconda2とAnaconda3の共存ということになります。
問題1
pyenvを使う使わないに関わらず、Anacondaをインストールした際にはローカルのpythonより優先させるために 環境変数PATHの上位にanacondaを記載すると思います。 そうすると、以下の記事にもあるように、Anacondaが持っているツールがOSの持っているツールを覆い隠してしまいます。
つまり例えばAnacondaでRがインストールされると、以降はRを起動した時にそちらが呼び出され、ローカルのRは使われなくなってしまいます。
問題2
Anacondaは今のところそれほど安定ではなく、ローカルへのインストールでは起きなかったエラーが起きることがよくあります。
2017/9/13現在、最新のAnaconda2-4.4.0を使ってRをインストールすると、(環境によると思いますが)
install.packagesで以下のようなエラーが出るようです。(Rcppの例)
2017/10/13 追記: 下記エラーはgccのバージョンを4.8にダウングレードすることで解消されました。
** testing if installed package can be loaded Error: package or namespace load failed for ‘Rcpp’ in dyn.load(file, DLLpath = DLLpath, ...): unable to load shared object '~/.pyenv/versions/anaconda2-4.4.0/lib/R/library/Rcpp/libs/Rcpp.so': ~/.pyenv/versions/anaconda2-4.4.0/lib/R/library/Rcpp/libs/Rcpp.so: undefined symbol: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev Error: loading failed Execution halted ERROR: loading failed
Rcppだけならばcondaで対処可能ですが、setup.py install でツールをインストールした場合でも類似の現象が起きる場合があります。
ローカルとAnaconda内のコンパイラ・ライブラリのバージョンの相違に起因するようですが、
ローカルのRならば考えなくて良いエラーの対処に多くの時間を取られてしまうのはかなりのストレスです。
問題3
ならばAnacondaでRをインストールしなければよい、という話なのですが、解析ツールのいくらかはdependenciesにRを持っており、
そのツールをインストールすると自動的にRもインストールされてしまいます。(MAGeCK-VISPRなど)
fastx-toolkitをインストールすると何とperlがインストールされます。
(perlに関してはplenvを使うことで対処可能です)
それらのツールのインストールにはAnacondaを使わないで…と回避することは現状可能ですが、 今後もAnacondaに依存したツールが増えるであろうことを考えると、どうするか検討が必要です。
問題4
共有サーバ上でpyenvを用いて統一環境を構築した場合の問題ですが、
他の一般ユーザはpyenvのlocalや仮想環境で2系と3系を切り替える権限を持たないため、
ある人は3系のツールを使いたい、ある人は2系のツールを使いたい…という風に使い分けるのがかなり困難です。
(本来はユーザごとに自力でpyenvをインストールして環境設定すべきなのですが、それを要求するのは難しいでしょう)
また、pyenvを使ってAnaconda2と3を共存させる限り、~/.pyenv/versions/anaconda*/bin/ にパスを通すことができません。
(どちらか片方だけを使うつもりであるなら通してもよいのですが、そうすると共存とは言えないし…)
さらに、pyenvを利用して2系と3系を共存させ、 かつ3系ではRがインストールされているが2系ではインストールされていないというような場合、 2系を利用している時にRを起動しようとすると「Rがインストールされていません 3系の環境なら利用可能です」とエラーが表示され、 ローカルのRを呼び出してくれません。
そもそも、1カ所で統一できるはずのRを何箇所にもインストールすること自体に違和感があります。
対処
以上のことを考えると、サーバ上でpython共有環境を構築する際には、 今のところ以下の方法が良いのではないかと思っています。
- 生のAnaconda2をインストールし、パスを通す。
- AnacondaではRをインストールせず、ローカルのR (/usr/bin/R)に統一。
- 別にAnaconda3もインストールするが、パスは通さず、必要な時だけ絶対パスで起動。
このようにした場合、pythonでは基本的にAnaconda2が呼び出され、RはローカルのRが呼び出されます。
なおpyenvを使ってAnacondaをインストールし、localや仮想環境を使わない場合でも同様の環境は構築できますが、
生Anacondaの方がどちらを利用しているかはっきりするのが良いかと思いました。
Rに依存しているAnacondaツ―ルがローカルのRを正しく呼び出してくれるのかは未確認です。。
もっとよい方法があれば教えてください。。
雑感
これからはPython3系になっていくので3系のみインストールすれば十分、という記事はよくありますが、 2系で書かれたツールを使わざるを得ないバイオインフォの世界ではそうもいかないのが辛いところです。
自分が利用したいツールが何かによって最適な環境はかなり変わるはずなので、
自分の条件に沿うやり方を探すのがよいと思います。
私はかなり色んなツールを要求されるのでこんなことになっていますが…
Anaconda内のRやらのインストールでエラーが出なければ、特に問題はないんですけどね。。早く安定になって欲しい。