19 điểm bởi GN⁺ 2024-03-26 | 7 bình luận | Chia sẻ qua WhatsApp
  • Giúp chuyển đổi dễ dàng giữa nhiều phiên bản Python
  • Tuân theo triết lý công cụ UNIX truyền thống: đơn giản, không phô trương và hoạt động tốt cho một mục đích duy nhất
  • Dự án này được tách nhánh từ rbenv và ruby-build rồi chỉnh sửa cho phù hợp với Python

pyenv làm gì

  • Có thể thay đổi phiên bản Python toàn cục theo từng người dùng.
  • Hỗ trợ phiên bản Python theo từng dự án.
  • Có thể ghi đè phiên bản Python bằng biến môi trường.
  • Có thể tìm kiếm lệnh Python của nhiều phiên bản cùng lúc. Hữu ích khi dùng tox để kiểm thử giữa các phiên bản Python.

pyenv không làm gì...

  • Không phụ thuộc vào chính Python. pyenv được tạo bằng shell script thuần.
  • Không cần được nạp vào shell. Thay vào đó, nó dùng cách tiếp cận shim bằng cách thêm một thư mục vào PATH.
  • Không quản lý virtualenv. Tất nhiên, người dùng có thể tự tạo virtualenv hoặc dùng pyenv-virtualenv để tự động hóa.

Cách hoạt động

  • pyenv chặn các lệnh Python bằng các tệp thực thi shim được chèn vào PATH, xác định phiên bản Python mà ứng dụng chỉ định, rồi chuyển tiếp lệnh đến bản cài đặt Python tương ứng.

Hiểu về PATH

  • Khi chạy một lệnh như python hoặc pip, hệ điều hành sẽ tìm tệp thực thi có tên đó trong danh sách thư mục nằm trong biến môi trường PATH.

Hiểu về Shims

  • pyenv chèn thư mục shims lên đầu PATH. Thông qua quá trình rehashing, nó duy trì các shim cho mọi lệnh Python của tất cả các phiên bản Python đã cài đặt.

Hiểu về cách chọn phiên bản Python

  • Khi chạy một shim, pyenv sẽ đọc và sử dụng phiên bản Python từ các nguồn sau theo thứ tự:
    1. Biến môi trường PYENV_VERSION (nếu được chỉ định).
    2. Tệp .python-version dành riêng cho ứng dụng trong thư mục hiện tại (nếu có).
    3. Tệp .python-version đầu tiên tìm được khi tìm kiếm qua từng thư mục cha cho đến khi chạm tới thư mục gốc của hệ thống tệp (nếu có).
    4. Tệp toàn cục $(pyenv root)/version.

Tìm vị trí cài đặt Python do Pyenv cung cấp

  • pyenv chuyển tiếp lệnh đến bản cài đặt Python tương ứng theo phiên bản Python mà nó đã xác định.
  • Mỗi phiên bản Python được cài trong thư mục riêng bên dưới $(pyenv root)/versions.

Cách dùng

Cài thêm phiên bản Python

  • Dùng pyenv install để cài thêm các phiên bản Python.

Tự động phân giải sang phiên bản mới nhất

  • Mọi lệnh con của Pyenv, ngoại trừ uninstall, đều tự động phân giải toàn bộ tiền tố sang phiên bản mới nhất.

Phiên bản Python có hỗ trợ mở rộng

  • Có các bản phát hành Python áp dụng bản vá do người dùng cung cấp để bổ sung hỗ trợ trong những môi trường cụ thể.

Chuyển đổi giữa các phiên bản Python

  • Để dùng Python do Pyenv cài đặt, hãy chạy một trong các lệnh sau:
    • pyenv shell
    • pyenv local
    • pyenv global

Gỡ phiên bản Python

  • Theo thời gian, các phiên bản Python sẽ tích lại trong thư mục $(pyenv root)/versions.
  • Để xóa phiên bản Python cũ, dùng pyenv uninstall .

Các tác vụ khác

  • Để xem danh sách mọi lệnh con hiện có, hãy chạy pyenv commands.

Gỡ bỏ pyenv

  • Có thể dễ dàng tạm thời vô hiệu hóa hoặc gỡ Pyenv khỏi hệ thống.

Plugin Pyenv

  • Có thể dùng plugin để mở rộng và tùy biến tính năng của Pyenv theo cách đơn giản, linh hoạt và dễ bảo trì.

Cấu hình nâng cao

  • Có các biến môi trường để kiểm soát hành vi của Pyenv.

Phát triển

  • Mã nguồn của Pyenv được lưu trữ trên GitHub.
  • Chạy kiểm thử bằng Bats.

Ý kiến của GN⁺

  • pyenv là công cụ rất hữu ích để quản lý nhiều phiên bản Python. Đặc biệt phù hợp với các lập trình viên phải dùng các phiên bản Python khác nhau ở nhiều dự án.
  • Công cụ này không phụ thuộc vào chính Python và được cấu thành từ shell script thuần, nên có thể cài đặt và quản lý ngay cả trên hệ thống chưa cài Python.
  • pyenv không trực tiếp quản lý virtualenv, nhưng có thể tự động hóa việc quản lý virtualenv thông qua plugin pyenv-virtualenv, nên khá tiện lợi.
  • Vì việc cài đặt và sử dụng tương đối đơn giản, ngay cả kỹ sư phần mềm mới bắt đầu cần quản lý phiên bản Python cũng có thể dễ dàng tiếp cận.
  • Một công cụ khác cung cấp tính năng tương tự pyenv là conda, đặc biệt được dùng rộng rãi trong lĩnh vực khoa học dữ liệu và machine learning. Vì conda cung cấp cả quản lý gói lẫn quản lý môi trường, nên có thể khuyến nghị cho những người dùng cần các tính năng đó.
  • Khi áp dụng pyenv, cần cẩn thận để tránh xung đột đường dẫn nếu trên hệ thống đã cài nhiều phiên bản Python. Lợi ích của pyenv là giúp quản lý phiên bản dễ dàng hơn, nhưng cấu hình sai có thể làm ảnh hưởng tới đường dẫn Python mặc định của hệ thống.

