Tracks
Python UV là gì?
UV là một trình quản lý và cài đặt gói Python hiện đại, hiệu năng cao được viết bằng Rust. Đây là lựa chọn thay thế có thể dùng ngay cho các công cụ quản lý gói Python truyền thống như pip, mang lại cải thiện đáng kể về tốc độ, độ tin cậy và khả năng giải quyết phụ thuộc.
Công cụ này đại diện cho thế hệ mới của các trình quản lý gói Python, được thiết kế để giải quyết những điểm đau thường gặp trong hệ sinh thái Python như thời gian cài đặt chậm, xung đột phụ thuộc và sự phức tạp trong quản lý môi trường. UV đạt được điều đó nhờ kiến trúc sáng tạo và triển khai hiệu quả, giúp nhanh hơn 10–100 lần so với các trình quản lý gói truyền thống.
Những tính năng nổi bật khiến UV khác biệt:
- Cài đặt gói và giải quyết phụ thuộc siêu nhanh
- Tương thích với các công cụ và quy trình Python hiện có
- Tích hợp sẵn quản lý môi trường ảo
- Hỗ trợ các tiêu chuẩn đóng gói hiện đại
- Khóa phụ thuộc đáng tin cậy và môi trường có thể tái tạo
- Tiết kiệm bộ nhớ, đặc biệt với các dự án lớn
Dù bạn làm việc với dự án cá nhân nhỏ hay quản lý các ứng dụng Python quy mô lớn, UV mang đến giải pháp quản lý gói mạnh mẽ và hiệu quả. Trong hướng dẫn này, chúng tôi sẽ trình bày mọi khía cạnh cốt lõi của UV để bạn có thể bắt đầu sử dụng ngay.
TL;DR
- UV là trình quản lý gói Python dùng Rust, nhanh hơn pip 10–100 lần
- Cài đặt bằng
curl -LsSf https://astral.sh/uv/install.sh | sh - Khởi tạo dự án với
uv initvà thêm phụ thuộc bằnguv add package - Chạy script với
uv run script.py—không cần kích hoạt môi trường ảo thủ công - UV thay thế pip, virtualenv, pyenv và pip-tools trong một công cụ duy nhất
- Tệp khóa (
uv.lock) đảm bảo môi trường có thể tái tạo trên nhiều máy - Dùng
uvxđể chạy các công cụ CLI nhưblackvàruffmà không cần cài đặt vĩnh viễn
Sự khác nhau giữa UV, Poetry, PIP, Conda và virtualenv
Câu hỏi đầu tiên các lập trình viên thường đặt ra trước khi đổi sang công cụ mới là "So với công cụ tôi đang dùng thì như thế nào?". Trong lĩnh vực quản lý phụ thuộc và dự án Python, bốn công cụ sau đã rất phổ biến:
Hãy so sánh UV với từng công cụ để giúp bạn quyết định UV có phù hợp với nhu cầu của mình không trước khi đi sâu vào chi tiết.
UV so với PIP và virtualenv
PIP và virtualenv là các công cụ truyền thống để quản lý gói và tạo môi trường ảo cho Python. Dù vẫn đáp ứng được nhu cầu, UV mang đến vài lợi thế thuyết phục:
- Tốc độ: Triển khai bằng Rust giúp UV nhanh hơn PIP đáng kể khi cài đặt gói và giải quyết phụ thuộc, thường hoàn tất trong vài giây những tác vụ mà PIP mất vài phút.
- Quản lý môi trường tích hợp: Trong khi
virtualenvchỉ tạo môi trường và PIP chỉ quản lý gói, UV kết hợp cả hai trong một công cụ, giúp quy trình gọn nhẹ hơn.
UV vẫn tương thích hoàn toàn với hệ sinh thái của PIP đồng thời khắc phục các hạn chế chính của nó. UV có thể dùng chung tệp requirements.txt và các chỉ mục gói, giúp việc chuyển đổi mượt mà. Khác biệt chính gồm:
- Hiệu năng: Tải song song và bộ giải phụ thuộc tối ưu khiến UV nhanh hơn PIP 10–100 lần với các dự án lớn.
- Tiêu thụ bộ nhớ: UV dùng ít bộ nhớ hơn đáng kể khi cài đặt gói và giải quyết phụ thuộc.
- Xử lý lỗi: UV cung cấp thông báo lỗi rõ ràng và giải quyết xung đột phụ thuộc tốt hơn.
- Khả năng tái tạo: Cách tiếp cận bằng lockfile của UV đảm bảo môi trường nhất quán giữa các hệ thống, điều mà
requirements.txtcơ bản không đảm bảo.
Dù PIP và virtualenv vẫn khả dụng, kiến trúc hiện đại và chức năng kết hợp của UV khiến đây là lựa chọn hấp dẫn cho các lập trình viên muốn hiệu năng tốt hơn và quy trình gọn nhẹ hơn. Khả năng đưa UV vào dự án hiện có mà không phá vỡ quy trình đã thiết lập đặc biệt hữu ích cho các nhóm muốn hiện đại hóa dần bộ công cụ phát triển Python.
UV so với Conda
Những người không dùng PIP và virtualenv thường chuyển sang Conda và họ có lý do chính đáng:
- Conda cung cấp giải pháp quản lý gói hoàn chỉnh, xử lý không chỉ gói Python mà cả phụ thuộc ở cấp hệ thống
- Nó xuất sắc trong việc quản lý môi trường tính toán khoa học phức tạp với các gói như NumPy, SciPy và TensorFlow
- Môi trường Conda cách ly tốt hơn và có thể tái tạo trên nhiều hệ điều hành
- Hỗ trợ sẵn nhiều phiên bản Python và chuyển đổi dễ dàng
- Bản phân phối Anaconda đi kèm nhiều gói khoa học cài sẵn, thuận tiện cho nhà khoa học dữ liệu
Nhưng ngay cả những người dùng Conda “cốt cán” cũng nên cân nhắc chuyển sang UV vì nhiều lý do. (Để so sánh rộng hơn về công cụ quản lý môi trường, xem Anaconda vs Python: Khám phá khác biệt.) Khả năng cài đặt gói và giải quyết phụ thuộc thần tốc của UV có thể tăng tốc đáng kể quá trình dựng môi trường so với hiệu năng đôi khi ì ạch của Conda. Dấu chân tài nguyên tối thiểu đồng nghĩa với ít bộ nhớ hơn và khởi động nhanh hơn. UV còn tích hợp mượt với các tiêu chuẩn và công cụ đóng gói Python hiện có, giúp làm việc với hệ sinh thái Python rộng lớn dễ dàng hơn. Với các dự án không cần khả năng quản lý gói ngoài Python của Conda, UV mang đến giải pháp gọn nhẹ, hiệu quả hơn có thể cải thiện đáng kể quy trình phát triển.
UV so với Poetry
Tôi dùng Conda gần ba năm nhưng sau khi thử Poetry vài lần, tôi đã không chạm vào Conda “rùa bò” nữa. Khi vừa quen với Poetry, tôi biết đến UV và nó cung cấp gần như cùng khả năng với Poetry:
- Quản lý phụ thuộc: Cả hai đều xử lý phụ thuộc gói và môi trường ảo hiệu quả
- Cấu trúc dự án: Cả hai đều cung cấp công cụ khởi tạo và cấu trúc dự án Python
- Lock file: Cả hai đều tạo lock file để đảm bảo môi trường có thể tái tạo
- Xuất bản gói: Cả hai đều hỗ trợ xuất bản gói lên PyPI
- Công cụ hiện đại: Cả hai đều đại diện cho cách tiếp cận hiện đại đối với quản lý dự án Python
Tuy nhiên, điểm định vị UV là tốc độ “chớp nhoáng” và mức dùng tài nguyên tối thiểu. Dù Poetry đã là bước tiến lớn so với công cụ truyền thống, UV đưa hiệu năng lên tầm khác nhờ triển khai bằng Rust. Ngoài ra, khả năng tương thích với đóng gói Python hiện có giúp UV hoạt động song song với các công cụ như pip, mang lại sự linh hoạt mà cách tiếp cận “có chính kiến” hơn của Poetry đôi khi thiếu.
Dưới đây là bảng tóm tắt các khác biệt vừa nêu:
|
Tính năng |
UV |
PIP + virtualenv |
Conda |
Poetry |
|
Ngôn ngữ triển khai |
Rust |
Python |
Python |
Python |
|
Tốc độ |
Nhanh hơn pip 10–100 lần |
Mốc tham chiếu |
Chậm hơn pip |
Nhanh hơn pip |
|
Mức dùng bộ nhớ |
Rất hiệu quả |
Cao hơn |
Cao |
Vừa phải |
|
Quản lý môi trường |
Tích hợp sẵn |
Cần công cụ riêng |
Tích hợp sẵn |
Tích hợp sẵn |
|
Giải quyết phụ thuộc |
Nhanh, bộ giải hiện đại |
Cơ bản |
Toàn diện |
Bộ giải hiện đại |
|
Gói ngoài Python |
Không |
Không |
Có |
Không |
|
Lock file |
Có |
Không (requirements.txt cơ bản) |
Có |
Có |
|
Cấu trúc dự án |
Có |
Không |
Không |
Có |
|
Xuất bản gói |
Có |
Có (với twine) |
Có |
Có |
|
Tương thích |
Hoạt động với hệ sinh thái pip hiện có |
Công cụ chuẩn của Python |
Hệ sinh thái riêng |
Cách tiếp cận có tính áp đặt hơn |
|
Xử lý lỗi |
Thông điệp lỗi rõ ràng |
Cơ bản |
Tốt |
Tốt |
|
Dấu chân tài nguyên |
Tối thiểu |
Vừa phải |
Nặng |
Vừa phải |
|
Tập trung tính toán khoa học |
Không |
Không |
Có |
Không |
|
Tính nhất quán đa nền tảng |
Có |
Hạn chế |
Xuất sắc |
Tốt |
Nếu bạn thấy UV đáng để chuyển sang, hãy đọc tiếp.
Bắt đầu với UV cho các dự án Python
Phần này trình bày cách bắt đầu một dự án từ đầu bằng UV. Nếu bạn cần hỗ trợ thiết lập môi trường phát triển Python trước, hãy xem hướng dẫn riêng của chúng tôi. Chúng tôi sẽ bàn về cách di trú các dự án hiện có sang UV ở phần sau.
Cài đặt UV
UV có thể cài đặt trên toàn hệ thống bằng cURL trên macOS và Linux:
$ curl -LsSf https://astral.sh/uv/install.sh | sh
Và bằng Powershell trên Windows (hãy đảm bảo bạn chạy Powershell với quyền quản trị):
$ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
UV cũng có sẵn qua Homebrew:
$ brew install uv
Có hỗ trợ cài đặt bằng PIP nhưng không được khuyến nghị:
$ pip install uv # Make sure you have a virtual environment activated
Sau đó, bạn có thể xác minh cài đặt bằng cách chạy uv version:
$ uv version
uv 0.6.14 (2026-03-13)
Cập nhật UV
UV có thể tự cập nhật khi cài đặt qua trình cài đặt độc lập:
$ uv self update
Nếu bạn cài UV qua Homebrew, hãy dùng brew upgrade uv. Bạn cũng có thể bật tự động hoàn tất lệnh shell cho các lệnh UV:
$ echo 'eval "$(uv generate-shell-completion zsh)"' >> ~/.zshrc # For Zsh
$ echo 'eval "$(uv generate-shell-completion bash)"' >> ~/.bashrc # For BashKhởi tạo dự án mới
Làm việc theo dự án là phần cốt lõi của trải nghiệm UV. Bạn bắt đầu bằng cách khởi tạo một dự án trống với lệnh uv init:
$ uv init explore-uv
Initialized project explore-uv at /Users/bexgboost/projects/explore-uv
Lệnh này sẽ ngay lập tức tạo thư mục explore-uv mới với nội dung sau:
$ cd explore-uv
$ tree -a
.
├── .gitignore
├── .python-version
├── README.md
├── hello.py
└── pyproject.toml
Git được khởi tạo tự động và các tệp liên quan như .gitignore và README.md rỗng được tạo. Tệp .python-version chứa phiên bản Python dùng cho dự án, còn pyproject.toml là tệp cấu hình chính cho siêu dữ liệu dự án và phụ thuộc. Một tệp mẫu hello.py cũng được tạo để bạn bắt đầu nhanh chóng.
Bạn có thể tìm hiểu thêm về tạo dự án trong tài liệu của UV.
Thêm các phụ thuộc ban đầu cho dự án
UV kết hợp việc tạo môi trường và cài đặt phụ thuộc vào một lệnh duy nhất - uv add:
$ uv add scikit-learn xgboost
Using CPython 3.9.20 interpreter at: /opt/homebrew/opt/python@3.9/bin/python3.9
Creating virtual environment at: .venv
Resolved 6 packages in 1.78s
⠧ Preparing packages... (2/5)
Prepared 5 packages in 1m 23s
Installed 5 packages in 45ms
+ joblib==1.4.2
+ numpy==2.0.2
+ scikit-learn==1.5.2
...
Lần đầu chạy lệnh add, UV sẽ tạo môi trường ảo mới trong thư mục làm việc hiện tại và cài đặt các phụ thuộc được chỉ định. Những lần sau, UV sẽ tái sử dụng môi trường ảo hiện có và chỉ cài hoặc cập nhật các gói mới yêu cầu, đảm bảo quản lý phụ thuộc hiệu quả.
Một quá trình quan trọng khác diễn ra mỗi lần dùng add là giải quyết phụ thuộc. UV dùng bộ giải phụ thuộc hiện đại, phân tích toàn bộ đồ thị phụ thuộc để tìm tập phiên bản gói tương thích thỏa mọi yêu cầu. Điều này giúp ngăn xung đột phiên bản và đảm bảo môi trường có thể tái tạo. Bộ giải xem xét các yếu tố như ràng buộc phiên bản, tương thích phiên bản Python và yêu cầu đặc thù nền tảng để xác định tập gói tối ưu để cài đặt.
UV cũng cập nhật tệp pyproject.toml và uv.lock sau mỗi lệnh add. Đây là nội dung tệp TOML sau khi cài Scikit-learn và XGBoost:
$ cat pyproject.toml
[project]
name = "explore-uv"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.9"
dependencies = [
"scikit-learn>=1.5.2",
"xgboost>=2.0.3",
]
Để gỡ một phụ thuộc khỏi môi trường và khỏi tệp pyproject.toml, bạn có thể dùng lệnh uv remove. Lệnh sẽ gỡ gói và toàn bộ phụ thuộc con của nó:
$ uv remove scikit-learn
Chúng ta sẽ bàn chi tiết về quản lý phụ thuộc ở phần sau.
Chạy script Python với UV
Sau khi cài các phụ thuộc cần thiết, bạn có thể bắt đầu viết script Python như thường lệ. Nếu bạn dùng VS Code, hãy xem hướng dẫn về thiết lập VS Code cho Python. UV cung cấp vài cách để chạy mã Python:
Để chạy trực tiếp một script Python, bạn có thể dùng lệnh uv run theo sau là tên script thay vì cú pháp quen thuộc python script.py:
$ uv run hello.py
Lệnh run đảm bảo script được thực thi trong môi trường ảo do UV tạo cho dự án.
Chạy script với phụ thuộc inline (PEP 723)
UV hỗ trợ metadata script inline theo PEP 723, cho phép bạn khai báo phụ thuộc ngay trong script Python. Điều này hữu ích cho các script độc lập cần gói mà không phải thiết lập dự án đầy đủ:
# /// script
# requires-python = ">=3.11"
# dependencies = [
# "requests",
# "rich",
# ]
# ///
import requests
from rich.console import Console
console = Console()
response = requests.get("https://api.github.com")
console.print(f"GitHub API status: [bold green]{response.status_code}[/bold green]")
Chạy script bằng uv run, và UV sẽ tự động tạo một môi trường cách ly với các phụ thuộc đã khai báo:
$ uv run script.py
GitHub API status: 200
Điều này đặc biệt mạnh mẽ khi chia sẻ script có thể tái tạo với đồng nghiệp—bất kỳ ai cài UV đều có thể chạy script mà không cần cài đặt phụ thuộc thủ công.
Quản lý phiên bản Python trong UV
Quản lý phiên bản Python là phần quan trọng của quản lý phụ thuộc. UV cung cấp các lệnh đơn giản để kiểm soát phiên bản Python bạn dùng. Hãy cùng tìm hiểu lệnh uv python.
Cài đặt phiên bản Python với UV
UV có thể cài đặt và quản lý trực tiếp các phiên bản Python, thay thế nhu cầu dùng các công cụ như pyenv:
$ uv python install 3.12
$ uv python install 3.11 3.13 # Install multiple versions at once
Các bản cài đặt Python được lưu ở ~/.local/share/uv/python/ và không làm ảnh hưởng đến Python của hệ thống. Bạn cũng có thể “ghim” dự án vào một phiên bản Python cụ thể:
$ uv python pin 3.12
Điều này sẽ cập nhật tệp .python-version trong thư mục dự án. Từ đó UV sẽ dùng phiên bản này cho mọi thao tác của dự án.
Liệt kê các phiên bản Python hiện có
Vì hệ thống thường đã có Python cài sẵn, UV mặc định có thể phát hiện các bản cài đặt này. Ví dụ, để liệt kê tất cả phiên bản Python UV phát hiện trên hệ thống, chạy lệnh sau:
$ uv python list --only-installed
cpython-3.13.0-macos-aarch64-none /opt/homebrew/opt/python@3.13/bin/python3.13 -> ../Frameworks/Python.framework/Versions/3.13/bin/python3.13
cpython-3.12.7-macos-aarch64-none /opt/homebrew/opt/python@3.12/bin/python3.12 -> ../Frameworks/Python.framework/Versions/3.12/bin/python3.12
cpython-3.12.5-macos-aarch64-none /Users/bexgboost/miniforge3/bin/python3.12
cpython-3.12.5-macos-aarch64-none /Users/bexgboost/miniforge3/bin/python3 -> python3.12
cpython-3.12.5-macos-aarch64-none /Users/bexgboost/miniforge3/bin/python -> python3.12
cpython-3.11.10-macos-aarch64-none /opt/homebrew/opt/python@3.11/bin/python3.11 -> ../Frameworks/Python.framework/Versions/3.11/bin/python3.11
cpython-3.11.7-macos-aarch64-none /Users/bexgboost/.local/share/uv/python/cpython-3.11.7-macos-aarch64-none/bin/python3 -> python3.11
cpython-3.10.15-macos-aarch64-none /opt/homebrew/opt/python@3.10/bin/python3.10 -> ../Frameworks/Python.framework/Versions/3.10/bin/python3.10
cpython-3.9.20-macos-aarch64-none /opt/homebrew/opt/python@3.9/bin/python3.9 -> ../Frameworks/Python.framework/Versions/3.9/bin/python3.9
cpython-3.9.6-macos-aarch64-none /Library/Developer/CommandLineTools/usr/bin/python3 -> ../../Library/Frameworks/Python3.framework/Versions/3.9/bin/python3
Lệnh đã phát hiện chính xác các bản Python cài bằng Conda và Brew trên máy tôi.
Đổi phiên bản Python cho dự án hiện tại
Bạn có thể chuyển phiên bản Python cho dự án UV hiện tại bất kỳ lúc nào miễn là phiên bản mới đáp ứng ràng buộc trong tệp pyproject.toml. Ví dụ, tệp sau yêu cầu Python 3.9 trở lên:
...
requires-python = ">=3.9"
Điều này có nghĩa bạn có thể đổi phiên bản Python trong tệp .python-version sang bất kỳ phiên bản nào lớn hơn, như 3.11.7. Sau đó gọi uv sync.
Lệnh sẽ kiểm tra trước các bản Python đã cài. Nếu không tìm thấy phiên bản yêu cầu, UV sẽ tải và cài vào đường dẫn /Users/username/.local/share/uv/python. UV cũng tạo môi trường ảo mới trong thư mục dự án, thay thế môi trường cũ.
Lệnh uv sync xử lý mọi thứ tự động—tạo môi trường ảo mới và cài lại toàn bộ phụ thuộc từ tệp pyproject.toml và uv.lock. Không cần bước cài đặt bổ sung.
Lưu ý đôi khi các lệnh uv có thể báo lỗi Permission Denied. Khi đó, hãy dùng lệnh sudo nếu bạn ở macOS hoặc Linux, hoặc chạy cửa sổ dòng lệnh với quyền quản trị nếu ở Windows. Giải pháp tốt hơn là đổi quyền sở hữu thư mục home của UV về người dùng:
$ sudo chown -R $USER ~/.local/share/uv # macOS or Linux
Để tìm hiểu thêm về quản lý phiên bản Python với UV, hãy tham khảo tài liệu.
UV Tools là gì và cách sử dụng?
Một số gói Python được cung cấp dưới dạng công cụ dòng lệnh như black để định dạng mã, flake8 để lint, pytest để kiểm thử, mypy để kiểm tra kiểu, v.v. UV cung cấp hai giao diện đặc biệt để quản lý các gói này:
1. Dùng uv tool run:
$ uv tool run black hello.py
2. Dùng lệnh ngắn gọn, tiện lợi hơn là uvx:
$ uvx black hello.py
Khi chạy các lệnh này, UV tạo một môi trường ảo tạm thời trong bộ nhớ đệm của nó. Công cụ được yêu cầu sẽ được cài đặt và chạy từ đó. Nói cách khác, bạn có thể dùng công cụ dòng lệnh mà không cần cài chúng vào môi trường ảo của dự án, giúp chạy nhanh hơn và phụ thuộc dự án “sạch” hơn.
Các điểm chính về giao diện chạy công cụ:
- Hoạt động với mọi gói Python cung cấp công cụ dòng lệnh như flake8, mypy, black hoặc pytest
- Các môi trường được lưu đệm sẽ tự động dọn dẹp khi xóa cache của UV
- Môi trường lưu đệm mới sẽ được tạo theo nhu cầu khi cần
- Hoàn hảo cho việc dùng công cụ phát triển không thường xuyên
- Với các công cụ dùng thường xuyên, hãy cài vĩnh viễn bằng
uv tool install:
$ uv tool install ruff
$ uv tool install black
$ ruff check . # Now available directly in PATH
Các công cụ cài vĩnh viễn khả dụng toàn cục qua PATH, mà không làm “ô nhiễm” môi trường ảo của bất kỳ dự án nào. Bạn có thể cập nhật bằng uv tool upgrade ruff và liệt kê tất cả công cụ đã cài bằng uv tool list.
Đọc phần UV Tools trong tài liệu để tìm hiểu thêm về các giao diện này.
Lock file trong UV là gì?
Lock file (uv.lock) là phần thiết yếu của quản lý phụ thuộc trong UV. Khi bạn chạy các lệnh uv add để cài phụ thuộc, UV sẽ tự động tạo và cập nhật tệp uv.lock. Lock file này có vài mục đích quan trọng:
- Ghi lại chính xác phiên bản của tất cả phụ thuộc và phụ thuộc con đã cài.
- Đảm bảo bản dựng có thể tái tạo bằng cách “khóa” phiên bản phụ thuộc trên các môi trường khác nhau.
- Giúp ngăn “địa ngục phụ thuộc” bằng cách duy trì phiên bản gói nhất quán.
- Tăng tốc cài đặt vì UV có thể dùng phiên bản đã khóa thay vì giải phụ thuộc lại.
UV quản lý lock file tự động — bạn không cần chỉnh sửa thủ công. Nên commit lock file vào hệ thống quản lý phiên bản để đảm bảo mọi lập trình viên dùng chung phiên bản phụ thuộc.
Khác biệt giữa Lock file và requirements.txt
Dù cả lock file và requirements.txt đều theo dõi phụ thuộc, chúng có mục đích và trường hợp sử dụng khác nhau. Lock file chứa thông tin chi tiết về phiên bản gói chính xác và toàn bộ cây phụ thuộc, đảm bảo môi trường nhất quán trong phát triển. Requirements.txt thì đơn giản hơn, thường chỉ liệt kê phụ thuộc trực tiếp và được hỗ trợ rộng rãi trong các công cụ Python.
Lock file là thiết yếu trong phát triển để duy trì bản dựng có thể tái tạo và ngăn xung đột phụ thuộc. Requirements.txt phù hợp hơn cho kịch bản triển khai hoặc khi chia sẻ mã với người dùng có thể không dùng UV. Chúng cũng cần thiết để tương thích với các công cụ và dịch vụ không hỗ trợ định dạng lock file của UV.
Bạn có thể duy trì cả hai bằng cách dùng lock file của UV cho phát triển, đồng thời sinh requirements.txt cho triển khai. Để tạo requirements.txt từ lock file của UV, dùng lệnh sau:
$ uv export -o requirements.txt
Lệnh này tạo tệp văn bản với phiên bản đã “gim” dựa trên lock file, giúp dễ chia sẻ phụ thuộc dự án ở định dạng chuẩn trong khi vẫn hưởng lợi từ quản lý phụ thuộc nâng cao của UV trong giai đoạn phát triển.
Bạn có thể tìm hiểu thêm về quản lý lock file trong tài liệu.
Quản lý phụ thuộc nâng cao với UV
Phần này, chúng ta khám phá các phương pháp tinh vi hơn để quản lý phụ thuộc trong UV. Chúng ta sẽ học cách cập nhật phụ thuộc, biến chúng thành tuỳ chọn hoặc gom chúng thành nhóm phụ thuộc.
Cập nhật phụ thuộc
Với các dự án dài hạn, việc cập nhật gói đang dùng là phổ biến để mang lại tính năng mới nhất. Hoặc đôi khi một gói bạn dùng đưa ra thay đổi phá vỡ tương thích và bạn muốn đảm bảo phiên bản đó không bị cài nhầm vào môi trường. Lệnh add có thể dùng lại trong các tình huống này và mọi kịch bản khác khi bạn cần thay đổi ràng buộc hoặc phiên bản của phụ thuộc hiện có.
1. Cài phiên bản mới nhất của một gói:
$ uv add requests
2. Cài một phiên bản cụ thể:
$ uv add "requests==2.1.2"
3. Thay đổi biên ràng buộc của một gói:
$ uv add 'requests<3.0.0'
4. Biến phụ thuộc thành đặc thù nền tảng:
$ uv add 'requests; sys_platform="linux"'
Thêm phụ thuộc tuỳ chọn
Phụ thuộc tuỳ chọn là các gói không bắt buộc cho chức năng cốt lõi của dự án nhưng có thể cần cho các tính năng cụ thể. Ví dụ, Pandas có extra excel và plot để tránh cài các bộ phân tích Excel và matplotlib trừ khi ai đó yêu cầu rõ ràng. Các tùy chọn này thường cài với cú pháp pip install pandas[plot, excel].
Với UV, cú pháp hơi khác. Trước hết, đảm bảo gói Pandas lõi đã được cài:
$ uv add pandas
Sau đó cài kèm các extra tuỳ chọn bằng ký hiệu ngoặc vuông:
$ uv add "pandas[plot,excel]"
Khi đã được giải quyết, chúng sẽ được liệt kê trong pyproject.toml của bạn theo định dạng sau:
[project]
name = "explore-uv"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.9"
dependencies = [
"pandas[plot,excel]>=2.2.3",
"requests>=2.32.3",
]
Nhóm phụ thuộc
Nhóm phụ thuộc cho phép bạn tổ chức phụ thuộc theo nhóm logic, như phụ thuộc phát triển, kiểm thử hoặc tài liệu. Điều này hữu ích để tách biệt phụ thuộc cho sản xuất khỏi phụ thuộc cho phát triển.
Để thêm phụ thuộc vào một nhóm cụ thể, dùng cờ --group:
$ uv add --group group_name package_name
Sau đó, người dùng có thể kiểm soát nhóm nào sẽ cài bằng các thẻ --group, --only-group và --no-group.
Chuyển từ PIP và Virtualenv sang UV
Di trú từ PIP và virtualenv sang UV khá đơn giản vì UV duy trì tương thích với các tiêu chuẩn đóng gói Python hiện có. Dưới đây là hướng dẫn từng bước để quá trình chuyển đổi mượt mà:
1. Chuyển đổi một dự án virtualenv hiện có
Nếu bạn có dự án dùng virtualenv và pip, hãy bắt đầu bằng việc tạo tệp requirements.txt từ môi trường hiện tại nếu bạn chưa có:
$ pip freeze > requirements.txt
Sau đó, tạo dự án UV mới trong cùng thư mục:
$ uv init .
Cuối cùng, cài phụ thuộc từ tệp requirements của bạn:
$ uv pip install -r requirements.txt
2. Thay thế các lệnh pip/virtualenv thường dùng
Dưới đây là tham chiếu nhanh để thay thế các lệnh pip và virtualenv thường dùng bằng lệnh tương đương trong UV:
|
Lệnh pip/virtualenv |
Tương đương trong UV |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sau khi di trú, bạn có thể an tâm xóa thư mục virtualenv cũ và bắt đầu dùng quản lý môi trường ảo của UV. Quá trình chuyển thường rất mượt, và khi cần bạn luôn có thể quay lại các lệnh pip thông qua lớp tương thích pip của UV.
Dùng UV trong CI/CD và Docker
Tốc độ của UV đặc biệt có giá trị trong pipeline CI/CD, nơi cài đặt phụ thuộc diễn ra ở mọi bản dựng. Đây là ví dụ workflow GitHub Actions dùng UV:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
- name: Set up Python
run: uv python install 3.12
- name: Install dependencies
run: uv sync --frozen --dev
- name: Run tests
run: uv run pytest tests/
Cờ --frozen đảm bảo CI dùng đúng các phiên bản trong lock file, và sẽ lỗi nếu lock file lỗi thời. Điều này đảm bảo bản dựng có thể tái tạo.
Tích hợp Docker
UV cũng có thể tăng tốc đáng kể quá trình dựng image Docker:
FROM python:3.12-slim
# Install uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev --no-editable
COPY . .
CMD ["uv", "run", "python", "app.py"]
Bằng cách copy tệp phụ thuộc trước và cài đặt trước khi copy mã nguồn, bạn tận dụng tối đa bộ nhớ đệm lớp của Docker. Việc cài phụ thuộc chỉ chạy lại khi pyproject.toml hoặc uv.lock thay đổi.
Kết luận
UV là bước tiến lớn trong quản lý gói Python, mang đến lựa chọn thay thế hiện đại, nhanh và hiệu quả cho các công cụ truyền thống. Những lợi thế chính gồm:
- Hiệu năng cực nhanh với tốc độ vượt pip 10–100 lần
- Tích hợp liền mạch với các tiêu chuẩn đóng gói Python hiện có
- Quản lý môi trường ảo tích hợp sẵn
- Giải quyết phụ thuộc hiệu quả và hỗ trợ lock file
- Dấu chân bộ nhớ và tài nguyên thấp
Dù bạn khởi động dự án mới hay di trú dự án hiện có, UV cung cấp giải pháp vững chắc có thể cải thiện đáng kể quy trình phát triển Python. Khả năng tương thích với công cụ hiện có khiến đây là lựa chọn dễ dàng cho các lập trình viên muốn hiện đại hóa bộ công cụ mà không làm gián đoạn quy trình hiện tại.
Khi hệ sinh thái Python tiếp tục phát triển, các công cụ như UV cho thấy công nghệ hiện đại như Rust có thể nâng tầm trải nghiệm phát triển đồng thời vẫn giữ sự đơn giản và dễ tiếp cận mà cộng đồng Python trân trọng.
Nếu bạn muốn tìm hiểu thêm về quản lý phụ thuộc hoặc Python nói chung, hãy tham khảo các nguồn bổ sung sau:
- Hướng dẫn Python cho người mới bắt đầu
- Hướng dẫn PIP Python: Cẩm nang dứt điểm
- Khóa học Phát triển gói Python
- Top 9 lựa chọn thay thế Anaconda để quản lý môi trường Python
- Nhà khoa học dữ liệu với Python | Học Python cho khoa học dữ liệu
- Python Poetry: Quản lý môi trường và phụ thuộc hiện đại, hiệu quả
Python UV FAQs
UV có nhanh hơn pip cho quản lý gói Python không?
Có. UV nhanh hơn pip đáng kể, mang lại cải thiện tốc độ 10–100 lần khi cài đặt gói và giải quyết phụ thuộc. Cú hích hiệu năng này đến từ triển khai bằng Rust và khả năng tải song song được tối ưu. Đặc biệt với các dự án lớn, những tác vụ mất hàng phút với pip có thể được UV hoàn tất trong vài giây.
Tôi có thể dùng UV với các tệp requirements.txt của pip hiện có không?
Có. UV hoàn toàn tương thích với các tệp requirements.txt của pip và có thể nhập trực tiếp bằng lệnh uv pip install -r requirements.txt. UV duy trì tương thích với hệ sinh thái đóng gói Python đồng thời cung cấp hiệu năng và tính năng quản lý phụ thuộc tốt hơn.
Ưu điểm của UV so với Poetry và Conda là gì?
UV mang lại nhiều lợi thế so với cả Poetry và Conda:
- Hiệu năng nhanh hơn nhờ triển khai bằng Rust
- Mức dùng bộ nhớ và tài nguyên thấp hơn
- Tương thích tốt hơn với các công cụ Python hiện có
- Quy trình làm việc đơn giản hơn so với Conda
- Cách tiếp cận linh hoạt hơn so với cấu trúc “có chính kiến” của Poetry
Trong khi Conda vượt trội ở quản lý gói ngoài Python và Poetry cung cấp quản lý dự án mạnh mẽ, UV mang lại sự cân bằng tốt nhất giữa tốc độ và tính tương thích.
UV có hỗ trợ môi trường ảo không?
Có. UV tích hợp sẵn quản lý môi trường ảo. Khi bạn chạy uv add lần đầu trong một dự án, UV sẽ tự động tạo môi trường ảo và quản lý cho bạn. UV kết hợp việc tạo môi trường và quản lý gói trong một công cụ, giúp quy trình phát triển Python gọn nhẹ hơn so với dùng riêng lẻ pip và virtualenv.
Tôi là người sáng tạo nội dung về khoa học dữ liệu với hơn 2 năm kinh nghiệm và là một trong những tài khoản có lượng theo dõi lớn nhất trên Medium. Tôi thích viết các bài chuyên sâu về AI và ML với chút giọng điệu mỉa mai, vì bạn cũng phải làm gì đó để chúng bớt nhàm chán. Tôi đã xuất bản hơn 130 bài viết và một khóa học trên DataCamp, và đang ấp ủ thêm một khóa nữa. Nội dung của tôi đã tiếp cận hơn 5 triệu lượt xem, trong đó có 20 nghìn người trở thành người theo dõi trên cả Medium và LinkedIn.
