Tools

uv: một công cụ thay pip, venv, pyenv, pipx cho Python, nhanh hơn nhiều lần

Tóm tắt

uv của Astral thay pyenv, venv, pip, pip-tools, pipx bằng một lệnh, theo README nhanh hơn pip 10–100 lần. Dùng uv init, uv add, uv run, uvx; commit uv.lock và chạy uv sync --locked trong CI.

Bắt đầu một project Python từng cần cả chục công cụ: pyenv để cài phiên bản Python, virtualenv để tạo môi trường, pip để cài gói, pip-tools hoặc Poetry để khoá phiên bản, pipx để cài công cụ dòng lệnh. Mỗi công cụ một cách dùng, và cài dependency cho project lớn có thể mất vài phút. uv của Astral, viết bằng Rust, thay thế cả bộ đó bằng một lệnh duy nhất, và theo README nhanh hơn pip từ 10 đến 100 lần.

Trang GitHub của astral-sh/uv
Trang GitHub của astral-sh/uv (ảnh chụp tháng 11/2026)

GitHub: https://github.com/astral-sh/uv · khoảng 91 nghìn sao · Rust · Apache-2.0/MIT

Cài đặt

# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# Hoặc
pipx install uv     # pip install uv
brew install uv

Quản lý project

uv init my-api          # tạo project: pyproject.toml, .python-version, main.py
cd my-api
uv add fastapi uvicorn  # thêm dependency, cập nhật pyproject.toml và uv.lock
uv add --dev pytest     # dependency cho phát triển
uv run main.py          # chạy trong môi trường của project (tự tạo .venv nếu chưa có)
uv run pytest
uv sync                 # cài đúng theo uv.lock, ví dụ sau khi clone repo
uv lock --upgrade       # nâng cấp phiên bản trong lock file
uv remove uvicorn

Bạn không cần "activate" virtualenv: uv run luôn chạy trong môi trường đúng của project và tự đồng bộ dependency trước khi chạy.

uv thay thế những gì?

Trước đâyVới uv
pyenv install 3.12uv python install 3.12
python -m venv .venvuv venv
pip install -r requirements.txtuv pip install -r requirements.txt
pip-compile, poetry lockuv lock
pipx install ruffuv tool install ruff
pipx run black .uvx black .

Giao diện uv pip tương thích với lệnh pip quen thuộc, nên có thể chuyển dần project cũ mà không phải đổi cấu trúc ngay.

Script một file có dependency

uv hỗ trợ khai báo dependency ngay trong đầu file script (inline metadata):

uv init --script fetch.py
uv add --script fetch.py requests rich
uv run fetch.py        # uv tự tạo môi trường tạm với requests, rich

Rất hợp cho script tiện ích chia sẻ trong team: gửi một file là chạy được, không cần hướng dẫn cài đặt.

Lưu ý

  • Commit cả pyproject.toml và uv.lock; trong CI dùng uv sync --locked để báo lỗi nếu lock file lệch với khai báo.
  • Python do uv cài nằm trong thư mục riêng của uv, không đụng tới Python hệ thống.
  • Với project Poetry hay pip-tools đang chạy ổn, chuyển đổi nên làm theo từng bước và kiểm tra lại phiên bản dependency sau khi lock.

Áp dụng thế nào?

  • Dev: Dùng uv init cho project mới, uvx để chạy công cụ một lần, và uv run thay cho việc activate venv.
  • Tech Lead: Thống nhất uv cho cả team và CI: một công cụ, một lock file, cài nhanh hơn đáng kể nên pipeline ngắn lại.
  • PM: Thời gian setup môi trường Python của dev mới giảm từ "một buổi" xuống vài lệnh; CI nhanh hơn cũng là tiền tiết kiệm được.

Nguồn & tham khảo

  1. astral-sh/uv — astral-sh (GitHub)
  2. uv documentation — astral-sh