Wie verwende ich Python-Plugins unter Windows?

9

Ich habe Windows 7 64-Bit mit Python 2.7.11 und Python 3.5.1 (beide 32-Bit) installiert und ich habe vim mit Python / Dyn und Python3 / Dyn kompiliert, aber es wird immer wieder der folgende Fehler angezeigt:

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

Die folgenden Funktionen funktionieren jedoch einwandfrei:

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

und

:py3 print("hello")

Dies ist meine vim Versionsinfo:

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      

Und where python27.dllAusgängeC:\Windows\System32

Ich habe den Rat aus diesem Google-Gruppenbeitrag ausprobiert , aber ohne Erfolg.

Ich möchte nur, dass YouCompleteMe erfolgreich ausgeführt wird.

afontaine
quelle
:help python-dynamicsagt...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
Es ist da. :!where python27.dllkehrt zurück C:\Windows\System32\python27.dll. Beachten Sie auch, dass, wenn die Bibliothek fehlt, ein anderer Fehler auftritt: E370: Could not load library python27.dllundE263: Sorry, this command is disabled, the Python library could not be loaded.
afontaine
Ahh. Aha. :py3funktioniert aber :pynicht? Es ist möglich, wenn eines der Plugins :py3während des Starts von vim ausgeführt wird. Siehe :he python-2-and-3für die Erklärung, wie Python / Dyn und Python3 / Dyn zusammenarbeiten.
Alex Kroll
Es sieht so aus, als hätte es den Trick getan, 2.7.11 gegen 2.7.9 auszutauschen. Seltsam.
Afontaine

Antworten:

7

In Ordnung, anscheinend lautet der Status wie folgt: VIM unter Windows unterstützt Python 2.7.9nicht 2.7.11. Es könnte funktionieren 2.7.10, ich habe es nicht getestet.

Auch wenn ich auf die mit einem Referenz VIM auf Windows kompiliert 2.7.11DLL, funktionierte es plötzlich , als ich versuchte Auslagern 2.7.11für2.7.9

Ich bin mir nicht sicher, ob ich etwas falsch gemacht habe 2.7.11und es funktioniert tatsächlich, aber ich habe nicht die Zeit, es herauszufinden.

afontaine
quelle
3
Für 2.7.11 dies durch Python Fehler verursacht wird, wird das kann , um gearbeitet
Christian Brabandt
3

Ich hatte also ein sehr ähnliches Problem unter Windows 10, aber für 64-Bit-Vim und Python.

TL; DR

Das Problem hat in meinem Fall nichts mit YouCompleteMe zu tun. Angenommen, YCM entspricht Python 3. Python27 für VIM vollständig unsichtbar zu machen, hilft mir, das Problem zu lösen.

  1. Ich hatte installiert, TortoiseHgdie eine python27.dll-Datei hat und deren Repository sich befindet Path, was bedeutet, dass es für vim sichtbar ist. Um es unsichtbar zu machen, entfernen Sie einfach das TortoiseHg-Repository aus Path(Im Allgemeinen alle Nicht-Python-Programme, die eine python27.dll enthalten und deren Pfad sich in befindet Path. Wenn Sie dies where python27.dllin der Windows-Konsole tun , finden Sie alle.)
  2. Eine andere python27.dll in C:\Windows\System32ist auch für vim sichtbar. Um es auch unsichtbar zu machen, verschieben Sie es nach C:\Python27. Und entfernen C:\Python27von Path.
  3. Lassen Sie %PYTHONPATH%nicht gesetzt. Stellen Sie sicher, dass sich das Python 3.5-Repository im befindet Path.

Mein System

  • Gewinnen Sie 10 Pro 64 Bit.
  • Vim 8.0.0045 64-Bit-Funktionen (+ dyn / python + dyn / python3), die von der nächtlichen vim windows build site heruntergeladen wurden .
  • YouCompleteMe entsprach Python 3.5.2 64 Bit
  • Python 3.5.2 64 Bit
  • Python 2.7.12 64 Bit
  • %PYTHONHOME%ist auf den Python 3-Installationsordner eingestellt und in enthalten Path.

