Jak korzystać z wtyczek Python w systemie Windows?

9

Mam 64-bitowy system Windows 7 z zainstalowanym pythonem 2.7.11 i pythonem 3.5.1 (oba 32-bitowe) i skompilowałem vima z python / dyn i python3 / dyn, ale wciąż pojawia się następujący błąd:

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

Jednak następujące wszystko działa dobrze:

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

i

:py3 print("hello")

To są informacje o mojej wersji vima:

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      

I where python27.dllwynikiC:\Windows\System32

Próbowałem porady z tego postu grupy google , ale bezskutecznie.

Chcę tylko, aby YouCompleteMe działał pomyślnie.

afontaina
źródło
:help python-dynamicmówi...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,
Jest tutaj. :!where python27.dllzwraca C:\Windows\System32\python27.dll. Zauważ też, że jeśli brakuje biblioteki, pojawia się inny błąd: E370: Could not load library python27.dlliE263: Sorry, this command is disabled, the Python library could not be loaded.
afontaine
Ahh Widzę. :py3działa, ale :pynie będzie? Jest to możliwe, jeśli jedna z wtyczek zostanie uruchomiona :py3podczas uruchamiania vima. Zobacz :he python-2-and-3wyjaśnienie, w jaki sposób python / dyn i python3 / dyn działają razem.
Alex Kroll
Wygląda na to, że zamiana wersji 2.7.11 na 2.7.9 załatwiła sprawę. Dziwne jednak.
afontaine

Odpowiedzi:

7

W porządku, najwyraźniej stan jest następujący: VIM w Windows obsługuje Python 2.7.9, a nie 2.7.11. Może to działać 2.7.10, nie testowałem tego.

Mimo że skompilowane VIM w systemie Windows z odniesieniem do 2.7.11DLL, nagle pracował kiedy próbowałem wymieniając 2.7.11dla2.7.9

Nie jestem pewien, czy zrobiłem coś złego 2.7.11, i to faktycznie działa, ale nie mam czasu, aby to rozgryźć.

afontaina
źródło
3
W przypadku wersji 2.7.11 jest to spowodowane błędem w Pythonie, który można obejść
Christian Brabandt
3

Miałem więc bardzo podobny problem na moim systemie Windows 10, ale w 64-bitowym vimie i pythonie.

TL; DR

W moim przypadku problem nie ma nic wspólnego z YouCompleteMe. Załóżmy, że YCM jest zgodny z Pythonem 3. Aby uczynić Python27 całkowicie niewidocznym dla VIM, to pomaga mi rozwiązać problem.

  1. Zainstalowałem TortoiseHgplik, który ma plik python27.dll i którego repozytorium znajduje się Path, co oznacza, że ​​jest widoczny dla vima. Aby uczynić go niewidocznym, po prostu usuń repozytorium TortoiseHg z Path(Ogólnie mówiąc, dowolnego programu niebędącego pythonem, który zawiera python27.dll i którego ścieżka znajduje się w Path. Wykonując where python27.dllw konsoli Windows, znajdziesz je wszystkie.)
  2. Kolejny python27.dll C:\Windows\System32jest również widoczny dla vima. Aby uczynić go również niewidocznym, przenieś go do C:\Python27. I usuń C:\Python27z Path.
  3. Pozostaw %PYTHONPATH%niezaznaczone. Upewnij się, że repozytorium Python 3.5 znajduje się w Path.

Mój system

  • Wygraj 10 pro w wersji 64-bitowej.
  • Vim 8.0.0045 64-bitowe ogromne funkcje (+ dyn / python + dyn / python3) pobrane z nocnej strony budowania systemu Windows vim .
  • YouCompleteMe był zgodny z 64-bitowym pythonem 3.5.2
  • Python 3.5.2 64-bitowy
  • Python 2.7.12 64-bitowy
  • %PYTHONHOME%jest ustawiony na folder instalacyjny Pythona 3 i jest zawarty w Path.

Mój problem

Błędy są wykrywane po uruchomieniu vima, jak pokazano poniżej.

Błędy uruchamiania Vima

Wiadomości są

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.

Diagnostyka

Oba :echo has('python')i :echo has('python3')wyjście 1. Ale kiedy to zrobię :py print 'test', vim daje mi ten sam komunikat o błędzie E887.

Następnie całkowicie odinstalowałem Python 2.7.12, ale :echo has('python')nadal wyświetla dane wyjściowe 1 i :py print 'test'nadal wyświetla błąd E887! Tymczasem :py3 print('test')działa zawsze OK i test wyjściowy zgodnie z oczekiwaniami.

Aby upewnić się, że nie jest to problem z YouCompleteMe, uruchomiłem vim przez gvim -u NONE. Test drukowania daje ten sam komunikat o błędzie. Problemem jest sam vim, który nie wykonuje personelu związanego z modułem strony Python 2.7.x.

Niektórzy sugerują instalację Pythona 2.7.9, ale to nie działa dla mnie. Być może to rozwiązanie działa tylko w 32-bitowym pythonie 2.7. Nie testowałem, więc nie mogę potwierdzić.

Dlaczego to wszystko się dzieje:

  1. Po pierwsze, robiąc where python27.dllznalazłem pod repozytorium TortoiseHG, istnieje inny plik python27.dll. Dlatego :echo has('python')nadal wyświetla 1 po odinstalowaniu Pythona 2.7.12.
  2. Następnie, mówiąc najprościej, polecenie :has('python')wyjściowe 1, jeśli oba warunki są spełnione:

    • Vim jest kompilowany z funkcją + dyn / python (odpowiednio + dyn / python3 podczas wykonywania :has('python3'))

    • Plik python27.dll znajduje się na Twojej ścieżce. (odpowiednio python35.dll. zobacz :help-python-dynamici :help has-pythonwięcej informacji.) Ale to nie sprawdza dalej ; dlatego has-pythonczek daje 1, ale nadal wykrywane są błędy.

  3. Python 2.7.12 nie ustawia się automatycznie %PYTHONPATH%, podczas gdy Python 3.5.2 ustawia tę wartość na <where_python_found>\Libi <where_python_found>\Lib\site-packagesprzy starup Windows, jeśli znajdzie plik wykonywalny Pythona w Path. W moim przypadku, w którym vim zainstalował tylko python 3.5.2 i python27.dll TortoiseHg, Kiedy uruchomię :py print 'test', vim będzie szukał modułu witryny python 2.7, ale w Pythonie 3.5 %PYTHONPATH%. Dlatego generowany jest błąd E887. W związku z tym, jeśli mamy ustawiony %PYTHONPATH%jawnie do punktu do Pythona 2.7, Błąd E887 będzie ZNIKNĄ !

Rozwiązanie

Patrz początek TL: część DR.

Wniosek

Kiedyś miałeś obie wersje Pythona i odinstalowałeś jedną. Możesz szczęśliwie myśleć, że jest czysty, ale vim powie ci, że znajduje usuniętego pytona, jesteś zaskoczony i ja również. Wynika to z faktu, że często w twoim systemie nadal pozostaje tajemnicza biblioteka DLL Pythona, która niestety może zostać wykryta przez vima. Niezależnie od tego, czy zachowujesz inną wersję Pythona na dysku twardym, czy nie, upewnij się, że vim jest całkowicie niewidoczny.

Fakt, że obie wersje Pythona mogą być wywoływane przez tę samą instancję vim w czasie wykonywania, jest w porządku. Prawdziwym problemem jest obie wersje JEDNEGO Pythona PYTHONPATH. Jeśli PYTHONPATHnie pasuje do wersji Pythona, python nie może znaleźć odpowiedniego pakietu strony i zmusić vima do narzekań. To sprawia, że ​​większość z nas myśli, że to problem vim. Ale nie.

Chen XI
źródło