Bagaimana saya membuat Vim dapat menjalankan python dan python3 pada sistem Linux di sesi yang sama?

28

Pada sistem Linux, paket Vim biasanya hanya memiliki satu pythonatau python3diaktifkan. Dimungkinkan untuk keduanya diaktifkan (menggunakan python/dyndan python3/dyn), tetapi selama sesi, hanya satu yang dapat digunakan. Diskusi milis ini mengatakan :

Itu tergantung pada bagaimana perpustakaan Python dibangun. Pada sistem berbasis Debian (untuk alasan yang saya tidak ingat begitu saja), mereka dibuat sedemikian rupa sehingga RTLD_GLOBAL harus digunakan untuk mendapatkan akses ke simbol. Ini mencegah memuat libpython2.x dan libpython3.x dalam proses yang sama.

Apa yang dapat dilakukan untuk mengaktifkan pemuatan keduanya di sesi yang sama?

Opsi yang bisa saya lihat:

  • Bangun kembali paket-paket Python {2,3} sehingga RTLD_GLOBAL(apa pun itu) tidak diperlukan.
  • Entah bagaimana, pustaka dimuat lebih awal untuk dibongkar (?!) Oleh Vim. (Apakah itu mungkin?)

Untuk setiap rincian distro, asumsikan, dengan meningkatkan urutan spesifisitas:

  • Berbasis Debian
  • Ubuntu
  • Ubuntu 14.04
  • Atau, Arch Linux, jika sistem berbasis Debian terlalu rumit.

Perhatikan bahwa saya harus membangun Vim dengan dukungan pemuatan dinamis untuk keduanya, jadi membangun Vim bukan masalah.

muru
sumber

Jawaban:

17

Saya pengelola Vim saat ini untuk Debian dan orang yang dikutip dalam diskusi milis referensi.

Seperti yang Anda katakan, ini bukan pertanyaan tentang Vim. Ini tentang membangun perangkat lunak yang ditautkan oleh Vim dengan cara yang memenuhi kebutuhan Anda. Ada diskusi yang lebih menyeluruh (setidaknya untuk aspek Debian) dari masalah dalam bug yang meminta Python3 diaktifkan dalam kemasan Vim Debian.

Ini intinya

  • Kemasan Python Debian tidak menautkan ekstensi Python terhadap pustaka bersama libpython yang relevan. Inilah yang menyebabkan kemasan Vim Debian perlu menggunakan RTLD_GLOBALsaat menggunakan dlopen()untuk memuat secara dinamis binding bahasa Python.

  • Tidak ada cara yang baik untuk mengekspresikan hubungan antara paket-paket Vim dan pustaka-pustaka yang dimuat secara dinamis untuk memastikan mereka ditingkatkan bersama-sama bila perlu. Bahkan jika titik pertama diselesaikan, masalah ini masih akan mencegah saya mengaktifkan pemuatan dinamis dukungan Python.

    Titik utama memuat dukungan bahasa secara dinamis di Vim adalah untuk tidak mengharuskan pengguna menginstal perpustakaan yang tidak akan mereka gunakan. Ini berarti kemasan Vim tidak dapat menentukan ketergantungan keras pada versi minimum perpustakaan.

    Oleh karena itu, jika Vim dibangun terhadap versi perpustakaan yang lebih baru yang tidak kompatibel dengan versi yang lebih lama dan pengguna tidak memutakhirkannya bersama-sama, Vim akan macet. Ini bukan sesuatu yang saya ingin para pengguna paket temui.

Saya ingin mengaktifkan kembali (tersedia untuk waktu yang singkat pada 2010-2011) pemuatan dinamis dukungan bahasa, tetapi masalah di atas harus diselesaikan terlebih dahulu.


Pada versi 2: 7.4.2330-1 , kemasan Debian telah beralih menggunakan Python3 bukannya Python2 untuk binding Python.


Sebagai alternatif, paket neovim mendukung penggunaan kedua Python2 dan Python3 dari proses nvim yang sama, karena dukungan Python disediakan oleh modul eksternal (paket python-neovim dan python3-neovim ). Mengeksternalisasi kode Python, daripada menyematkannya seperti Vim, menghindari masalah berurusan dengan bagaimana libpython dibangun.

jamessan
sumber
"Ini berarti kemasan Vim tidak dapat menentukan ketergantungan keras pada versi minimum perpustakaan." Saya berasumsi itu sebabnya Debian tidak memiliki paket terpisah untuk Vim + Python2 dan Vim + Python3 seperti yang dimiliki Arch Linux?
muru
@muru Python hanya salah satu dari binding bahasa yang tersedia. Menyediakan kombinasi paket untuk berbagai bahasa dan toolkit GUI adalah sejumlah besar paket. Keputusannya adalah untuk mengaktifkan binding bahasa sebanyak yang masuk akal dan membiarkan pilihan berada di antara toolkit GUI (atau tidak). Seorang pengguna tidak harus memilih plugin Vim berdasarkan bahasa yang mereka tulis.
jamessan
Itu bukan argumen nyata, karena hanya Python dan Python3 yang saling bertentangan. Jujur saya pikir Anda harus meminjam lembaran dari buku pengembang Arch. Selain dari umum vim-runtimepaket, mereka memiliki vim, gvim, vim-python3dan gvim-python3. Satu-satunya perbedaan antara -python3paket normal dan adalah versi Python diaktifkan. Tentu, itu menggandakan jumlah paket frontend, tapi itu semua cacat yang saya lihat dalam kemasan tersebut.
muru
Itu untuk Arch. Dalam Debian, ada vim-nox, vim-gtk, vim-gnome, dan vim-athena. Menggandakannya hanya agar pengguna tetap tidak bisa menggunakan plugin Python dan Python3 sepertinya tidak berguna.
jamessan
Saya sedikit ingin tahu mengapa Anda tidak memilih opsi dinamis untuk paket normal.
muru
4

Ubuntu 16.04 sekarang memiliki vim-*-py2paket yang termasuk dalam repo. Ini berarti semua pengguna Debian Vim dapat bermigrasi ke Ubuntu jika diperlukan.

Paket- vim-*paket yang sekarang disediakan +python3, dan binari-binari diberi nama berbeda untuk menghindari konflik:

Dan seterusnya.

dfggdfgdfgdfgdfgdfgdfgdfg
sumber
Jadi, pada 16.04, saya bisa memuat python2 dan python3 dalam sesi Vim yang sama?
muru
@muru tidak, Anda bisa memilih yang mana yang Anda dapatkan dalam sesi yang diberikan dengan lebih mudah;)
hobbs
@ hobbs Saya cukup yakin konflik paket dengan yang python3.
muru
@muru mereka tidak, pada kenyataannya. Anda dapat menginstal dan menjalankan yang mana pun yang Anda pilih, serta memilih yang menjadi vim default Anda. Ini tidak bagus, tapi ini perbaikan.
hobbs
2
Dan sekarang dengan 17,04, dukungan Python 2 dan paket Vim yang relevan telah dibatalkan
muru