2013/08/03

python2.7のvirtualenv(wrapper)でpython3環境使った時のjedi-vimで補完が効かなくてハマった話


なんともややこしいタイトルですが、
実際こういうふうに環境組まれている方も多いのではないですかね。

fabricを本格的に使い始めたりして最近になってまたpythonを触り始めたのですが、
新たにpython3環境を作った際にドハマりしまりしてしまったのでメモ。

作った環境はUbuntu13.04 Server上です。
virtualenvwrapperのセットアップとか、vimを+pythonでコンパイルする手順とかは本筋とはズレるんで割愛します。


Python2で入れたvirtualenvwrapperでPython3環境を作る

この時点でも結構はまってしまったのですが、
実はmkvirtualenvのhelpを見れば答えがあって、環境作成の際に'--python' オプションで利用するpythonのフルパスを指定すればOKでした。
という事で以下のように環境を作成して解決。

 
mkvirtualenv --python=`which python3` devel-python3

which python
python -V
 

jedi-vim環境を整える

jedi-vim本体と、virtualenvのパス問題を解決してくれるvim-virtualenvをvimに追加。
NeoBundleを使ってるなら ~/.vimrc にでも以下のように追記。
jedi-vim_devの方を使いたいのでちょっと細工。

 
NeoBundle 'jmcantrell/vim-virtualenv'
NeoBundleLazy 'davidhalter/jedi-vim', {
    \ "rev" : "dev",
    \ "autoload": {
    \    "filetypes": [ "python", "python3" ]},
    \}
 

あとは
 
:NeoBundleInstall
 
すればOK!...と思いきや、
このままではどういうわけかjedi-vimがpipで追加で入れたモジュール絡みの補完をしてくれません。。
※ Mac環境だとgit submodule update --init を叩かないと駄目なケースがあるようですが、Ubuntu環境の場合は特に必要ありませんでした。

バージョン絡みのPYTHONPATHの違いでハマった

vimが +python3 でないのが原因ではないかと疑ったりもして何回かvimのコンパイルしなおしたりとかしたのですが、
最終的に問題は読み込まれているPYTHONPATHにあったことがわかりました。

vimを起動したあとに以下でvimのインタプリタのpythonで認識されているPYTHONPATHを確認
 
:python print sys.path
 

すると以下のような感じになっておりました。
[
'/home/laughk/.virtualenvs/devel-python3/lib/python2.7/site-packages/distribute-0.6.34-py3.3.egg',
'/home/laughk/.virtualenvs/devel-python3/lib/python2.7/site-packages/pip-1.3.1-py3.3.egg',
'/home/laughk/.virtualenvs/devel-python3/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages/distribute-0.6.49-py2.7.egg',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg-info',
'/usr/lib/python2.7/dist-packages',
'_vim_path_'
]

一瞬「あってるじゃん?」
って思ったのですが、virtualenvwrapperで作った環境のpythonは3なので明らかに違うわけです。(全部python2.7\(^o^)/)

原因はわかったのですが、根本解決するとなると結構面倒くさそうだったので
手っ取り早い手として今回はシンボリックリンクで逃げました。

 
cd ~/.virtualenvs/devel-python3/lib
ln -s python3.3 python2.7
 

これでvirtualenvで作成したpython3環境でもjedi-vimの補完も効くようになってめでたしめでたし。



vim自体は "+python -python3" のコンパイルですが今のところは問題ないのかなー、という感じです。
しばらくこれで様子をみてみる事にします。