Como uso plugins Python no Windows?

9

Eu tenho o Windows 7 de 64 bits, com o python 2.7.11 e o python 3.5.1 (ambos de 32 bits) instalados e compilei o vim com python / dyn e python3 / dyn, mas continuo recebendo o seguinte erro:

:py print "hello"
E887: Sorry, this command is disabled, the Python's site module could not be loaded

No entanto, todos os seguintes funcionam bem:

C:\python27\python -c "import site;"

e

:py3 print("hello")

Esta é a minha informação de versão do vim:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan 29 2016 11:58:41)
MS-Windows 32-bit console version
Included patches: 1-1194
Compiled by afontaine@PHOENIX
Huge version without GUI.  Features included (+) or not (-):
+acl                +eval               -mouseshape         +tag_old_static
+arabic             +ex_extra           +multi_byte_ime/dyn -tag_any_white
+autocmd            +extra_search       +multi_lang         -tcl
-balloon_eval       +farsi              -mzscheme           -tgetent
-browse             +file_in_path       -netbeans_intg      -termresponse
++builtin_terms     +find_in_path       +path_extra         +textobjects
+byte_offset        +float              -perl               +title
-channel            +folding            +persistent_undo    -toolbar
+cindent            -footer             -postscript         +user_commands
+clientserver       +gettext/dyn        +printer            +vertsplit
+clipboard          -hangul_input       +profile            +virtualedit
+cmdline_compl      +iconv/dyn          +python/dyn         +visual
+cmdline_hist       +insert_expand      +python3/dyn        +visualextra
+cmdline_info       +jumplist           +quickfix           +viminfo
+comments           +keymap             +reltime            +vreplace
+conceal            +langmap            +rightleft          +wildignore
+cryptv             +libcall            -ruby               +wildmenu
+cscope             +linebreak          +scrollbind         +windows
+cursorbind         +lispindent         +signs              +writebackup
+cursorshape        +listcmds           +smartindent        -xfontset
+dialog_con         +localmap           -sniff              -xim
+diff               -lua                +startuptime        -xterm_save
+digraphs           +menu               +statusline         -xpm_w32
-dnd                +mksession          -sun_workshop       
-ebcdic             +modify_fname       +syntax             
+emacs_tags         +mouse              +tag_binary
Compilation: gcc -Iproto -DWIN32 -DWINVER=0x0500 -D_WIN32_WINNT=0x0500 -DHAVE_PATHDEF -DFEAT_HUGE -DHAVE_GETTEXT -DHAVE_LOCALE_H -DDYNAMIC_GETTEXT -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG -DFEAT_CHANNEL -DFEAT_GUI_W32 -DFEAT_CLIPBOARD -DFEAT_MBYTE -DFEAT_MBYTE_IME -DDYNAMIC_IME -DDYNAMIC_ICONV -pipe -w -march=i386 -Wall -DFEAT_PYTHON  -DDYNAMIC_PYTHON -DDYNAMIC_PYTHON_DLL="python27.dll" -DFEAT_PYTHON3  -DDYNAMIC_PYTHON3 -DDYNAMIC_PYTHON3_DLL="python35.dll" -DFEAT_XPM_W32 -I xpm/x86/include -I xpm/x86/../include -O3 -fomit-frame-pointer -freg-struct-return -s
Linking: gcc -Iproto -DWIN32 -DWINVER=0x0500 -D_WIN32_WINNT=0x0500 -DHAVE_PATHDEF -DFEAT_HUGE -DHAVE_GETTEXT -DHAVE_LOCALE_H -DDYNAMIC_GETTEXT -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG -DFEAT_CHANNEL -DFEAT_GUI_W32 -DFEAT_CLIPBOARD -DFEAT_MBYTE -DFEAT_MBYTE_IME -DDYNAMIC_IME -DDYNAMIC_ICONV -pipe -w -march=i386 -Wall -DFEAT_PYTHON  -DDYNAMIC_PYTHON -DDYNAMIC_PYTHON_DLL="python27.dll" -DFEAT_PYTHON3  -DDYNAMIC_PYTHON3 -DDYNAMIC_PYTHON3_DLL="python35.dll" -DFEAT_XPM_W32 -I xpm/x86/include -I xpm/x86/../include -O3 -fomit-frame-pointer -freg-struct-return -s -mwindows -o gvim.exe -lkernel32 -luser32 -lgdi32 -ladvapi32 -lcomdlg32 -lcomctl32 -lversion -lwsock32 -Lxpm/x86/lib -lXpm -lole32 -luuid      

E where python27.dllsaídasC:\Windows\System32

Eu tentei o conselho deste post do grupo do Google , mas sem sucesso.

Eu só quero que o YouCompleteMe seja executado com êxito.

afontaine
fonte
:help python-dynamicdiz...To use the Python interface the Python DLL must be in your search path. In a console window type "path" to see what directories are used.
Alex Kroll
Está lá. :!where python27.dllretorna C:\Windows\System32\python27.dll. Observe também que, se a biblioteca estiver ausente, ocorrerá um erro diferente: E370: Could not load library python27.dlleE263: Sorry, this command is disabled, the Python library could not be loaded.
afontaine
Ahh Eu vejo. :py3funciona mas :pynão vai? É possível se um dos plugins for executado :py3durante o lançamento do vim. Veja :he python-2-and-3para explicar como python / dyn e python3 / dyn trabalha em conjunto ..
Alex Kroll
Parece que trocar o 2.7.11 pelo 2.7.9 fez o truque. Estranho embora.
afontaine

Respostas:

7

