Python, Development, Tools

Bỏ Pip & Virtualenv: Gặp UV, Quy trình làm việc Python Siêu Tốc Mới Của Bạn

Khám phá UV, trình quản lý gói và dự án Python được viết bằng Rust, nhanh hơn tới 100 lần và đơn giản hóa đáng kể quy trình phát triển của bạn.

Vẫn đang xoay sở với pip install, requirements.txt, và kích hoạt môi trường ảo thủ công? Hãy chuẩn bị cho một nâng cấp lớn. Bài viết này giới thiệu UV, một công cụ tất-cả-trong-một mang tính cách mạng, sẵn sàng thay thế quy trình làm việc Python truyền thống của bạn. Nếu bạn viết bất kỳ mã Pytho...…
Bỏ Pip & Virtualenv: Gặp UV, Quy trình làm việc Python Siêu Tốc Mới Của Bạn
<a href="http://www.youtube.com/@TechWithTim">Tech With Tim</a> Tech With Tim Follow

Vẫn đang xoay sở với pip install, requirements.txt, và kích hoạt môi trường ảo thủ công? Hãy chuẩn bị cho một nâng cấp lớn. Bài viết này giới thiệu UV, một công cụ tất-cả-trong-một mang tính cách mạng, sẵn sàng thay thế quy trình làm việc Python truyền thống của bạn. Nếu bạn viết bất kỳ mã Python nào và khao khát tốc độ cũng như sự đơn giản, bạn sẽ tìm hiểu cách UV tích hợp cài đặt gói, quản lý môi trường và thậm chí xử lý phiên bản Python vào một giao diện dòng lệnh duy nhất, nhanh như chớp.

Nếu bạn vẫn đang sử dụng pip hoặc tự tạo môi trường ảo theo cách thủ công, thì bạn cần đọc bài viết này. Chỉ trong vài phút, tôi sẽ giới thiệu một công cụ có thể thay đổi hoàn toàn cuộc sống của bạn nếu bạn viết bất kỳ mã nào bằng Python. Công cụ đó là UV, một trình quản lý gói và dự án Python nhanh hơn gấp gần 100 lần so với pip trong một số tình huống nhất định.

Vâng, bạn không nghe nhầm đâu. Bạn có thể xem ví dụ tại đây từ [trang web của UV][1].

UV hợp nhất các tác vụ như quản lý môi trường ảo và cài đặt các dependency (phụ thuộc - thường được xử lý bởi pip) vào một công cụ liền mạch duy nhất. Bạn sẽ thấy cách nó hoạt động, và tôi hứa với bạn rằng nó tốt hơn đáng kể so với việc xoay sở thủ công với các môi trường ảo, tệp requirements.txtpip install. Sau khi tìm hiểu về UV, nó có thể trở thành công cụ duy nhất bạn sử dụng từ bây giờ.

Cài đặt & Thiết lập UV

Đầu tiên, hãy cài đặt UV. Bạn có thể tìm thấy hướng dẫn cài đặt chi tiết trong [tài liệu chính thức][2].

  • Mac/Linux: Sử dụng curl hoặc wget:
    # Sử dụng curl
    curl -LsSf https://astral.sh/uv/install.sh | sh
  • Windows: Sử dụng PowerShell:
    irm https://astral.sh/uv/install.ps1 | iex
  • Sử dụng Pip (Đa nền tảng): Nếu bạn thích sử dụng pip (hoặc pip3 tùy thuộc vào hệ thống của bạn):
    pip install uv
    # hoặc
    pip3 install uv

Sau khi cài đặt, hãy khởi động lại terminal của bạn. Để xác minh cài đặt, chỉ cần gõ:

uv

Nếu bạn thấy đầu ra liệt kê các lệnh UV khác nhau, bạn đã sẵn sàng! [Tài liệu UV][2] rất tuyệt vời, nhưng hướng dẫn này sẽ giúp làm rõ những điều cơ bản và giúp bạn bắt đầu nhanh chóng.

Quản lý phiên bản Python với UV

Một trong những tính năng mạnh mẽ của UV là khả năng quản lý trực tiếp các bản cài đặt Python.

  • Liệt kê các phiên bản có sẵn/đã cài đặt: Xem phiên bản Python nào UV biết và phiên bản nào bạn đã tải xuống.

    uv python list

    Lưu ý: UV hoạt động với Python 3.8 trở lên.

  • Cài đặt một phiên bản cụ thể: Tải xuống và cài đặt một phiên bản Python (ví dụ: 3.8).

    uv python install 3.8

    Hãy chú ý tốc độ đáng kinh ngạc của nó! UV được viết bằng Rust và được tối ưu hóa rất nhiều.

  • Tìm một phiên bản đã cài đặt: Xác định vị trí một phiên bản đã cài đặt cụ thể.

    uv python find 3.8
  • Gỡ cài đặt một phiên bản: Xóa một phiên bản Python đã cài đặt trước đó.

    uv python uninstall <version_identifier>

