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

MacVim-KaoriYaでpyenvのPythonを使う

More than 3 years have passed since last update.

基本的にはvim-pyenvを使えば、pyenvのsys.pathが追加される。
追加されるので、例えばjedi-vimの補完でpyenv以下のライブラリが補完されるようになる。

vim-pyenvの仕組み

sys.pathが追加される仕組みは、pyenv_vim.pyのこの部分

# execute the external python and get the sys.path value
args = [python_exec, '-c', 'import sys; print("\\n".join(sys.path))']

で、if_pythのpythonではなく、外部コマンドでpyenvのpythonを呼ぶことで、pyenvのsys.pathを取得して、それをsys.pathの先頭に追加している。

たとえば、pyenvで

$ pyenv global
3.6.0

を設定していて、適応前に

:py3 import pprint
:py3 pprint.pprint(sys.path)
['/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages',
 '_vim_path_']

な状態で、ここからPythonのファイルを開いて、vim-pyenvが適応されると

:py3 pprint.pprint(sys.path)
['/Users/tmsanrinsha/.cache/vim/dein/repos/github.com/davidhalter/jedi-vim',
 '',
 '/Users/tmsanrinsha/.pyenv/versions/3.6.0/lib/python36.zip',
 '/Users/tmsanrinsha/.pyenv/versions/3.6.0/lib/python3.6',
 '/Users/tmsanrinsha/.pyenv/versions/3.6.0/lib/python3.6/lib-dynload',
 '/Users/tmsanrinsha/.pyenv/versions/3.6.0/lib/python3.6/site-packages',
 '/Users/tmsanrinsha/.cache/vim/dein/repos/github.com/lambdalisue/vim-pyenv',
 '/Users/tmsanrinsha/.cache/vim/dein/repos/github.com/davidhalter/jedi-vim',
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages',
 '_vim_path_']

のようにpyenvのsys.pathが追加される(それとは別に、pythonで使うVim pluginのsys.pathも追加されている)
追加 なので、systemでインストールされたライブラリも補完候補として出る。消してくれたほうがいいかも。

pathが追加されるだけで、Vimが使う内部のPythonが変更されることはない。

:py3 print(sys.version)
3.6.0 (default, Dec 24 2016, 08:01:42)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

補完する上で問題はなさそう。

MacVim-KaoriYa使用時の注意点

MacVim-KaoriYaではPython2とPython3を同時に使うことはできない。例えば、:py print('hello')した後に:py3 print('hello')すると

:py3 print('hello')
E837: このVimでは :python を使った後に :py3 を使えません
E263: このコマンドは無効です,ごめんなさい: Pythonライブラリをロードできませんでした.

となる。もし、

vim-pyenv: Failed to activate "3.6.0". Python version of the env is not supported in this Vim.

のようなエラーが出る場合は、どこかですでにPython2が呼ばれている可能性がある。また:pyを使わなくてもhas('python')が使われるとPython2がロードされたことになる。
これについては:help has-pythonに書いてある。

Note: Python の 2 と 3 の両方が利用可能で、Python が動的ロードされるようになっ
ている場合、この has() 呼び出しによってそれらがロードされます。もし、同時に
ロードできるのがどちらか一方だけだった場合、Python の 2 と 3 のどちらが利用で
きるか調べるだけで、もう一方は利用できなくなります。

よって、Python3を必ず使いたい場合は、vimrcの最初の方で

if has('python3')
endif

を書いて、先に呼び出しておく。

Python2とPython3の両方使いたい場合はKaoriYa付きでないMacVimをMacVim with Python 2.x and Python 3.xに従ってインストールすると良い。

使いたいPythonのバージョンがビルド時に指定したPythonのバージョンと違う場合

たとえば、pyenvのanaconda3-4.2.0のPythonのバージョンは

$ pyenv global
anaconda3-4.2.0
$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)

3.5.2だが、これはビルド時に指定したPythonのバージョンと違う。

:py3 print(sys.version)
3.6.0 (default, Dec 24 2016, 08:01:42)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

この状態で、

import numpy as np
np.

と打つと、np.でjediで補完が効くときに落ちる。set pythonthreedllを使い、anaconda3-4.2.0のdllに変更

set pythonthreedll=$HOME/.pyenv/versions/anaconda3-4.2.0/lib/libpython3.5m.dylib

しても、:py3を使った時点で落ちる。このようにビルド時に指定したPythonと違うバージョンのPythonを使おうとすると落ちるので、ビルドし直す必要がある。

MacVim-KaoriYaの設定を変更してビルドする

anaconda3-4.2.0のPythonのバージョンが3.5.2なので、3.5系のPythonが使えるVimをビルドすることを例にする。

