Comment obtenir Vim pour pouvoir exécuter à la fois python et python3 sur un système Linux dans la même session?

28

Sur les systèmes Linux, Vim empaqueté en a généralement un seul pythonou python3activé. Il est possible d'activer les deux (à l'aide de python/dynet python3/dyn), mais pendant une session, une seule peut être utilisée. Cette discussion sur la liste de diffusion a dit :

Cela dépend de la façon dont les bibliothèques Python sont construites. Sur les systèmes basés sur Debian (pour des raisons dont je ne me souviens pas par inadvertance), ils sont construits de telle sorte que RTLD_GLOBAL doit être utilisé pour accéder aux symboles. Cela empêche le chargement de libpython2.x et libpython3.x dans le même processus.

Que peut-on faire pour activer le chargement des deux dans la même session?

Options que je peux voir:

  • Reconstruisez les packages Python {2,3} afin que RTLD_GLOBAL(quoi que ce soit) ne soit pas nécessaire.
  • D'une manière ou d'une autre, la bibliothèque est chargée plus tôt pour être déchargée (?!) Par Vim. (Est-ce que c'est possible?)

Pour tout détail de la distribution, supposons, par ordre croissant de spécificité:

  • Basé sur Debian
  • Ubuntu
  • Ubuntu 14.04
  • Ou, Arch Linux, si un système basé sur Debian est trop complexe.

Notez que j'ai Vim à construire avec un support de chargement dynamique pour les deux, donc la construction de Vim n'est pas un problème.

muru
la source

Réponses:

17

Je suis le mainteneur Vim actuel pour Debian et la personne citée dans la discussion sur la liste de diffusion référencée.

Comme vous l'avez dit, ce n'est pas une question sur Vim. Il s'agit de créer le logiciel contre lequel Vim se connecte d'une manière qui réponde à vos besoins. Il y a une discussion plus approfondie (au moins pour l'aspect Debian) du problème dans un bug demandant que Python3 soit activé dans le package Vim de Debian.

Cela se résume à

  • L'emballage Python de Debian ne lie pas les extensions Python à la bibliothèque partagée libpython appropriée. C'est ce qui fait que le packaging Vim de Debian doit être utilisé RTLD_GLOBALlors de l'utilisation dlopen()pour charger dynamiquement les liaisons de langage Python.

  • Il n'y a pas de bons moyens d'exprimer la relation entre les packages Vim et les bibliothèques chargées dynamiquement pour s'assurer qu'elles sont mises à niveau ensemble le cas échéant. Même si le premier point était résolu, ce problème m'empêcherait toujours d'activer le chargement dynamique du support Python.

    Le point principal du chargement dynamique de la prise en charge des langues dans Vim est de ne pas obliger les utilisateurs à installer des bibliothèques qu'ils n'utiliseront pas. Cela signifie que le package Vim ne peut pas spécifier une dépendance matérielle sur une version minimale d'une bibliothèque.

    Par conséquent, si Vim est construit sur une version plus récente d'une bibliothèque qui n'est pas rétrocompatible avec l'ancienne version et que l'utilisateur ne les met pas à niveau ensemble, Vim se bloque. Ce n'est pas quelque chose que je souhaite que les utilisateurs des packages rencontrent.

J'aimerais pouvoir réactiver (il était disponible depuis peu en 2010-2011) le chargement dynamique de la prise en charge des langues, mais les problèmes ci-dessus doivent être résolus en premier.


Depuis la version 2: 7.4.2330-1 , l'empaquetage de Debian est passé à l'utilisation de Python3 au lieu de Python2 pour les liaisons Python.


Comme alternative, le package neovim prend en charge l'utilisation de Python2 et Python3 à partir du même processus nvim, car la prise en charge Python est fournie par des modules externes (les packages python-neovim et python3-neovim ). Externaliser le code Python, plutôt que de l'intégrer comme le fait Vim, évite le problème de la façon dont libpython est construit.

jamessan
la source
"Cela signifie que le package Vim ne peut pas spécifier une dépendance matérielle sur une version minimale d'une bibliothèque." Je suppose que c'est pourquoi Debian n'a pas de packages séparés pour Vim + Python2 et Vim + Python3 comme Arch Linux?
muru
@muru Python n'est qu'une des liaisons de langage disponibles. Fournir des combinaisons de packages pour les différentes langues et boîtes à outils GUI est un grand nombre de packages. La décision a été d'autoriser autant de liaisons linguistiques qu'il était raisonnable et de laisser le choix parmi les boîtes à outils de l'interface graphique (ou non). Un utilisateur ne devrait pas avoir à choisir les plugins Vim en fonction de la langue dans laquelle ils sont écrits.
jamessan
Ce n'est pas un vrai argument, car seuls Python et Python3 sont en conflit. Je pense honnêtement que vous devriez emprunter une feuille du livre des développeurs Arch. Mis à part un commun vim-runtimeensemble, ils ont vim, gvim, vim-python3et gvim-python3. La seule différence entre le -python3et les packages normaux est la version de Python activée. Bien sûr, cela double le nombre de packages frontaux, mais c'est tout le défaut que je vois dans un tel emballage.
muru
C'est pour Arch. Dans Debian, il y a vim-nox, vim-gtk, vim-gnomeet vim-athena. Les doubler juste pour que les utilisateurs ne puissent toujours pas utiliser les plugins Python et Python3 ne semble pas utile.
jamessan
Je suis légèrement curieux de savoir pourquoi vous n'avez pas choisi l'option dynamique pour les packages normaux.
muru
4

Ubuntu 16.04 a maintenant des vim-*-py2packages inclus dans le repo. Cela signifie que tous les utilisateurs de Debian Vim peuvent migrer vers Ubuntu si nécessaire.

Les anciens vim-*paquets fournissent maintenant +python3, et les binaires sont nommés différemment pour éviter les conflits:

Etc.

dfggdfgdfgdfgdfgdfgdfgdfg
la source
Donc, le 16.04, je peux charger python2 et python3 dans la même session Vim?
muru
@muru non, vous pouvez simplement choisir celui que vous obtenez dans une session donnée plus facilement;)
hobbs
@hobbs Je suis presque sûr que les paquets entrent en conflit avec ceux de python3.
muru le
@muru ils ne le font pas, en fait. Vous pouvez avoir installé et exécuté celui que vous choisissez, ainsi que en choisir un pour être votre vim par défaut. Ce n'est pas génial, mais c'est une amélioration.
Hobbs
2
Et maintenant, avec la version 17.04, la prise en charge de Python 2 et les packages Vim pertinents ont été supprimés
muru