Sử dụng UV cho các Script đơn lẻ

UV đơn giản hóa việc chạy các script Python độc lập, đặc biệt là những script có các dependency hoặc yêu cầu phiên bản Python cụ thể.

Hãy bắt đầu với một main.py đơn giản:

# main.py
import sys
print(sys.version)
  • Chạy một script: Thực thi script bằng Python mặc định được tìm thấy bởi UV.

    uv run main.py
  • Chạy với một phiên bản Python cụ thể: Sử dụng cờ --python.

    uv run --python 3.9 main.py
    # Hoặc cụ thể hơn
    uv run --python 3.9.21 main.py

    UV sẽ sử dụng phiên bản được chỉ định (nếu đã cài đặt). Không cần chuyển đổi môi trường thủ công!

  • Chạy với các dependency tạm thời: Điều gì sẽ xảy ra nếu script của bạn cần các gói như rich hoặc requests?

    # main.py (đã cập nhật)
    from rich import print
    import requests
    
    print("Hello from [bold magenta]Rich![/bold magenta]")
    # ... phần còn lại của script sử dụng requests ...

    Thay vì tạo môi trường và cài đặt, hãy sử dụng cờ --with. UV xử lý tạm thời cho lần chạy đó:

    uv run --python 3.9 --with rich --with requests main.py

    UV tự động cài đặt các gói cần thiết (và lưu vào bộ nhớ đệm) trước khi chạy script của bạn. Điều này hoàn hảo cho các script đơn giản mà không cần thiết lập dự án đầy đủ.

Nhúng cấu hình vào Script

Việc gõ --python--with lặp đi lặp lại có thể tẻ nhạt. UV cho phép bạn nhúng cấu hình này trực tiếp vào tệp script của mình bằng cách sử dụng một khối chú thích đặc biệt.

  • Khởi tạo cấu hình script: Thêm các yêu cầu về phiên bản Python.

    uv init --script main.py --python 3.9.21

    Thao tác này sẽ thêm khối sau vào đầu main.py:

    # /// script
    # requires-python = ">=3.9.21"
    # ///
    
    # Mã script của bạn ở dưới đây
    import sys
    print(sys.version)

    Bạn có thể sử dụng các bộ chỉ định phiên bản như >= hoặc ghim một phiên bản chính xác bằng ==.

  • Thêm các dependency vào cấu hình script: Sử dụng uv add --script.

    uv add --script main.py rich
    uv add --script main.py requests

    Thao tác này cập nhật phần đầu của script:

    # /// script
    # requires-python = ">=3.9.21"
    # dependencies = [
    #  "rich",
    #  "requests"
    # ]
    # ///
    
    # Mã script của bạn ở dưới đây
    from rich import print
    import requests
    # ...

    Bây giờ, chỉ cần chạy uv run main.py sẽ tự động đảm bảo phiên bản Python chính xác được sử dụng và các dependency được liệt kê có sẵn (được cài đặt/lưu vào bộ nhớ đệm nếu cần) trước khi thực thi.

Sử dụng UV cho các Dự án Python

