C'è un modo per fare in modo che vim utilizzi un interprete python3 che non è esplicitamente installato in Windows 10?

Sep 30 2020

Voglio usare un certo interprete Python invece di uno installato.

La mia versione di gvim è

VIM - Vi IMproved 8.2 (2019 Dec 12 kompiliert am Dec 12 2019 13:30:17)
MS-Windows 32 Bit GUI Version mit OLE-Unterstützung
Übersetzt von mool@tororo
Riesige Version mit GUI. Ein- (+) oder ausschließlich (-) der Eigenschaften:
+acl                +eval               +multi_lang         -tag_any_white
+arabic             +ex_extra           +mzscheme/dyn       +tcl/dyn
+autocmd            +extra_search       +netbeans_intg      -termguicolors
+autochdir          -farsi              +num64              +terminal
+autoservername     +file_in_path       +ole                -termresponse
+balloon_eval       +find_in_path       +packages           +textobjects
-balloon_eval_term  +float              +path_extra         +textprop
+browse             +folding            +perl/dyn           -tgetent
++builtin_terms     -footer             +persistent_undo    +timers
+byte_offset        +gettext/dyn        +popupwin           +title
+channel            -hangul_input       -postscript         +toolbar
+cindent            +iconv/dyn          +printer            +user_commands
+clientserver       +insert_expand      +profile            +vartabs
+clipboard          +job                +python/dyn         +vertsplit
+cmdline_compl      +jumplist           +python3/dyn        +virtualedit
+cmdline_hist       +keymap             +quickfix           +visual
+cmdline_info       +lambda             +reltime            +visualextra
+comments           +langmap            +rightleft          +viminfo
+conceal            +libcall            +ruby/dyn           +vreplace
+cryptv             +linebreak          +scrollbind         -vtp
+cscope             +lispindent         +signs              +wildignore
+cursorbind         +listcmds           +smartindent        +wildmenu
+cursorshape        +localmap           +sound              +windows
+dialog_con_gui     +lua/dyn            +spell              +writebackup
+diff               +menu               +startuptime        -xfontset
+digraphs           +mksession          +statusline         -xim
+directx            +modify_fname       -sun_workshop       +xpm_w32
-dnd                +mouse              +syntax             -xterm_save
-ebcdic             +mouseshape         +tag_binary         
+emacs_tags         +multi_byte_ime/dyn -tag_old_static     
          System-vimrc-Datei: "$VIM\vimrc" Benutzer-vimrc-Datei: "$HOME\_vimrc"
 zweite Benutzer-vimrc-Datei: "$HOME\vimfiles\vimrc" dritte Benutzer-vimrc-Datei: "$VIM\_vimrc"
         Benutzer-exrc-Datei: "$HOME\_exrc" zweite Benutzer-exrc-Datei: "$VIM\_exrc"
         System-gvimrc-Datei: "$VIM\gvimrc" Benutzer-gvimrc-Datei: "$HOME\_gvimrc"
zweite Benutzer-gvimrc-Datei: "$HOME\vimfiles\gvimrc" dritte Benutzer-gvimrc-Datei: "$VIM\_gvimrc"
      defaults Datei: "$VIMRUNTIME\defaults.vim" System-Menü-Datei: "$VIMRUNTIME\menu.vim"
