レバテックフリーランスのサイトに当サイトが紹介されました!

Vim8.0にしてPython環境の問題を対処してみる

Vimがやく10年ぶり?にメジャーバージョンアップされました。

Vim8の新機能は:h version8.0 で見れますが
とりあえず、利用者としては非同期処理の対応が大きいですかね?
各種プラグインなどのコマンド待ち等のストレスが減っていくのを期待です。

で、Win版インストールは手っ取り早くKaoriyaさんコンパイル版バイナリを利用。
これはDLして解凍して配置して終わり。
.vimrc, pluginもそのまま使えるし、ラックラクです。

で、問題はここから。

基本的な挙動は問題ないものの、Pythonモジュールを使うときにエラーがでるようになりました。
それが単純に解決、ってわけにはいかなかったんで備忘録。

対処1:Pythonのバージョンを揃える

以前も経験ありました。Vimで参照してるPythonのlibのバージョンと、環境にインストールしてあるバージョンがずれている場合、エラーがでます。

:version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Oct 16 2016 13:13:05)
MS-Windows 64 ビット GUI 版
適用済パッチ: 1-39
Modified by koron.kaoriya@gmail.com
Compiled by koron.kaoriya@gmail.com
Huge 版 with GUI.  機能の一覧 有効(+)/無効(-)
+acl                +cmdline_info       +emacs_tags         +iconv/dyn          +lua/dyn            +packages           +scrollbind         -termresponse       +wildmenu
+arabic             +comments           +eval               +insert_expand      +menu               +path_extra         +signs              +textobjects        +windows
+autocmd            +conceal            +ex_extra           +job                +migemo/dyn         +perl/dyn           +smartindent        +timers             +writebackup
+balloon_eval       +cryptv             +extra_search       +jumplist           +mksession          +persistent_undo    +startuptime        +title              -xfontset
+browse             +cscope             +farsi              +kaoriya            +modify_fname       -postscript         +statusline         +toolbar            -xim
++builtin_terms     +cursorbind         +file_in_path       +keymap             +mouse              +printer            -sun_workshop       +user_commands      +xpm_w32
+byte_offset        +cursorshape        +find_in_path       +lambda             +mouseshape         +profile            +syntax             +vertsplit          -xterm_save
+channel            +dialog_con_gui     +float              +langmap            +multi_byte_ime/dyn +python/dyn         +tag_binary         +virtualedit        
+cindent            +diff               +folding            +libcall            +multi_lang         +python3/dyn        +tag_old_static     +visual             
+clientserver       +digraphs           -footer             +linebreak          -mzscheme           +quickfix           -tag_any_white      +visualextra        
+clipboard          +directx            +gettext/dyn        +lispindent         +netbeans_intg      +reltime            -tcl                +viminfo            
+cmdline_compl      -dnd                +guess_encode       +listcmds           +num64              +rightleft          -termguicolors      +vreplace           
+cmdline_hist       -ebcdic             -hangul_input       +localmap           -ole                +ruby/dyn           -tgetent            +wildignore         
      システム vimrc: "$VIM\vimrc"
      ユーザー vimrc: "$HOME\_vimrc"
   第2ユーザー vimrc: "$HOME\vimfiles\vimrc"
   第3ユーザー vimrc: "$VIM\_vimrc"
       ユーザー exrc: "$HOME\_exrc"
    第2ユーザー exrc: "$VIM\_exrc"
     システム gvimrc: "$VIM\gvimrc"
     ユーザー gvimrc: "$HOME\_gvimrc"
  第2ユーザー gvimrc: "$HOME\vimfiles\gvimrc"
  第3ユーザー gvimrc: "$VIM\_gvimrc"
  デフォルトファイル: "$VIMRUNTIME\defaults.vim"
    システムメニュー: "$VIMRUNTIME\menu.vim"
コンパイル: cl -c /W3 /nologo  -I. -Iproto -DHAVE_PATHDEF -DWIN32  -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG -DFEAT_JOB_CHANNEL   -DFEAT_XPM_W32  /DMODIFIED_BY=\"koron.kaoriya@gmail.com\" /DDYNAMIC_MSVCRT_DLL=\"msvcr100.dll\" /DGETTEXT_DLL=\"intl.dll\" /DGETTEXT_DLL_ALT=\"intl.dll\" /D_BIND_TO_CURRENT_VCLIBS_VERSION=1 -DWINVER=0x0501 -D_WIN32_WINNT=0x0501 /Fo.\ObjGXULYHRAMD64/ -DHAVE_STDINT_H /Ox /GL -DNDEBUG /MD -DFEAT_MBYTE_IME -DDYNAMIC_IME -DFEAT_GUI_W32 -DFEAT_DIRECTX -DDYNAMIC_DIRECTX -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DDYNAMIC_MIGEMO -DFEAT_LUA -DDYNAMIC_LUA -DDYNAMIC_LUA_DLL=\"lua51.dll\" -DFEAT_PYTHON -DDYNAMIC_PYTHON -DDYNAMIC_PYTHON_DLL=\"python27.dll\" -DFEAT_PYTHON3 -DDYNAMIC_PYTHON3 -DDYNAMIC_PYTHON3_DLL=\"python35.dll\" -DFEAT_PERL -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DDYNAMIC_PERL -DDYNAMIC_PERL_DLL=\"perl524.dll\" -DFEAT_RUBY -DDYNAMIC_RUBY -DDYNAMIC_RUBY_VER=23 -DDYNAMIC_RUBY_DLL=\"x64-msvcrt-ruby230.dll\" -DFEAT_HUGE /Fd.\ObjGXULYHRAMD64/ /Zi
リンク: link /RELEASE /nologo /subsystem:windows /LTCG:STATUS oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib  comdlg32.lib ole32.lib uuid.lib /machine:AMD64 gdi32.lib version.lib   winspool.lib comctl32.lib advapi32.lib shell32.lib  /machine:AMD64 /nodefaultlib msvcrt.lib  user32.lib  /nodefaultlib:lua51.lib   /nodefaultlib:python27.lib /nodefaultlib:python35.lib    WSock32.lib ..\..\build\msvc\target\install-x64\lib\libXpm.lib /PDB:gvim.pdb -debug

