¿Cómo uso los complementos de Python en Windows?

9

Tengo Windows 7 de 64 bits, con python 2.7.11 y python 3.5.1 (ambos de 32 bits) instalados, y he compilado vim con python / dyn y python3 / dyn, pero sigo recibiendo el siguiente error:

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

Sin embargo, lo siguiente funciona bien:

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

y

:py3 print("hello")

Esta es la información de mi versión 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      

Y where python27.dllsalidasC:\Windows\System32

He intentado los consejos de esta publicación grupal de Google , pero fue en vano.

Solo quiero que YouCompleteMe se ejecute con éxito.

afontaine
fuente
:help python-dynamicdice...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á allá. :!where python27.dllvuelve C:\Windows\System32\python27.dll. También tenga en cuenta que si falta la biblioteca, se produce un error diferente: E370: Could not load library python27.dllyE263: Sorry, this command is disabled, the Python library could not be loaded.
después del
Ahh Veo. :py3funciona pero :pyno? Es posible si uno de los complementos se ejecuta :py3durante el lanzamiento de vim. Vea :he python-2-and-3para explicar cómo funcionan juntos python / dyn y python3 / dyn ..
Alex Kroll
Parece que cambiar 2.7.11 por 2.7.9 hizo el truco. Aunque extraño.
después del

Respuestas:

7

De acuerdo, al parecer, el estado es la siguiente: VIM en Windows soportes pitón 2.7.9, no 2.7.11. Podría funcionar 2.7.10, no lo probé.

Aunque compilé VIM en Windows con una referencia a la 2.7.11DLL, de repente funcionó cuando intenté cambiarlo 2.7.11por2.7.9

No estoy seguro de si hice algo mal 2.7.11, y realmente funciona, pero no tengo tiempo para resolverlo.

afontaine
fuente
3
Por 2.7.11 esto es causado por error pitón, que puede ser trabajado en todo
Cristiano Brabandt
3

Así que tuve un problema muy similar en mi Windows 10 pero para vim y python de 64 bits.

TL; DR

El problema no tiene nada que ver con YouCompleteMe en mi caso. Supongamos que YCM cumple con python 3. Hacer que python27 sea completamente invisible para VIM es lo que me ayuda a resolver el problema.

  1. Instalé el TortoiseHgque tiene un archivo python27.dll y cuyo repositorio se encuentra Path, lo que significa que es visible para vim. Para hacerlo invisible, simplemente elimine el repositorio TortoiseHg de Path(Más generalmente, cualquier programa que no sea de Python que contenga un python27.dll y cuya ruta esté dentro Path. Al hacerlo where python27.dllen la consola de Windows, los encontrará todos).
  2. Otro python27.dll en C:\Windows\System32también es visible para vim. Para hacerlo también invisible, muévalo a C:\Python27. Y eliminar C:\Python27de Path.
  3. Dejar sin %PYTHONPATH%configurar. Asegúrese de que el repositorio Python 3.5 esté en el Path.

Mi sistema

  • Gana 10 pro de 64 bits.
  • Vim 8.0.0045 64 características enormes de 64 bits (+ dyn / python + dyn / python3) descargadas desde el sitio de compilación nocturno de vim windows .
  • YouCompleteMe cumplió con Python 3.5.2 64 bit
  • Python 3.5.2 64 bit
  • Python 2.7.12 64 bit
  • %PYTHONHOME%está configurado en la carpeta de instalación de python 3 e incluido en Path.

Mi problema

Los errores se detectan cuando se inicia vim como se muestra a continuación.

Errores de lanzamiento de Vim

Los mensajes son

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ósticos

Ambos :echo has('python')y :echo has('python3')salida 1. Pero cuando lo hago :py print 'test', vim me da el mismo mensaje de error E887.

Luego desinstalo completamente Python 2.7.12, ¡pero :echo has('python')aún sale el 1 y :py print 'test'aún da el error E887! Mientras tanto :py3 print('test')funciona siempre bien y prueba de salida como se esperaba.

Para garantizar que no sea un problema de YouCompleteMe, inicié vim by gvim -u NONE. La prueba de impresión muestra el mismo mensaje de error. Entonces, el problema es de vim, que no puede hacer el personal relacionado con el módulo de sitio python 2.7.x.

Algunas personas sugieren instalar Python 2.7.9, pero no funciona para mí. Quizás esta solución solo funcione para Python 2.7 de 32 bits. No hice la prueba, así que no puedo confirmar.

Por qué suceden todos estos:

  1. Primero, al hacer where python27.dll, encontré debajo del repositorio TortoiseHG que hay otro archivo python27.dll. Es por eso que :echo has('python')aún muestra 1 después de desinstalar Python 2.7.12.
  2. Luego, para decirlo de manera simple, el comando :has('python')genera 1 si se cumplen ambas condiciones:

    • Vim se compila con la función + dyn / python (respectivamente + dyn / python3 cuando se hace :has('python3'))

    • El archivo python27.dll se encuentra en su ruta. (respectivamente python35.dll. consulte :help-python-dynamicy :help has-pythonpara obtener más información). Pero no realiza más verificaciones ; es por eso que has-pythoncheck da 1 pero aún se detectan errores.

  3. Python 2.7.12 no se configura automáticamente %PYTHONPATH%, mientras que Python 3.5.2 establece este valor en <where_python_found>\Liby <where_python_found>\Lib\site-packagesen el estado de Windows si encuentra que Python es ejecutable Path. En mi caso, donde vim solo encuentra python 3.5.2 instalado y python27.dll de TortoiseHg. Cuando ejecuto :py print 'test', vim buscará el módulo de sitio python 2.7 pero en Python 3.5 %PYTHONPATH%. Es por eso que se arroja el error E887. En consecuencia, si establecemos %PYTHONPATH%explícitamente que apunte a python 2.7, ¡el error E887 DESAPARECERÁ !

Solución

Ver comienzo TL: DR parte.

Conclusión

Una vez tuvo ambas versiones de python y desinstaló una. Puede que felizmente piense que está limpio, pero le digo que encuentra la pitón que ha eliminado, que usted está asombrado y yo también. Esto se debe a que a menudo todavía queda algún dll de python misterioso en su sistema y, desafortunadamente, vim puede detectarlo. Entonces, ya sea que conserve otra versión de python en su disco duro o no, asegúrese de que sea completamente invisible para vim.

El hecho de que ambas versiones de python puedan ser invocadas por la misma instancia vim en tiempo de ejecución está bien. El verdadero problema es que ambas versiones de Python comparten UNO PYTHONPATH . Si PYTHONPATHno coincide con la versión de python, python no puede encontrar el paquete de sitio correcto y hace que vim se queje. Esto hace que la mayoría de nosotros piense que es un problema vim. Pero no.

Chen XI
fuente