Đối với các dự án lớn hơn, UV cung cấp khả năng quản lý dự án mạnh mẽ, thay thế việc tạo môi trường ảo thủ công và các tệp requirements.txt.

  • Khởi tạo một dự án: Điều hướng đến thư mục dự án của bạn và chạy:

    uv init

    Thao tác này thiết lập một cấu trúc dự án tiêu chuẩn:

    • .gitignore: Tệp bỏ qua Git tiêu chuẩn.
    • .python-version: Chỉ định phiên bản Python của dự án (ví dụ: 3.10).
    • main.py: Một điểm vào mẫu.
    • pyproject.toml: Tệp cấu hình trung tâm cho siêu dữ liệu và các dependency (tiêu chuẩn PEP 621).
    • README.md: Tài liệu dự án.
    • .venv: Một thư mục ẩn chứa môi trường ảo do UV quản lý.

    Mẹo: Chạy uv init <directory_name> sẽ tạo các tệp này bên trong một thư mục con mới có tên <directory_name>.

  • Tệp pyproject.toml: Tệp này là chìa khóa. Nó có cấu trúc tốt hơn requirements.txt và chứa thông tin chi tiết về dự án cũng như các dependency.

    [project]
    name = "your-project-name"
    version = "0.1.0"
    description = "Add your description here."
    readme = "README.md"
    requires-python = ">=3.10" # Được định nghĩa bởi uv init
    license = { file = "LICENSE" }
    
    dependencies = [
        # Các dependency được thêm qua 'uv add' sẽ xuất hiện ở đây
    ]
    
    [build-system]
    requires = ["hatchling"]
    build-backend = "hatchling.build"
  • Thêm các dependency: Sử dụng uv add.

    uv add requests
    uv add "fastapi[all]" # Thêm các thành phần phụ (extras)

    UV giải quyết các dependency, cài đặt chúng cực kỳ nhanh chóng vào .venv, và cập nhật danh sách dependencies trong pyproject.toml với các bộ chỉ định phiên bản phù hợp.

  • Xóa các dependency: Sử dụng uv remove.

    uv remove requests

    Thao tác này gỡ cài đặt gói khỏi .venv và xóa nó khỏi pyproject.toml.

  • Tệp uv.lock: Khi bạn sửa đổi các dependency (uv add, uv remove, uv sync), UV sẽ tạo hoặc cập nhật tệp uv.lock. Tương tự như package-lock.json (Node.js) hoặc poetry.lock (Poetry), tệp này ghi lại các phiên bản chính xác của tất cả các gói đã cài đặt, bao gồm cả các dependency gián tiếp (transitive dependencies).

    Quan trọng: Commit tệp uv.lock vào hệ thống quản lý phiên bản của bạn (ví dụ: Git). Điều này đảm bảo rằng các nhà phát triển khác hoặc hệ thống CI/CD có thể chạy uv sync để tạo lại môi trường giống hệt, đảm bảo các bản dựng có thể tái tạo (reproducible builds).

  • Đồng bộ hóa môi trường: Lệnh uv sync đảm bảo .venv của bạn khớp với trạng thái được định nghĩa trong pyproject.tomluv.lock.

    # Cài đặt các gói từ lockfile / pyproject.toml vào .venv
    uv sync 

    UV thường chạy sync một cách ngầm định. Ví dụ, nếu bạn chỉnh sửa thủ công pyproject.toml (ví dụ: thêm pygame) và sau đó chạy uv run main.py, UV sẽ phát hiện thay đổi, đồng bộ hóa môi trường (cài đặt pygame), rồi chạy script của bạn. Bạn cũng có thể chạy uv sync thủ công sau khi kéo các thay đổi hoặc sửa đổi trực tiếp pyproject.toml.

  • Khóa các dependency: Nếu bạn chỉ muốn cập nhật tệp khóa mà không nhất thiết phải cài đặt, hãy sử dụng uv lock.

    uv lock
  • Xử lý xung đột phiên bản: Đôi khi, việc thêm một gói có thể xung đột với yêu cầu phiên bản Python của bạn. Ví dụ: thử uv add tensorflow trong một dự án yêu cầu Python 3.13 (nếu TensorFlow chưa hỗ trợ nó) sẽ thất bại.

    1. Điều chỉnh phiên bản Python: Chỉnh sửa pyproject.toml (ví dụ: requires-python = ">=3.10, <3.12") và tệp .python-version (ví dụ: đặt nội dung thành 3.10).
    2. Thử thêm lại: Chạy lại uv add tensorflow. UV sẽ phát hiện thay đổi Python, điều chỉnh môi trường và thử cài đặt.
  • Chạy mã dự án: Sau khi các dependency được thiết lập, hãy chạy mã của bạn bằng môi trường được quản lý:

    uv run main.py
    # Hoặc chạy các lệnh/module được cài đặt trong venv
    uv run python -m pytest 

Kết luận

UV mang lại một bước tiến đáng kể cho các nhà phát triển Python. Bằng cách thống nhất quản lý gói, môi trường ảo và thậm chí cả cài đặt phiên bản Python vào một công cụ duy nhất, siêu tốc được xây dựng bằng Rust, nó đơn giản hóa đáng kể quy trình làm việc cho cả các script đơn giản và các dự án phức tạp. Khả năng tương thích của nó với pyproject.toml phù hợp với các tiêu chuẩn Python hiện đại, trong khi các tính năng như đồng bộ hóa môi trường tự động và tệp khóa (lock files) giúp tăng cường khả năng tái tạo và cộng tác.

Nếu bạn đang tìm cách tăng tốc quá trình phát triển và giảm độ phức tạp của công cụ, hãy thử dùng UV. Bạn có thể sẽ thấy khó quay lại cách làm cũ!


Tài nguyên:

[1]: Trang chủ & Điểm chuẩn UV [2]: Tài liệu UV