Làm cách nào để sử dụng plugin Python trên Windows?


9

Tôi đã cài đặt Windows 7 64 bit, với python 2.7.11 và python 3.5.1 (cả 32 bit) và tôi đã biên dịch vim với python / dyn và python3 / dyn, nhưng tôi vẫn gặp lỗi sau:

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

Tuy nhiên, tất cả các công việc sau đây đều ổn:

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

:py3 print("hello")

Đây là thông tin phiên bản vim của tôi:

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đầu raC:\Windows\System32

Tôi đã thử lời khuyên từ bài đăng trên nhóm google này , nhưng không có kết quả.

Tôi chỉ muốn YouCompleteMe chạy thành công.


:help python-dynamicnói...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

Nó đây rồi. :!where python27.dlltrả lại C:\Windows\System32\python27.dll. Cũng lưu ý rằng nếu thư viện bị thiếu, sẽ xảy ra một lỗi khác: E370: Could not load library python27.dllE263: Sorry, this command is disabled, the Python library could not be loaded.
afontaine

À Tôi hiểu rồi. :py3làm việc nhưng :pysẽ không? Có thể nếu một trong các plugin thực thi :py3trong khi khởi chạy vim. Xem :he python-2-and-3để giải thích cách python / dyn và python3 / dyn phối hợp với nhau ..
Alex Kroll

Có vẻ như việc hoán đổi 2.7.11 cho 2.7.9 đã thực hiện thủ thuật này. Lạ thay.
afontaine

Câu trả lời:


7

Được rồi, rõ ràng trạng thái là thế này: VIM trên Windows có hỗ trợ python 2.7.9không 2.7.11. Nó có thể hoạt động với 2.7.10, tôi đã không kiểm tra nó.

Mặc dù tôi đã biên dịch VIM trên Windows với tham chiếu đến 2.7.11DLL, nhưng nó đột nhiên hoạt động khi tôi thử đổi chỗ 2.7.11cho2.7.9

Tôi không chắc mình đã làm gì sai hay không 2.7.11, và nó thực sự hoạt động, nhưng tôi không có thời gian để tìm ra nó.


3
Đối 2.7.11 này là do lỗi python, có thể được làm việc xung quanh
Christian Brabandt

3

Vì vậy, tôi đã gặp một vấn đề rất giống trên Windows 10 của mình nhưng với 64 bit vim và python.

TL; DR

Vấn đề không liên quan gì đến YouCompleteMe trong trường hợp của tôi. Giả sử YCM tuân thủ python 3. Để làm cho python27 hoàn toàn vô hình với VIM là điều giúp tôi giải quyết vấn đề.

  1. Tôi đã cài đặt TortoiseHgcó tệp python27.dll và có kho lưu trữ trong Pathđó, có nghĩa là nó hiển thị với vim. Để làm cho nó vô hình, chỉ cần xóa kho lưu trữ TortoiseHg khỏi Path(Nói chung, bất kỳ chương trình không phải python nào chứa python27.dll và có đường dẫn vào Path. Bằng cách thực hiện where python27.dlltrong bảng điều khiển windows, bạn sẽ tìm thấy tất cả chúng.)
  2. Một python27.dll trong C:\Windows\System32cũng có thể nhìn thấy vim. Để làm cho nó cũng vô hình, Di chuyển nó đến C:\Python27. Và loại bỏ C:\Python27khỏi Path.
  3. Để lại %PYTHONPATH%không đặt. Đảm bảo kho lưu trữ Python 3.5 nằm trong Path.

Hệ thống của tôi

  • Kiếm được 10 pro 64 bit.
  • Các tính năng khổng lồ của Vim 8.0.0045 64 bit (+ dyn / python + dyn / python3) được tải xuống từ trang web xây dựng cửa sổ vim hàng đêm .
  • YouCompleteMe đã tuân thủ python 3.5.2 64 bit
  • Python 3.5.2 64 bit
  • Python 2.7.12 64 bit
  • %PYTHONHOME%được đặt thành thư mục cài đặt python 3 và bao gồm trong Path.

Vấn đề của tôi

Lỗi được phát hiện khi vim được khởi chạy như hình dưới đây.

Lỗi khởi chạy Vim

