Làm cách nào để Vim có thể chạy cả python và python3 trên hệ thống Linux trong cùng một phiên?


28

Trên các hệ thống Linux, Vim đóng gói thường chỉ có một trong hai pythonhoặc python3được bật. Có thể cả hai được bật (sử dụng python/dynpython3/dyn), nhưng trong một phiên, chỉ có thể sử dụng một phiên. Thảo luận về danh sách gửi thư này cho biết :

Nó phụ thuộc vào cách các thư viện Python được xây dựng. Trên các hệ thống dựa trên Debian (vì lý do tôi không nhớ lại), chúng được xây dựng sao cho RTLD_GLOBAL phải được sử dụng để có quyền truy cập vào các biểu tượng. Điều này ngăn tải cả libpython2.x và libpython3.x trong cùng một quy trình.

Có thể làm gì để cho phép tải cả hai trong cùng một phiên?

Các tùy chọn mà tôi có thể thấy:

  • Xây dựng lại các gói Python {2,3} để RTLD_GLOBALkhông cần bất cứ thứ gì có thể.
  • Bằng cách nào đó, thư viện được tải trước đó để được tải xuống (?!) Bởi Vim. (Điều đó thậm chí có thể chứ?)

Đối với bất kỳ chi tiết nào của bản phân phối, giả sử, theo thứ tự tăng dần về tính đặc hiệu:

  • Dựa trên Debian
  • Ubuntu
  • Ubuntu 14.04
  • Hoặc, Arch Linux, nếu một hệ thống dựa trên Debian quá phức tạp.

Lưu ý rằng tôi đã có Vim để xây dựng với hỗ trợ tải động cho cả hai, vì vậy việc xây dựng Vim không phải là vấn đề.

Câu trả lời:


17

Tôi là người duy trì Vim hiện tại cho Debian và là người được trích dẫn trong cuộc thảo luận danh sách gửi thư được tham chiếu.

Như bạn đã nói, đây không phải là một câu hỏi về Vim. Đó là về việc xây dựng phần mềm mà Vim liên kết theo cách đáp ứng nhu cầu của bạn. Có một cuộc thảo luận kỹ lưỡng hơn (ít nhất là về khía cạnh Debian) về vấn đề trong lỗi yêu cầu Python3 được kích hoạt trong bao bì Vim của Debian.

Cái này sôi

  • Bao bì Python của Debian không liên kết các phần mở rộng Python với thư viện chia sẻ libpython có liên quan. Đây là nguyên nhân khiến bao bì Vim của Debian yêu cầu sử dụng RTLD_GLOBALkhi sử dụng dlopen()để tải động các ràng buộc ngôn ngữ Python.

  • Không có cách nào tốt để thể hiện mối quan hệ giữa các gói Vim và các thư viện được tải động để đảm bảo chúng được nâng cấp cùng nhau khi thích hợp. Ngay cả khi điểm đầu tiên được giải quyết, vấn đề này vẫn sẽ ngăn tôi kích hoạt tính năng tải hỗ trợ Python.

    Điểm chính của việc tải động hỗ trợ ngôn ngữ trong Vim là không yêu cầu người dùng cài đặt thư viện mà họ sẽ không sử dụng. Điều này có nghĩa là bao bì Vim không thể chỉ định một phụ thuộc cứng vào phiên bản tối thiểu của thư viện.

    Do đó, nếu Vim được xây dựng dựa trên phiên bản mới hơn của thư viện không tương thích ngược với phiên bản cũ hơn và người dùng không nâng cấp chúng cùng nhau, Vim sẽ gặp sự cố. Đây không phải là điều tôi muốn người dùng của các gói gặp phải.

Tôi muốn có thể kích hoạt lại (nó đã có sẵn trong một thời gian ngắn vào năm 2010-2011) tải hỗ trợ ngôn ngữ động, nhưng các vấn đề trên phải được giải quyết trước tiên.


Kể từ phiên bản 2: 7.4.2330-1 , bao bì của Debian đã chuyển sang sử dụng Python3 thay vì Python2 cho các ràng buộc Python.


Thay vào đó, gói neovim hỗ trợ sử dụng cả Python2 và Python3 từ cùng một quy trình nvim, vì hỗ trợ Python được cung cấp bởi các mô-đun bên ngoài (gói python-neovimpython3-neovim ). Bên ngoài mã Python, thay vì nhúng nó như Vim, sẽ tránh được vấn đề xử lý libpython được xây dựng như thế nào.


"Điều này có nghĩa là bao bì Vim không thể chỉ định sự phụ thuộc cứng vào phiên bản tối thiểu của thư viện." Tôi cho rằng đó là lý do tại sao Debian không có các gói riêng cho Vim + Python2 và Vim + Python3 theo cách Arch Linux có?
muru

@muru Python chỉ là một trong những ràng buộc ngôn ngữ có sẵn. Cung cấp kết hợp các gói cho các ngôn ngữ và bộ công cụ GUI khác nhau là một số lượng lớn các gói. Quyết định là cho phép nhiều ràng buộc ngôn ngữ là hợp lý và để cho sự lựa chọn nằm trong số các bộ công cụ GUI (hoặc không). Người dùng không nên chọn plugin Vim dựa trên ngôn ngữ họ viết.
jamessan

Đó không phải là một đối số thực sự, vì chỉ Python và Python3 xung đột lẫn nhau. Tôi thành thật nghĩ rằng bạn nên mượn một chiếc lá từ cuốn sách của các nhà phát triển Arch. Ngoài một chung vim-runtimegói, họ có vim, gvim, vim-python3gvim-python3. Sự khác biệt duy nhất giữa -python3và các gói thông thường là phiên bản Python được kích hoạt. Chắc chắn, nó tăng gấp đôi số lượng gói frontend, nhưng đó là tất cả các lỗ hổng tôi thấy trong bao bì như vậy.
muru

Đó là cho Arch. Trong Debian, có vim-nox, vim-gtk, vim-gnome, và vim-athena. Nhân đôi những thứ đó để người dùng vẫn không thể sử dụng cả plugin Python và Python3 dường như không đáng giá.
jamessan

Tôi hơi tò mò về lý do tại sao bạn không chọn tùy chọn động cho các gói thông thường.
muru

4

Ubuntu 16.04 hiện có vim-*-py2các gói được bao gồm trong repo. Điều này có nghĩa là tất cả người dùng Debian Vim có thể di chuyển sang Ubuntu nếu cần.

Các vim-*gói trước đây hiện cung cấp +python3và các tệp nhị phân được đặt tên khác nhau để tránh xung đột:

Và như vậy.


Vì vậy, vào ngày 16.04, tôi có thể tải python2 và python3 trong cùng một phiên Vim không?
muru

@muru không, bạn chỉ có thể chọn cái nào bạn nhận được trong một phiên nhất định dễ dàng hơn;)
hobbs

@hobbs Tôi khá chắc chắn các gói xung đột với các python3.
muru

@muru họ không, trên thực tế. Bạn có thể có cả cài đặt và chạy bất cứ cái nào bạn chọn, cũng như chọn một cái để làm vim mặc định của bạn. Nó không tuyệt vời, nhưng đó là một cải tiến.
hobbs

2
Và bây giờ với 17.04, hỗ trợ Python 2 và các gói Vim có liên quan đã bị hủy
muru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.