7 bình luận

 
koxel 2024-03-26

Với conda, cần lưu ý là ở các doanh nghiệp có quy mô nhất định
thì phải trả phí.
Dù công ty nhỏ nhưng nếu quy mô bên đặt hàng lớn thì cũng khá khó để giao hàng.

 
koxel 2024-03-26

Bản thân conda là miễn phí theo giấy phép BSD, nhưng bạn nên xem kỹ giấy phép của kho lưu trữ và các gói.

 
tujuc 2024-03-26

Mình đặt asdf ở mức cao nhất https://asdf-vm.com/

Theo từng project thì cũng có khi cấu hình bằng local, hoặc dùng container...

Dạo này có quá nhiều thứ xuất hiện để dựng + quản lý môi trường mới nên mình cũng không dùng nó nhiều lắm.. haha

 
sngwn 2024-03-26

Tôi cũng dùng đúng kiểu đó.
Haha, cá nhân tôi thấy pyenv có cảm giác hơi lỗi thời.

 
joyfui 2024-03-26

Vì cứ liên tục xuất hiện những thứ như rbenv, pyenv, nodenv nên cuối cùng cả anyenv cũng ra đời. haha
https://github.com/anyenv/anyenv

 
GN⁺ 2024-03-26
Ý kiến trên Hacker News
  • Cảnh báo về việc dùng pyenv

    • pyenv có một nhược điểm lớn là biên dịch Python trên chính máy của người dùng.
    • Có rất nhiều kiểu lỗi có thể phát sinh trong tình huống này.
    • pyenv không phải là công cụ để người mới giải quyết các vấn đề về đóng gói Python, mà là công cụ dành cho chuyên gia để chuẩn hóa cấu hình.
    • Nhiều người dùng đang gặp vấn đề do pyenv gây ra nhưng lại không nhận ra điều đó.
  • Nỗi khổ của lập trình viên Python

    • Ngạc nhiên trước những khó khăn không cần thiết mà các lập trình viên Python phải chịu.
    • Việc phải cài nhiều phiên bản Python là điều phi lý.
    • Ý tưởng rằng chương trình Python có thể chạy ở mọi nơi là không thực tế.
    • Mọi thứ đều mong manh đến mức không thể chạy nếu thiếu đúng phiên bản ngôn ngữ.
    • Vấn đề phụ thuộc nghiêm trọng đến mức cần cả một trình quản lý cho các trình quản lý gói.
  • Các công cụ giúp giữ chương trình Python ổn định

    • Danh sách các công cụ bảo đảm chương trình Python hoạt động giống hệt như khi mới được viết.
    • Có nhiều công cụ như requirements.txt, pip, pipenv, pyenv, virtualenv, v.v.
  • Giới thiệu công cụ Mise

    • Mise được viết bằng Rust, giống asdf nhưng nhanh hơn và mặc định không có shims.
    • Nó cài đặt runtime song song và tải về các plugin cần thiết.
    • Có thể được dùng như một công cụ tốt hơn asdf hoặc pyenv.
  • Ưu điểm của ASDF

    • ASDF không chỉ hỗ trợ Python mà còn hỗ trợ nhiều ngôn ngữ và công cụ khác như Rust, Go, Node.
  • Chia sẻ trải nghiệm dùng pyenv

    • Lúc mới dùng pyenv thì không có vấn đề gì, nhưng sau khi cài nhiều phiên bản Python thì bắt đầu phát sinh lỗi.
    • Thay vì pyenv, việc tải Python từ python.org và quản lý môi trường ảo bằng python<version> -m venv /my/virtual/env sẽ ổn định hơn.
  • Stack quản lý Python cá nhân

    • Dùng pyenv để quản lý phiên bản Python, và dùng venv cho từng dự án để tạo môi trường ảo mới.
    • Dùng Poetry để khởi tạo dự án và quản lý phụ thuộc.
    • Nếu dùng Dropbox thì thêm thư mục .venv vào danh sách bỏ qua.
    • Pyenv hoạt động tốt trên Ubuntu sau khi đã thu thập đủ mọi phụ thuộc cần thiết.
  • Quản lý phụ thuộc runtime bằng Mise

    • Dùng mise để xử lý hầu hết các phụ thuộc runtime như Python, Node, Ruby, Terraform theo cùng một cách.
    • Cũng có thể kích hoạt môi trường ảo Python.
  • Chia sẻ workflow trên macOS

    • Tải các binary Python cần thiết từ python.org và dùng virtualenv để thiết lập môi trường ảo.
    • Quản lý dự án bằng pyproject.toml và pip-compile.
    • Dù không gian quản lý dự án Python đã thay đổi rất nhiều, workflow này vẫn giúp bỏ qua hầu hết mọi chuyện.
 
edunga1 2024-03-26

Có rất nhiều kiểu thất bại có thể xảy ra trong tình huống này.

Đây có vẻ đúng là chỗ đau đớn nhất.