で確認したpythonのlibのバージョンはpython35.dllとpython27.dll。
リンク設定の/nodefaultlibはリンクしないってゆう設定なのでstaticlibはリンクされてないってことだと思います。基本はdll参照のみ。

というわけで、python35.dllとpython27.dllがほしいってこと。
で、自分の環境はPython34とPython27だったので、はい、バージョン違い。

というわけで、Python35へアップデートします。(2016/11/23時点で3.5.2)

ここでトラップ①。

python.orgで威風堂々と3.5.2のDownloadボタンが待ち構えてますが、こちら32ビット版。
64bit環境、64bit版Vimをいれてる場合は、ちゃんと64bit版Pythonを探して入れましょう。

そしてトラップ②。

インストーラ上でちゃんとインストール先のパスを設定しましょう。
Vimのインストールと同じノリでインストール後の展開フォルダを切り取ってC:\直下に移動して進めてみたら

:python3 print(1)

するだけでVimが落ちました。
インストーラでパス指定してカスタムインストールし直したら解決。

対処2:Python2.7は2.7.11以外を使う

これでバージョンがそろったし問題ない?と思いきやまだエラーがでる。
Pythonのsiteモジュールが見つかりません 的なエラーだった。

これは、Python2系を使うプラグイン使用時のみの問題。すなわちPython2系の問題。
KaoriyaVimはpython2,python3両方が使えるようになっている。

で、調べてみると、2.7.11には何やら問題があるらしい。

KaoriyaバイナリのREADME

に書いてある↓

Python 2.7.11 を利用する場合には、Python 2.7.11のバグを回避するために、管理者として・・・

自分の環境も2.7.11。というわけで2.7.12にアップグレード。
で問題なくプラグインも動くようになりました。
他の記事でもいくつか2.7.11はダメだから2.7.9に戻せ、なんてのもありました。

ちなみに問題が出たプラグインはvimrepress.vimでした。

対処3:shellをcmd.exeに戻す

基本Python周りも動くようにはなった。

が、今度はjedi-vim.vimプラグインをロードしたときにWarningがでる。

jedi-vim failed to get Python version from sys.version_info:…..
と色々長い文言が表示されて最後に
Falling back to version 2.

なにやらPythonのバージョン情報取得に失敗してて、結果python2を使うようにしたよ、
ってゆうWarningらしい。

なんで失敗すんねん、ということで、sys.version_infoを使ってるところを、
jedi-vimの中でgrepすると、こんなコードが

if has('nvim') || (has('python') && has('python3'))
    " Neovim usually has both python providers. Skipping the `has` check
    " avoids starting both of them.

    " Get default python version from interpreter in $PATH.
    let s:def_py = system('python -c '.shellescape('import sys; sys.stdout.write(str(sys.version_info[0]))'))
    if v:shell_error != 0 || !len(s:def_py)
        if !exists("g:jedi#squelch_py_warning")
            echohl WarningMsg
            echom "Warning: jedi-vim failed to get Python version from sys.version_info: " . s:def_py
            echom "Falling back to version 2."
            echohl None
        endif
        let s:def_py = 2
    elseif &verbose
        echom "jedi-vim: auto-detected Python: ".s:def_py
    endif

pythonというかshellescape()がやっちまってるっぽい。

・・・身に覚えが。この記事でshell周り変えた!!

早くも影響がでた。
shell設定を戻すとちゃんとうごきます。

ここで一考、この挙動にあわせてshell設定周りをいじることもできるかもしれないが・・

これはダメな流れだ!今後も都度都度影響がでるドツボにはまる。

ということで、shell設定はやっぱりもとに戻すことにしました。

あっち側の記事に追記しますが、ptはcmd.exeでもダブルクォートいれれば基本的には問題ないので。

これでやっとpython周りのエラーはすっきり消えました。
よいVim&Pythonライフを。

コメント

タイトルとURLをコピーしました