Tin nhắn là

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.

Chẩn đoán

Cả hai :echo has('python'):echo has('python3')đầu ra 1. Nhưng khi tôi làm :py print 'test', vim cho tôi cùng một thông báo lỗi E887.

Sau đó, tôi gỡ cài đặt hoàn toàn Python 2.7.12, nhưng :echo has('python')vẫn xuất ra 1 và :py print 'test'vẫn báo lỗi E887! Trong khi đó :py3 print('test')hoạt động luôn OK và kiểm tra đầu ra như mong đợi.

Để đảm bảo nó không phải là vấn đề từ YouCompleteMe, tôi đã khởi chạy vim bởi gvim -u NONE. Kiểm tra in cho thông báo lỗi tương tự. Vì vậy, vấn đề là từ chính vim, mà nó không thực hiện được các nhân viên liên quan đến mô-đun trang web python 2.7.x.

Một số người đề nghị cài đặt Python 2.7.9, nhưng nó không hoạt động với tôi. Có lẽ giải pháp này chỉ hoạt động đối với python 32 bit 2.7. Tôi đã không kiểm tra vì vậy tôi không thể xác nhận.

Tại sao tất cả những điều này xảy ra:

  1. Đầu tiên, bằng cách thực hiện, where python27.dlltôi tìm thấy trong kho lưu trữ TortoiseHG, có một tệp python27.dll khác. Đó là lý do tại sao :echo has('python')vẫn xuất ra 1 sau khi tôi gỡ cài đặt Python 2.7.12.
  2. Sau đó, để đơn giản, lệnh :has('python')đầu ra 1 nếu cả hai điều kiện được đáp ứng:

    • Vim được biên dịch với tính năng + dyn / python (tương ứng + dyn / python3 khi thực hiện :has('python3'))

    • Tệp python27.dll được tìm thấy trong Đường dẫn của bạn. (tương ứng python35.dll. xem :help-python-dynamic:help has-pythonđể biết thêm thông tin.) Nhưng nó không kiểm tra thêm ; đó là lý do tại sao has-pythonkiểm tra cho 1 nhưng vẫn phát hiện lỗi.

  3. Python 2.7.12 không tự động thiết lập %PYTHONPATH%, trong khi Python 3.5.2 đặt giá trị này thành <where_python_found>\Lib<where_python_found>\Lib\site-packagestại starup Windows nếu nó tìm thấy python có thể thực thi được Path. Trong trường hợp của tôi chỉ cài đặt python 3.5.2 và python27.dll của TortoiseHg được tìm thấy bởi vim, Khi tôi chạy :py print 'test', vim sẽ tìm kiếm mô-đun trang web python 2.7 nhưng trong Python 3.5 %PYTHONPATH%. Đó là lý do Lỗi E887 bị ném. Do đó, nếu chúng ta đặt %PYTHONPATH%explicitely để trỏ đến python 2.7, Các lỗi E887 sẽ biến mất !

Giải pháp

Xem phần đầu TL: DR.

Phần kết luận

Bạn đã từng có cả hai phiên bản của python và bạn gỡ cài đặt một phiên bản. Bạn có thể vui vẻ nghĩ rằng nó sạch sẽ nhưng vim nói với bạn rằng anh ta tìm thấy con trăn bạn đã xóa, bạn rất ngạc nhiên và tôi cũng vậy. Đó là bởi vì thường vẫn còn một số dll python bí ẩn còn sót lại trong hệ thống của bạn và không may có thể bị vim phát hiện. Vì vậy, cho dù bạn có bảo tồn phiên bản trăn khác trên ổ cứng hay không, hãy đảm bảo rằng nó hoàn toàn vô hình với vim.

Thực tế là cả hai phiên bản của python có thể được gọi bởi cùng một vim trong thời gian chạy là hoàn toàn đúng. Vấn đề thực sự là cả hai phiên bản của python chia sẻ ONE PYTHONPATH . Nếu PYTHONPATHkhông khớp với phiên bản python, python không tìm được gói trang web phù hợp và khiến vim phàn nàn. Điều này làm cho hầu hết chúng ta nghĩ rằng đó là một vấn đề vim. Nhưng không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.