Tudo bem, aparentemente o estado é este: o VIM no Windows suporta python 2.7.9, não 2.7.11. Pode funcionar 2.7.10, eu não testei.

Embora eu tenha compilado o VIM no Windows com uma referência à 2.7.11DLL, ele de repente funcionou quando tentei trocar 2.7.11por2.7.9

Não tenho certeza se fiz algo errado 2.7.11, e realmente funciona, mas não tenho tempo para descobrir.

afontaine
fonte
3
Para 2.7.11 isso é causado pelo bug python, que pode ser contornado
Christian Brabandt
3

Então, eu tive um problema muito semelhante no meu Windows 10, mas no vim e python de 64 bits.

TL; DR

O problema não tem nada a ver com YouCompleteMe no meu caso. Suponha que o YCM esteja em conformidade com o python 3. Tornar o python27 completamente invisível para o VIM é o que me ajuda a resolver o problema.

  1. Eu tinha instalado TortoiseHgum arquivo python27.dll e cujo repositório está Path, o que significa que ele é visível no vim. Para torná-lo invisível, basta remover o repositório TortoiseHg de Path(geralmente, qualquer programa não-python que contém um python27.dll e cujo caminho está localizado Path. Ao fazê-lo where python27.dllno console do Windows, você encontra todos eles).
  2. Outro python27.dll C:\Windows\System32também é visível no vim. Para torná-lo invisível, mova-o para C:\Python27. E remover C:\Python27de Path.
  3. Deixe por %PYTHONPATH%definir. Verifique se o repositório Python 3.5 está no diretório Path.

Meu sistema

  • Ganhe 10 pro de 64 bits.
  • Vim 8.0.0045 Recursos enormes de 64 bits (+ dyn / python + dyn / python3) baixados do site de construção noturno do Windows vim .
  • YouCompleteMe cumpriu com o python 3.5.2 de 64 bits
  • Python 3.5.2 64 bits
  • Python 2.7.12 de 64 bits
  • %PYTHONHOME%está definido para a pasta de instalação do python 3 e incluído no Path.

Meu problema

Os erros são detectados quando o vim é iniciado, como mostrado abaixo.

Erros de inicialização do Vim

As mensagens são

Error detected while processing function youcompleteme#Enable[5]..<SNR>124_SetUpPython:
line 39:
E887: Sorry, this command is disabled, the Python's site module could not be loaded.

Diagnóstico

Ambos :echo has('python')e :echo has('python3')saída 1. Mas quando eu faço :py print 'test', o vim me dá a mesma mensagem de erro E887.

Então eu desinstalo completamente o Python 2.7.12, mas :echo has('python')ainda gera 1 e :py print 'test'ainda dá o erro E887! Enquanto isso, :py3 print('test')funciona sempre bem e teste de saída conforme o esperado.

Para garantir que não seja um problema do YouCompleteMe, iniciei o vim by gvim -u NONE. O teste de impressão fornece a mesma mensagem de erro. Portanto, o problema é do próprio vim, que falha ao executar a equipe relacionada ao módulo do site python 2.7.x.

Algumas pessoas sugerem a instalação do Python 2.7.9, mas isso não funciona para mim. Talvez essa solução funcione apenas para o python de 32 bits 2.7. Eu não testei, então não posso confirmar.

Por que tudo isso acontece:

  1. Primeiro, where python27.dllencontrei no repositório TortoiseHG outro arquivo python27.dll. É por isso que :echo has('python')ainda gera 1 depois de desinstalar o Python 2.7.12.
  2. Então, para simplificar, o comando :has('python')emitirá 1 se as duas condições forem atendidas:

    • O Vim é compilado com o recurso + dyn / python (respectivamente + dyn / python3 ao fazê-lo :has('python3'))

    • O arquivo python27.dll é encontrado no seu caminho. (respectivamente python35.dll. consulte :help-python-dynamice :help has-pythonpara obter mais informações.) Mas isso não faz uma verificação adicional ; é por isso que a has-pythonverificação dá 1, mas ainda erros são detectados.

  3. O Python 2.7.12 não é definido automaticamente %PYTHONPATH%, enquanto o Python 3.5.2 define esse valor para <where_python_found>\Libe <where_python_found>\Lib\site-packagesna inicialização do Windows, se encontrar o executável em Path. No meu caso, onde apenas o python 3.5.2 instalado e o python27.dll do TortoiseHg são encontrados pelo vim, quando eu corro :py print 'test', o vim procura o módulo do site python 2.7, mas no Python 3.5 %PYTHONPATH%. É por isso que o erro E887 é lançado. Conseqüentemente, se %PYTHONPATH%definirmos explicitamente para apontar para python 2.7, o erro E887 será DESAPARECIDO !

Solução

Veja a parte TL: DR inicial.

Conclusão

Você já teve a versão do python e desinstalou uma. Você pode felizmente achar que está limpo, mas o vim diz que ele encontra o python que você excluiu, você está surpreso e eu também. Isso ocorre porque muitas vezes ainda existem algumas dll python misteriosas no sistema e, infelizmente, podem ser detectadas pelo vim. Portanto, se você preserva outra versão do python no disco rígido ou não, verifique se ele é completamente invisível para o vim.

O fato de que ambas as versões do python podem ser invocadas pela mesma instância vim em tempo de execução está correto. O verdadeiro problema é a versão do python compartilha UM PYTHONPATH . Se PYTHONPATHnão corresponder à versão python, o python falhará ao encontrar o pacote do site correto e fará com que o vim se queixe. Isso faz com que a maioria de nós pense que é um problema de vim. Mas não.

Chen XI
fonte