Come posso fare in modo che Vim sia in grado di eseguire sia Python che Python3 su un sistema Linux nella stessa sessione?


28

Sui sistemi Linux, Vim in pacchetto ha in genere solo uno di uno pythono python3abilitato. È possibile abilitare entrambi (usando python/dyne python3/dyn), ma durante una sessione è possibile utilizzarne solo uno. Questa discussione sulla mailing list diceva :

Dipende da come sono costruite le librerie Python. Sui sistemi basati su Debian (per motivi che non ricordo di persona), sono costruiti in modo tale che RTLD_GLOBAL debba essere utilizzato per accedere ai simboli. Questo impedisce il caricamento di libpython2.xe libpython3.x nello stesso processo.

Cosa si può fare per consentire il caricamento di entrambi nella stessa sessione?

Opzioni che posso vedere:

  • Ricostruisci i pacchetti Python {2,3} in modo che RTLD_GLOBAL(qualunque esso sia) non sia necessario.
  • In qualche modo ottenere la libreria caricata in precedenza per essere scaricato (?!) Da Vim. (È anche possibile?)

Per qualsiasi dettaglio della distribuzione, assumere, in ordine crescente di specificità:

  • Basata su Debian
  • Ubuntu
  • Ubuntu 14.04
  • Oppure, Arch Linux, se un sistema basato su Debian è troppo complesso.

Nota che ho Vim da costruire con il supporto di caricamento dinamico per entrambi, quindi costruire Vim non è un problema.

Risposte:


17

Sono l'attuale manutentore di Vim per Debian e la persona citata nella discussione sulla mailing list di riferimento.

Come hai affermato, questa non è una domanda su Vim. Si tratta di costruire il software a cui Vim si collega in un modo che soddisfi le tue esigenze. C'è una discussione più approfondita (almeno per l'aspetto Debian) del problema in un bug che richiede che Python3 sia abilitato nel pacchetto Vim di Debian.

Questo si riduce a

  • Il pacchetto Debian di Python non collega le estensioni di Python alla relativa libreria condivisa libpython. Questo è ciò che rende necessario il packaging di Debian Vim RTLD_GLOBALquando si usa dlopen()per caricare dinamicamente i binding del linguaggio Python.

  • Non ci sono buoni modi per esprimere la relazione tra i pacchetti Vim e le librerie caricate dinamicamente per garantire che vengano aggiornati insieme quando appropriato. Anche se il primo punto fosse risolto, questo problema mi impedirebbe comunque di abilitare il caricamento dinamico del supporto Python.

    Il punto principale del caricamento dinamico del supporto linguistico in Vim è di non richiedere agli utenti di installare librerie che non useranno. Ciò significa che il pacchetto Vim non può specificare una dipendenza effettiva da una versione minima di una libreria.

    Pertanto, se Vim è basato su una versione più recente di una libreria che non è retrocompatibile con la versione precedente e l'utente non le aggiorna insieme, Vim andrà in crash. Questo non è qualcosa che voglio incontrare dagli utenti dei pacchetti.

Mi piacerebbe poter riattivare (era disponibile per un breve periodo nel 2010-2011) il caricamento dinamico del supporto linguistico, ma i problemi di cui sopra devono essere risolti per primi.


A partire dalla versione 2: 7.4.2330-1 , il packaging di Debian è passato all'uso di Python3 invece di Python2 per i collegamenti Python.


In alternativa, il pacchetto neovim supporta l'uso di Python2 e Python3 dallo stesso processo nvim, poiché il supporto Python è fornito da moduli esterni (i pacchetti python-neovim e python3-neovim ). Esternalizzare il codice Python, piuttosto che incorporarlo come fa Vim, evita il problema di gestire la modalità di creazione di libpython.


"Ciò significa che il pacchetto Vim non può specificare una dipendenza effettiva da una versione minima di una libreria." Suppongo sia per questo che Debian non ha pacchetti separati per Vim + Python2 e Vim + Python3 come Arch Linux ha?
muru,

@muru Python è solo uno dei collegamenti linguistici disponibili. Fornire combinazioni di pacchetti per le diverse lingue e toolkit GUI è un gran numero di pacchetti. La decisione era quella di abilitare quanti più collegamenti linguistici fosse ragionevole e lasciare che la scelta fosse tra i toolkit della GUI (o meno). Un utente non dovrebbe scegliere plug-in Vim in base alla lingua in cui è scritto.
jamessan,

Questo non è un vero argomento, poiché solo Python e Python3 sono in conflitto tra loro. Sinceramente penso che dovresti prendere in prestito una foglia dal libro degli sviluppatori di Arch. A parte un comune vim-runtimepacchetto, hanno vim, gvim, vim-python3e gvim-python3. L'unica differenza tra i -python3pacchetti normali e quelli è la versione di Python abilitata. Certo, raddoppia il numero di pacchetti frontend, ma questo è tutto il difetto che vedo in tale confezione.
Muru,

Questo è per l'arch. In Debian, c'è vim-nox, vim-gtk, vim-gnome, e vim-athena. Raddoppiare quelli solo in modo che gli utenti non possano ancora utilizzare sia i plug-in Python che Python3 non sembra utile.
Jamessan,

Sono leggermente curioso di sapere perché non hai scelto l'opzione dinamica per i normali pacchetti.
Muru,

4

Ubuntu 16.04 ora ha vim-*-py2pacchetti inclusi nel repository. Questo significa che tutti gli utenti Debian Vim possono migrare su Ubuntu se necessario.

I vim-*pacchetti precedenti forniscono ora +python3e i file binari sono denominati in modo diverso per evitare conflitti:

E così via.


Quindi, su 16.04, posso caricare python2 e python3 nella stessa sessione di Vim?
muru,

@muru no, puoi semplicemente scegliere quale ottieni in una determinata sessione più facilmente;)
hobbs

@hobbs Sono abbastanza sicuro che i pacchetti siano in conflitto con quelli di python3.
muru,

@muru no, in effetti. Puoi avere installato ed eseguire quello che preferisci, oltre a sceglierne uno come vim predefinito. Non è eccezionale, ma è un miglioramento.
Hobbs

2
E ora con 17.04, il supporto di Python 2 e i relativi pacchetti Vim sono stati abbandonati
muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.