Come uso i plugin Python su Windows?


9

Ho Windows 7 a 64 bit, con python 2.7.11 e python 3.5.1 (entrambi a 32 bit) installati e ho compilato vim con python / dyn e python3 / dyn, ma continuo a ricevere il seguente errore:

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

Tuttavia, tutto quanto segue funziona bene:

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

e

:py3 print("hello")

Queste sono le informazioni sulla mia versione di 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.dllusciteC:\Windows\System32

Ho provato i consigli di questo post di gruppo di Google , ma senza risultati.

Voglio solo far funzionare YouCompleteMe con successo.


: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,

È lì. :!where python27.dllritorna C:\Windows\System32\python27.dll. Inoltre, se manca la libreria, si verifica un errore diverso: E370: Could not load library python27.dlleE263: Sorry, this command is disabled, the Python library could not be loaded.
afontaine,

Ahh. Vedo. :py3funziona ma :pynon lo farà? È possibile se uno dei plugin viene eseguito :py3durante l'avvio di vim. Vedi :he python-2-and-3per spiegare come python / dyn e python3 / dyn lavorano insieme ..
Alex Kroll,

Sembra che lo scambio di 2.7.11 con 2.7.9 abbia fatto il trucco. Strano però.
afontaine,

Risposte:


7

Va bene, apparentemente lo stato è questo: VIM su Windows supporta Python 2.7.9, no 2.7.11. Potrebbe funzionare 2.7.10, non l'ho provato.

Anche se ho compilato VIM su Windows con un riferimento alla 2.7.11DLL, improvvisamente ha funzionato quando ho provato sostituendo 2.7.11per2.7.9

Non sono sicuro di aver fatto qualcosa di sbagliato 2.7.11e in realtà funziona, ma non ho il tempo di capirlo.


3
Per 2.7.11 questo è causato da python bug, che può essere aggirato
Christian Brabandt

3

Quindi ho avuto un problema molto simile sul mio Windows 10 ma per 64 bit vim e python.

TL; DR

Il mio problema non ha nulla a che fare con YouCompleteMe. Supponiamo che YCM sia rispettato con Python 3. Rendere Python27 completamente invisibile a VIM è ciò che mi aiuta a risolvere il problema.

  1. Avevo installato TortoiseHgche ha un file python27.dll e il cui repository è in Path, il che significa che è visibile a VIM. Per renderlo invisibile, è sufficiente rimuovere il repository TortoiseHg da Path(Più in generale, qualsiasi programma non python che contiene un python27.dll e il cui percorso è all'interno Path. Facendo where python27.dllnella console di Windows, li trovi tutti.)
  2. Un altro python27.dll in C:\Windows\System32è anche visibile su vim. Per renderlo anche invisibile, spostalo su C:\Python27. E rimuovi C:\Python27da Path.
  3. Lascia %PYTHONPATH%disinserito. Assicurati che il repository Python 3.5 sia nel file Path.

Il mio sistema

  • Vinci 10 pro a 64 bit.
  • Vim 8.0.0045 Funzionalità enormi a 64 bit (+ dyn / python + dyn / python3) scaricate dal sito di creazione di windows notturno di vim .
  • YouCompleteMe ha rispettato Python 3.5.2 a 64 bit
  • Python 3.5.2 64 bit
  • Python 2.7.12 64 bit
  • %PYTHONHOME%è impostato sulla cartella di installazione di Python 3 ed è incluso in Path.

Il mio problema

Gli errori vengono rilevati all'avvio di vim come mostrato di seguito.

Vim errori di avvio

I messaggi sono

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.

Diagnostica

Entrambi :echo has('python')e :echo has('python3')output 1. Ma quando lo faccio :py print 'test', vim mi dà lo stesso messaggio di errore E887.

Quindi ho disinstallato completamente Python 2.7.12, ma ho :echo has('python')ancora l'output 1 e :py print 'test'ho ancora l'errore E887! Nel frattempo :py3 print('test')funziona sempre bene e prova l' output come previsto.

Per garantire che non sia un problema da YouCompleteMe, ho lanciato vim di gvim -u NONE. Il test di stampa fornisce lo stesso messaggio di errore. Quindi il problema proviene dallo stesso vim, che non riesce a fare lo staff relativo al modulo del sito python 2.7.x.

Alcune persone suggeriscono di installare Python 2.7.9, ma non funziona per me. Forse questa soluzione funziona solo con Python 2.7 a 32 bit. Non ho testato, quindi non posso confermare.

Perché tutto ciò accade:

  1. Innanzitutto, where python27.dlltrovando nel repository TortoiseHG c'è un altro file python27.dll. Questo è il motivo per cui :echo has('python')ancora output 1 dopo aver disinstallato Python 2.7.12.
  2. Quindi, per dirla in parole povere, il comando :has('python')emette 1 se entrambe le condizioni sono soddisfatte:

    • Vim è compilato con la funzione + dyn / python (rispettivamente + dyn / python3 quando lo fa :has('python3'))

    • Il file python27.dll si trova nel percorso. (rispettivamente python35.dll. vedi :help-python-dynamice :help has-pythonper maggiori informazioni.) Ma non controlla ulteriormente ; questo è il motivo per cui has-pythoncheck dà 1 ma vengono comunque rilevati errori.

  3. Python 2.7.12 non viene impostato automaticamente %PYTHONPATH%, mentre Python 3.5.2 imposta questo valore su <where_python_found>\Libe <where_python_found>\Lib\site-packagesall'avvio di Windows se trova eseguibile python in Path. Nel mio caso in cui è installato solo python 3.5.2 e python27.dll di TortoiseHg viene trovato da vim, quando eseguo :py print 'test', vim cercherà il modulo del sito python 2.7 ma in Python 3.5 %PYTHONPATH%. Ecco perché viene generato l'errore E887. Di conseguenza, se poniamo %PYTHONPATH%esplicitamente al punto a Python 2.7, l'errore E887 sarà SCOMPARIRE !

Soluzione

Vedere TL iniziale: parte DR.

Conclusione

Una volta avevi entrambe le versioni di Python e ne disinstallavi una. Potresti pensare felicemente che sia pulito, ma Vim ti dice che trova il pitone che hai cancellato, sei stupito e anche io. Questo perché spesso c'è ancora qualche misteriosa DLL di Python nel tuo sistema e purtroppo può essere rilevata da VIM. Quindi, indipendentemente dal fatto che tu conservi un'altra versione di Python sul tuo disco rigido o meno, assicurati che sia completamente invisibile su VIM.

Il fatto che entrambe le versioni di Python possano essere invocate dalla stessa istanza vim in fase di esecuzione è giusto. Il vero problema è che entrambe le versioni di Python condividono UNO PYTHONPATH . Se PYTHONPATHnon corrisponde alla versione di Python, Python non riesce a trovare il giusto pacchetto del sito e fa lamentare Vim. Questo fa pensare a molti di noi che si tratti di un problema VIM. Ma no.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.