MacVim with Python 2.x and Python 3.xをみると、pyenvで--enable-sharedをしてインストールする必要があるらしいが、anaconda3-4.2.0ではそのオプションが効かないっぽいので、同じバージョンのPythonがインストールされる3.5.2をインストールすることにする。

$ PYTHON_CONFIGURE_OPTS="--enable-shared" \
    LDSHARED="clang -bundle" \
    LDCXXSHARED="clang++ -bundle" \
    BLDSHARED="clang -bundle -lpython3.5m" \
    pyenv install 3.5.2

MacVim-KaoriYaのビルドの仕方はBuilding · splhack/macvim-kaoriya Wikiに書いてあるので、ここを参考にする。

$ brew tap splhack/splhack
$ brew edit macvim-kaoriya

するとMacvim-kaoriya.rbがEditorで開かれるので、vi_cv_path_python3とvi_cv_dll_name_python3を3.5.2のものに変更する。

    ENV.append 'vi_cv_path_python3', "/Users/tmsanrinsha/.pyenv/versions/3.5.2/bin/python"
    ENV.append 'vi_cv_dll_name_python3', "/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/libpython3.5m.dylib"

その後、以下を実行してインストールする。

$ brew tap universal-ctags/universal-ctags
$ brew install --HEAD universal-ctags
$ brew link universal-ctags
$ brew install --HEAD cmigemo-mk
$ brew uninstall macvim-kaoriya # すでにインストールしているとき
$ brew install --HEAD macvim-kaoriya
$ rm -r /Applications/MacVim.app # すでにあるとき
$ brew linkapps # /Applications/MacVim.appからsymlinkを貼る

Vimを立ち上げて確認。

:py3 import pprint
:py3 pprint.pprint(sys.path)
['/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python35.zip',
 '/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python3.5',
 '/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python3.5/plat-darwin',
 '/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python3.5/lib-dynload',
 '/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python3.5/site-packages',
 '_vim_path_']
:py3 print(sys.version)
3.5.2 (default, Jan 28 2017, 13:29:58)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

これでpyenvの3.5.2でもanaconda3-4.2.0でも使えるようになった。

vim-pyenvを使わない

頻繁にpyenvで変更しないのであれば、vim-pyenvを使わずに、vimrcに$PYTHONHOMEを設定してやるだけでもよい。

let $PYTHONHOME='/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0'

これで、anaconda3-4.2.0の方を見るようになる。

:py3 import pprint; pprint.pprint(sys.path)
['/Users/tmsanrinsha/.cache/vim/dein/repos/github.com/davidhalter/jedi-vim',
 '/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python35.zip',
 '/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5',
 '/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/plat-darwin',
 '/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/lib-dynload',
 '/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages',
 '/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/Sphinx-1.4.6-py3.5.egg',
 '/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/aeosa',
 '/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/setuptools-27.2.0-py3.5.egg',
 '_vim_path_']

$PYTHONHOMEはPythonをロードするときに一度だけ参照されるようなので、ロード後に変更してもsys.pathは変わらない。

Python2とPython3両方使える環境のときは、Building · splhack/macvim-kaoriya Wikiに書いてあるようにvimrcに

.vimrc
let $PYTHONHOME=$HOME."/.pyenv/versions/2.7.11"
set pythondll=$HOME/.pyenv/versions/2.7.11/lib/libpython2.7.dylib
py import sys
let $PYTHONHOME=$HOME."/.pyenv/versions/3.5.1"
set pythonthreedll=$HOME/.pyenv/versions/3.5.1/lib/libpython3.5m.dylib
py3 import sys

のように書く。但し、これだと最終的な$PYTHONHOMEの値がPython3用になるので、ここからquickrunで外部のPython2を呼び出そうとすると、失敗する。

vim-pyenvに任せるのが無難かなぁ。

まとめ

  • vim-pyenvを使うとpyenvで使っているsys.pathを追加することができる
    • ただし、systemのsys.pathが残るので、systemで使っているライブラリも補完対象になる
    • if_pythで使われるPythonは変更されない(ただし、問題はなさそう)
  • MacVim-KaoriYaではPython2とPython3を同時に使うことはできない
    • 使いたい方をvimrcの先頭でロードしておいたほうがよい
    • KaoriYa付きでないMacVimなら同時に使える
  • build時のPythonとバージョンが違うPythonは扱うことが出来ないので、再buildする
tmsanrinsha
https://github.com/tmsanrinsha
https://tmsanrinsha.net
yahoo-japan-corp
Yahoo! JAPAN を運営しています。
https://www.yahoo.co.jp
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした