Как использовать плагины Python в Windows?

9

У меня Windows 7 64-битная, с установленными python 2.7.11 и python 3.5.1 (обе 32-битные), и я скомпилировал vim с python / dyn и python3 / dyn, но я продолжаю получать следующую ошибку:

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

Тем не менее, следующие все работают просто отлично:

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

а также

:py3 print("hello")

Это моя версия 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      

И where python27.dllвыводыC:\Windows\System32

Я попробовал совет из этой записи группы Google , но безрезультатно.

Я просто хочу, чтобы YouCompleteMe работал успешно.

afontaine
источник
:help python-dynamicговорит...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.
Алекс Кролл
Это здесь. :!where python27.dllвозвращается C:\Windows\System32\python27.dll. Также обратите внимание, что если библиотека отсутствует, возникает другая ошибка: E370: Could not load library python27.dllаE263: Sorry, this command is disabled, the Python library could not be loaded.
afontaine
Ааа. Понимаю. :py3работает но :pyне будет? Это возможно, если один из плагинов :py3запускается во время запуска vim. Смотрите :he python-2-and-3для объяснения, как python / dyn и python3 / dyn работают вместе ..
Алекс Кролл
Похоже, замена 2.7.11 на 2.7.9 сделала свое дело. Странно все же.
afontaine

Ответы:

7

Хорошо, видимо, состояние таково: VIM в Windows поддерживает Python 2.7.9, а не 2.7.11. Может сработать 2.7.10, я не проверял.

Даже если я составил VIM на Windows , со ссылкой на 2.7.11DLL, он внезапно работал , когда я попытался выгрузив 2.7.11для2.7.9

Я не уверен, сделал ли я что-то не так 2.7.11, и это действительно работает, но у меня нет времени, чтобы понять это.

afontaine
источник
3
Для 2.7.11 это вызвано ошибкой в ​​python, которую можно обойти
Кристиан Брабандт,
3

Так что у меня была очень похожая проблема на моей Windows 10, но для 64-битных vim и python.

TL; DR

Проблема не имеет ничего общего с YouCompleteMe в моем случае. Предположим, что YCM соответствует Python 3. Сделать Python27 полностью невидимым для VIM - вот что помогает мне решить проблему.

  1. Я установил, TortoiseHgкоторый имеет файл python27.dll и чей репозиторий находится в Path, что означает, что он виден vim. Для того, чтобы сделать его невидимым, просто удалить TortoiseHg хранилища из Path(более общо, любой непитоновской программы, содержащей python27.dll и чей путь в Path. Поступая where python27.dllв консоли окна, вы найдете все из них.)
  2. Другой python27.dll в C:\Windows\System32также виден vim. Чтобы сделать его также невидимым, переместите его в C:\Python27. И удалить C:\Python27из Path.
  3. Оставьте %PYTHONPATH%неустановленным. Убедитесь, что репозиторий Python 3.5 находится в Path.

Моя система

  • Win 10 Pro 64 бит.
  • Vim 8.0.0045 64-битные огромные функции (+ dyn / python + dyn / python3), загруженные с сайта ночных сборок vim windows .
  • YouCompleteMe соответствует Python 3.5.2 64 бит
  • Python 3.5.2 64 бит
  • Python 2.7.12 64 бит
  • %PYTHONHOME%установлен в папку установки Python 3 и включен в Path.

Моя проблема

Ошибки обнаруживаются при запуске vim, как показано ниже.

Ошибки запуска Vim

Сообщения

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.

диагностика

Оба :echo has('python')и :echo has('python3')вывод 1. Но когда я это делаю :py print 'test', vim выдает мне то же сообщение об ошибке E887.

Затем я полностью удаляю Python 2.7.12, но :echo has('python')все равно выдает 1 и :py print 'test'все равно выдает E887 Error! Тем временем :py3 print('test')работает всегда в норме и выходной тест как положено.

Чтобы убедиться, что это не проблема с YouCompleteMe, я запустил vim by gvim -u NONE. Тест печати выдает то же сообщение об ошибке. Таким образом, проблема связана с самим vim, который не может выполнить персонал, связанный с модулем сайта python 2.7.x.

Некоторые люди предлагают установить Python 2.7.9, но он не работает для меня. Возможно, это решение работает только для 32-битного Python 2.7. Я не проверял, поэтому я не могу подтвердить.

Почему все это происходит:

  1. Во-первых, where python27.dllя обнаружил в хранилище TortoiseHG еще один файл python27.dll. Вот почему :echo has('python')все еще выводит 1 после того, как я удалил Python 2.7.12
  2. Затем, проще говоря, команда :has('python')выводит 1, если выполняются оба условия:

    • Vim скомпилирован с функцией + dyn / python (соответственно + dyn / python3 при выполнении :has('python3'))

    • Файл python27.dll находится в вашем пути. (соответственно python35.dll. см. :help-python-dynamicи :help has-pythonдля получения дополнительной информации.) Но это не делает дальнейшую проверку ; Вот почему has-pythonпроверка дает 1, но все равно ошибки обнаружены.

  3. Python 2.7.12 не устанавливается автоматически %PYTHONPATH%, в то время как Python 3.5.2 устанавливает это значение <where_python_found>\Libи <where_python_found>\Lib\site-packagesпри запуске Windows, если находит исполняемый файл python Path. В моем случае, когда только установленный python 3.5.2 и TortoiseHg обнаруживают python27.dll с помощью vim, при запуске :py print 'test'vim будет искать модуль сайта python 2.7, но в Python 3.5 %PYTHONPATH%. Вот почему ошибки E887 выбрасываются. Следовательно, если мы устанавливаем %PYTHONPATH%явно в точку в Python 2.7, ошибка E887 будет ИСЧЕЗНУТ !

Решение

Смотрите начало TL: DR часть.

Вывод

Когда-то у вас были обе версии Python, и вы удалили одну. Вы можете счастливо думать, что он чистый, но Вим говорит, что находит питона, которого вы удалили, вы удивлены и я тоже. Это потому, что часто в вашей системе все еще остается какая-то таинственная DLL-библиотека Python, и, к сожалению, vim может обнаружить ее. Итак, сохраняете ли вы другую версию python на своем жестком диске или нет, убедитесь, что он полностью невидим для vim.

Тот факт, что обе версии python могут быть вызваны одним и тем же экземпляром vim во время выполнения, просто в порядке. Реальная проблема заключается как версия питона акций ONE PYTHONPATH . Если PYTHONPATHне совпадает с версией Python, Python не может найти нужный сайт-пакет и заставить vim жаловаться. Это заставляет большинство из нас думать, что это бесполезная проблема. Но нет.

Чэнь XI
источник