Mein Problem

Beim Starten von vim werden Fehler erkannt (siehe unten).

Vim-Startfehler

Nachrichten sind

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.

Diagnose

Beides :echo has('python')und :echo has('python3')Ausgabe 1. Wenn ich dies tue :py print 'test', gibt mir vim dieselbe E887-Fehlermeldung.

Dann deinstalliere ich Python 2.7.12 komplett, gebe aber :echo has('python')immer noch 1 aus und :py print 'test'gebe immer noch E887 Error! Inzwischen :py3 print('test')arbeitet immer OK und Ausgangstest wie erwartet.

Um sicherzustellen, dass YouCompleteMe kein Problem darstellt, habe ich vim by gestartet gvim -u NONE. Der Drucktest gibt die gleiche Fehlermeldung aus. Das Problem liegt also bei vim selbst, das die Mitarbeiter des Python 2.7.x-Site-Moduls nicht unterstützt.

Einige Leute schlagen vor, Python 2.7.9 zu installieren, aber es funktioniert bei mir nicht. Möglicherweise funktioniert diese Lösung nur für 32-Bit-Python 2.7. Ich habe nicht getestet, daher kann ich nicht bestätigen.

Warum all dies passiert:

  1. Als erstes habe where python27.dllich im TortoiseHG-Repository eine weitere python27.dll-Datei gefunden. Aus diesem Grund wird :echo has('python')nach der Deinstallation von Python 2.7.12 immer noch 1 ausgegeben.
  2. Um es einfach auszudrücken, gibt der Befehl :has('python')1 aus, wenn beide Bedingungen erfüllt sind:

    • Vim wird mit der Funktion + dyn / python kompiliert (jeweils + dyn / python3 :has('python3'))

    • Die Datei python27.dll befindet sich in Ihrem Pfad. (bzw. python35.dll. siehe :help-python-dynamicund :help has-pythonfür weitere Informationen.) Es werden jedoch keine weiteren Überprüfungen durchgeführt . Aus diesem Grund has-pythongibt check 1, aber es werden immer noch Fehler erkannt.

  3. Python 2.7.12 wird nicht automatisch festgelegt %PYTHONPATH%, während Python 3.5.2 diesen Wert auf <where_python_found>\Libund <where_python_found>\Lib\site-packagesbei Windows Starup setzt, wenn Python als ausführbar in gefunden wird Path. In meinem Fall, in dem nur Python 3.5.2 installiert ist und TortoiseHgs python27.dll von vim gefunden :py print 'test'wird, sucht vim beim Ausführen das Python 2.7-Site-Modul, jedoch in Python 3.5 %PYTHONPATH%. Deshalb wird Fehler E887 ausgelöst. Wenn wir also festgelegt %PYTHONPATH%wird ausdrücklich auf Punkt zu Python 2.7, Der E887 Fehler DISAPPEAR !

Lösung

Siehe Anfang TL: DR-Teil.

Fazit

Sie hatten einmal beide Python-Versionen und deinstallierten eine. Sie mögen glücklich denken, dass es sauber ist, aber ich sage Ihnen, dass er die Python findet, die Sie gelöscht haben. Sie sind erstaunt und ich auch. Das liegt daran, dass in Ihrem System oft noch eine mysteriöse Python-DLL vorhanden ist, die leider von vim erkannt werden kann. Unabhängig davon, ob Sie eine andere Python-Version auf Ihrer Festplatte speichern oder nicht, stellen Sie sicher, dass sie für vim vollständig unsichtbar ist.

Die Tatsache, dass beide Python-Versionen zur Laufzeit von derselben Instanz vim aufgerufen werden können, ist in Ordnung. Das eigentliche Problem ist, dass beide Versionen von Python Shares ONE sind PYTHONPATH . Wenn PYTHONPATHdie Python-Version nicht übereinstimmt, findet Python nicht das richtige Site-Paket und lässt vim sich beschweren. Dies lässt die meisten von uns denken, dass es sich um ein Vim-Problem handelt. Aber nein.

Chen XI
quelle