Übersetzt: cl -c /W3 /nologo  -I. -Iproto -DHAVE_PATHDEF -DWIN32  -DFEAT_CSCOPE -DFEAT_TERMINAL -DFEAT_SOUND -DFEAT_NETBEANS_INTG -DFEAT_JOB_CHANNEL   -DFEAT_XPM_W32   -DWINVER=0x0501 -D_WIN32_WINNT=0x0501 /MP -DHAVE_STDINT_H /Ox /GL -DNDEBUG /arch:IA32 /Zl /MT -DFEAT_OLE -DFEAT_MBYTE_IME -DDYNAMIC_IME -DFEAT_GUI_MSWIN -DFEAT_DIRECTX -DDYNAMIC_DIRECTX -DFEAT_DIRECTX_COLOR_EMOJI -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DFEAT_TCL -DDYNAMIC_TCL -DDYNAMIC_TCL_DLL=\"tcl86t.dll\" -DDYNAMIC_TCL_VER=\"8.6\" -DFEAT_LUA -DDYNAMIC_LUA -DDYNAMIC_LUA_DLL=\"lua53.dll\" -DFEAT_PYTHON -DDYNAMIC_PYTHON -DDYNAMIC_PYTHON_DLL=\"python27.dll\" -DFEAT_PYTHON3 -DDYNAMIC_PYTHON3 -DDYNAMIC_PYTHON3_DLL=\"python36.dll\" -DFEAT_MZSCHEME -I "E:\Racket\include" -DMZ_PRECISE_GC -DDYNAMIC_MZSCHEME -DDYNAMIC_MZSCH_DLL=\"libracket3m_a36fs8.dll\" -DDYNAMIC_MZGC_DLL=\"libracket3m_a36fs8.dll\" -DFEAT_PERL -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DDYNAMIC_PERL -DDYNAMIC_PERL_DLL=\"perl524.dll\" -DFEAT_RUBY -DDYNAMIC_RUBY -DDYNAMIC_RUBY_VER=24 -DDYNAMIC_RUBY_DLL=\"msvcrt-ruby240.dll\" -DFEAT_HUGE /Fd.\ObjGXOULYHTRZi386/ /Zi
Linken: link  /nologo /opt:ref /LTCG:STATUS oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib  comdlg32.lib ole32.lib netapi32.lib uuid.lib /machine:i386 gdi32.lib version.lib   winspool.lib comctl32.lib advapi32.lib shell32.lib netapi32.lib  /machine:i386  libcmt.lib oleaut32.lib user32.lib  /nodefaultlib:lua53.lib  /STACK:8388608  /nodefaultlib:python27.lib /nodefaultlib:python36.lib   "E:\ActiveTcl\lib\tclstub86.lib" winmm.lib WSock32.lib xpm\x86\lib-vc14\libXpm.lib /PDB:gvim.pdb -debug

Quindi ha il supporto per python3 / dyn.

Se inizio gvim nudo con:

gvim -Nu NONE

e prova a eseguire python3 in questo modo

:py3 import sys;print(sys.version)

Ottengo E370: impossibile caricare python36.dll

che sembra essere la versione predefinita di Python.

Ora posso risolvere questo problema impostando pythonthreehome e pythonthreedll su una versione di python installata:

:set pythonthreehome=c:\Users\ws\Anaconda3\
:set pythonthreedll=c:\Users\ws\Anaconda3\python38.dll

In esecuzione

:py3 import sys;print(sys.version)

ora mi mostra che è usato python 3.8.3.

Ma se voglio usare un altro python3, che non è installato, ma invece estratto da un repository, come questo

:set pythonthreehome=c:\installations\cs_workspaces4_trunk\trunk\libs\Python35\
:set pythonthreedll=c:\installations\cs_workspaces4_trunk\trunk\libs\Python35\python35.dll

e provo a eseguire di nuovo py3, ottengo

E448: (tradotto dal tedesco) Impossibile caricare la funzione di libreria PySlice_AdjustIndices

e

E263: (tradotto dal tedesco) Spiacenti, questo comando è disabilitato, non è stato possibile caricare la libreria Python

Qualcuno può dirmi se e come è possibile utilizzare un interprete python3 dll in vim da un python che non è installato?

Risposte

3 filbranden Sep 30 2020 at 21:15

L'API C di Python si evolve con la versione di Python. In questo caso, la funzione è PySlice_AdjustIndicesstata introdotta in questo commit per sostituire la funzione PySlice_GetIndicesEx, ma sembra che questa funzione sia stata rilasciata solo a partire da Python 3.5.4 e 3.6.1.

Dal momento che il tuo Vim sembra predefinito su pythonthreedll=python36.dll(dedotto dal messaggio di errore E370: unable to load python36.dll), sembra che sia stato compilato su un Python 3.6 e poiché menziona quella particolare funzione, presumo che fosse Python 3.6.1 o successivo.

D'altra parte, sembra che il tuo Python 3.5 dall'installazione separata potrebbe essere 3.5.3 o precedente, poiché sembra che manchi quella particolare funzione (dato il messaggio di errore E448: (translated from german) Could not load library function PySlice_AdjustIndices).

Quindi, il problema non è che non sia possibile usare un'installazione separata di Python con il tuo Vim ... Ma quell'installazione separata di Python deve corrispondere a quella usata quando Vim è stato compilato.

L'API C di Python è in genere compatibile con le versioni precedenti, quindi le versioni successive di Python funzioneranno normalmente (come hai notato e segnalato che Anaconda3\python38.dllfunziona). Ma le versioni precedenti potrebbero non funzionare in casi come quello che hai incontrato.

Potresti essere in grado di aggirare questo particolare problema aggiornando la tua installazione separata di Python alla 3.5.4 o successiva, che dovrebbe includere la PySlice_AdjustIndicesfunzione, ma è del tutto possibile che potresti imbatterti in un problema simile con una funzione diversa. Sarebbe più sicuro restare con una versione successiva di Python, se possibile.