Como faço para que o Vim possa executar python e python3 em um sistema Linux na mesma sessão?

28

Nos sistemas Linux, o Vim empacotado normalmente possui apenas um deles pythonou python3ativado. É possível que ambos estejam ativados (usando python/dyne python3/dyn), mas durante uma sessão, apenas um pode ser usado. Esta discussão na lista de discussão dizia :

Depende de como as bibliotecas Python são construídas. Nos sistemas baseados no Debian (por razões que não me lembro de imediato), eles são construídos de forma que o RTLD_GLOBAL precise ser usado para obter acesso aos símbolos. Isso impede o carregamento de libpython2.xe libpython3.x no mesmo processo.

O que pode ser feito para permitir o carregamento de ambos na mesma sessão?

Opções que eu posso ver:

  • Reconstrua os pacotes Python {2,3} para que RTLD_GLOBAL(seja o que for) não seja necessário.
  • De alguma forma, faça com que a biblioteca carregada anteriormente seja descarregada (?!) Pelo Vim. (É mesmo possível?)

Para qualquer detalhe da distribuição, assuma, em ordem crescente de especificidade:

  • Baseado no Debian
  • Ubuntu
  • Ubuntu 14.04
  • Ou, Arch Linux, se um sistema baseado no Debian for muito complexo.

Observe que eu tenho o Vim para construir com suporte de carregamento dinâmico para ambos, portanto, criar o Vim não é um problema.

muru
fonte

Respostas:

17

Sou o atual mantenedor do Vim para o Debian e a pessoa citada na discussão da lista de discussão referenciada.

Como você afirmou, essa não é uma pergunta sobre o Vim. Trata-se de criar o software ao qual o Vim se vincula de maneira a atender às suas necessidades. Há uma discussão mais aprofundada (pelo menos para o aspecto Debian) da questão em um bug solicitando que o Python3 seja ativado no pacote Vim do Debian.

Isso se resume a

  • O pacote Python do Debian não vincula as extensões Python à biblioteca compartilhada libpython relevante. É isso que faz com que o pacote Vim do Debian exija o uso RTLD_GLOBALao usar dlopen()para carregar dinamicamente as ligações da linguagem Python.

  • Não há boas maneiras de expressar o relacionamento entre os pacotes Vim e as bibliotecas carregadas dinamicamente para garantir que eles sejam atualizados juntos quando apropriado. Mesmo se o primeiro ponto fosse resolvido, esse problema ainda me impediria de ativar o carregamento dinâmico do suporte ao Python.

    O ponto principal de carregar dinamicamente o suporte ao idioma no Vim é não exigir que os usuários instalem bibliotecas que não usarão. Isso significa que o pacote Vim não pode especificar uma dependência rígida em uma versão mínima de uma biblioteca.

    Portanto, se o Vim for construído com uma versão mais recente de uma biblioteca que não é compatível com a versão anterior e o usuário não as atualizar, o Vim falhará. Isso não é algo que eu quero que os usuários dos pacotes encontrem.

Gostaria de poder reativar (estava disponível por um curto período de tempo em 2010-2011) o carregamento dinâmico de suporte a idiomas, mas os problemas acima devem ser resolvidos primeiro.


Na versão 2: 7.4.2330-1 , o pacote Debian passou a usar Python3 em vez de Python2 para as ligações Python.


Como alternativa, o pacote neovim suporta o uso do Python2 e Python3 do mesmo processo nvim, pois o suporte do Python é fornecido por módulos externos (os pacotes python-neovim e python3-neovim ). Externalizar o código Python, em vez de incorporá-lo como o Vim, evita a questão de lidar com a forma como o libpython é construído.

jamessan
fonte
"Isso significa que o pacote Vim não pode especificar uma dependência rígida em uma versão mínima de uma biblioteca". Suponho que é por isso que o Debian não possui pacotes separados para o Vim + Python2 e Vim + Python3 como o Arch Linux possui?
muru
O @muru Python é apenas uma das ligações de idiomas disponíveis. Fornecer combinações de pacotes para os diferentes idiomas e kits de ferramentas da GUI é um grande número de pacotes. A decisão foi habilitar quantas ligações de idioma fossem razoáveis ​​e deixar a escolha entre os kits de ferramentas da GUI (ou não). Um usuário não deve ter de escolher Vim plugins com base no idioma que está escrito.
jamessan
Esse não é um argumento real, já que apenas Python e Python3 entram em conflito. Sinceramente, acho que você deve pegar emprestada uma folha do livro dos desenvolvedores do Arch. Além de um comum vim-runtimepacote, eles têm vim, gvim, vim-python3e gvim-python3. A única diferença entre os -python3pacotes normal e é a versão do Python ativada. Claro, isso duplica o número de pacotes de front-end, mas é toda a falha que vejo nessas embalagens.
Muni
Isso é para o Arch. Em Debian, há vim-nox, vim-gtk, vim-gnome, e vim-athena. Dobrar esses apenas para que os usuários ainda não possam usar os plugins Python e Python3 não parece valer a pena.
26615 jamessan
Estou levemente curioso para saber por que você não escolheu a opção dinâmica para os pacotes normais.
muru 14/09/16
4

O Ubuntu 16.04 agora possui vim-*-py2pacotes incluídos no repositório. Isso significa que todos os usuários do Debian Vim podem migrar para o Ubuntu, se necessário.

Os vim-*pacotes anteriores agora fornecem +python3e os binários são nomeados de maneira diferente para evitar conflitos:

E assim por diante.

dfggdfgdfgdfgdfgdfgdfgdfg
fonte
Então, no 16.04, eu posso carregar python2 e python3 na mesma sessão do Vim?
Muru
@muru não, você pode apenas escolher qual deles você entrar em uma determinada sessão mais facilmente;)
hobbs
@obbs Tenho certeza que os pacotes entram em conflito com os python3.
Muru
@ muru eles não, de fato. Você pode instalar e executar o que escolher, além de escolher um para ser o seu vim padrão. Não é ótimo, mas é uma melhoria.
precisa
2
E agora, com 17.04, Python 2 apoio e os pacotes Vim relevantes foram retiradas
Muru