Nỗi đau mang tên “Dependency Management” trong Python
Nếu bạn đã từng phát cáu vì cảnh ngồi chờ pip install chạy mòn mỏi hoặc đau đầu vì xung đột package, bạn không đơn độc. Bản thân mình dùng Python làm công cụ automation hàng ngày, từ script deploy đến cảnh báo giám sát. Việc setup môi trường nhanh và ổn định luôn là ưu tiên hàng đầu.
Trước đây, mình thường loay hoay giữa pip (quá sơ sài), pipenv (chậm chạp) hay poetry (khá tốt nhưng cài đặt rườm rà). Mọi thứ thay đổi hoàn toàn khi mình va phải uv. Được phát triển bởi Astral (nhóm đứng sau linter Ruff siêu tốc), uv không chỉ là package manager. Nó là một bộ công cụ thay thế toàn diện cho pip, poetry, và cả pyenv.
So sánh các phương pháp quản lý dự án Python
Hãy nhìn vào thực tế để thấy tại sao uv lại khiến giới mộ điệu Python phát cuồng:
- Pip + Requirements.txt: Cách cổ điển nhất. Ưu điểm là có sẵn, nhưng lại thiếu quản lý phiên bản Python và không có lockfile để đảm bảo môi trường đồng nhất.
- Poetry / PDM: Hiện đại với file
pyproject.tomlvà cơ chế lock chặt chẽ. Tuy nhiên, Poetry đôi khi resolve dependency rất lâu, thậm chí mất vài phút chỉ để kiểm tra các phiên bản package. - Conda: Thường dùng cho Data Science. Mạnh mẽ nhưng cực kỳ nặng nề, đôi khi chiếm hàng GB dung lượng ổ cứng chỉ cho vài môi trường ảo.
- uv: Viết bằng Rust, tốc độ nhanh hơn pip từ 10-100 lần. Nó gộp mọi thứ: cài Python, quản lý virtualenv và package vào duy nhất một file binary chỉ vài MB.
Ưu và nhược điểm thực tế của uv
Điểm ăn tiền nhất
Tốc độ là thứ khiến bạn choáng ngợp. uv sử dụng cơ chế caching thông minh theo kiểu “global link”. Thử tưởng tượng: bạn vừa cài pandas ở dự án A mất 10 giây. Khi sang dự án B cần dùng lại, uv sẽ link ngay lập tức từ cache, tốn đúng 0.1 giây.
Về khoản quản lý Python, bạn có thể xóa luôn pyenv cho nhẹ máy. Chỉ với một lệnh, uv sẽ tự tải đúng bản Python 3.12 hay 3.13 tùy ý. Đặc biệt, nó tuân thủ chuẩn PEP 621, giúp việc chuyển đổi từ các công cụ khác sang cực kỳ êm ái.
Hạn chế cần cân nhắc
Dù rất mạnh nhưng uv vẫn đang trong giai đoạn phát triển nóng. Một số tính năng đặc thù của Poetry như quản lý plugin hoặc cấu hình build package quá chuyên sâu có thể chưa đầy đủ. Tuy nhiên, với 90% nhu cầu web, automation hay cào dữ liệu, uv đã là quá dư dùng.
Tại sao mình chọn uv cho mọi dự án mới?
Lý do rất đơn giản: Tiết kiệm thời gian. Với các dự án automation, mình cần môi trường sẵn sàng trong 30 giây thay vì 5 phút. uv loại bỏ mọi bước rườm rà. Bạn không cần nhớ cách activate virtualenv thủ công hay quản lý đường dẫn Python lằng nhằng nữa.
Hướng dẫn triển khai uv từ A đến Z
Dưới đây là cách mình thường dùng uv để quản lý một project thực tế.
1. Cài đặt thần tốc
Vì là file binary độc lập, việc cài đặt diễn ra trong nháy mắt:
# Linux hoặc macOS
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (Powershell)
powershell -ExecutionPolicy ByPass -c "ir https://astral.sh/uv/install.ps1 | iex"
Gõ uv --version để chắc chắn mọi thứ đã sẵn sàng.
2. Khởi tạo dự án
Thay vì tạo folder và venv thủ công, hãy dùng lệnh:
uv init my-project
cd my-project
Hệ thống sẽ tự tạo cấu trúc chuẩn với file pyproject.toml để bạn bắt đầu ngay.
3. Quản lý phiên bản Python
Dự án cần Python 3.12 nhưng máy bạn chỉ có 3.10? Đừng lo:
uv python install 3.12
uv python pin 3.12
uv tự cô lập các phiên bản này, tuyệt đối không làm rối loạn Python của hệ điều hành.
4. Thêm thư viện (Dependency)
Cài đặt requests để làm web scraping:
uv add requests
uv sẽ tự tạo virtualenv, cài package và cập nhật uv.lock trong chớp mắt. Tốc độ này thực sự gây nghiện.
5. Chạy code không cần Activate
Quên lệnh source venv/bin/activate đi. Hãy dùng uv run:
uv run hello.py
Cách này cực kỳ hữu ích khi bạn chạy script qua Cronjob hoặc trong Docker vì uv tự biết phải dùng đúng môi trường của dự án.
6. Script đơn lẻ cực tiện lợi
Nếu bạn chỉ có một file script cần thư viện ngoài, uv cho phép khai báo dependency ngay trong file (theo chuẩn PEP 723):
# script.py
# /// script
# dependencies = ["requests"]
# ///
import requests
print(requests.get("https://itfromzero.com").status_code)
Chỉ cần chạy uv run script.py, uv sẽ tự lo phần cài thư viện tạm thời để thực thi script đó luôn.
Mẹo nhỏ để tối ưu hiệu suất
Từ ngày chuyển sang uv, mình đã alias pip thành uv pip trong file .bashrc để tận dụng tốc độ của Rust cho các lệnh cũ:
alias pip='uv pip'
Nếu bạn đang có sẵn file requirements.txt, hãy thử uv pip install -r requirements.txt. Bạn sẽ thấy sự khác biệt về tốc độ chỉ sau vài giây.
Hãy dành 15 phút vọc vạch uv, mình tin bạn sẽ không bao giờ muốn quay lại thời đại của pip hay poetry nữa. Nếu gặp lỗi gì khi cài đặt, cứ để lại bình luận nhé!

