Skip to main content

Unified Python Project and Package Management

uv เป็นเครื่องมือจัดการ packages สำหรับภาษา Python ที่มีประสิทธิภาพสูงกว่าตัวจัดการแบบเดิมอย่าง pip โดยรวมเอาความสามารถในการจัดการ projects, packages/dependencies และ virtual environment ไว้ในเครื่องมือเดียว ช่วยให้การจัดการ Python project ง่ายขึ้น

tl;dr
$ curl -LsSf https://astral.sh/uv/install.sh | sh
$ uv init hello-world && cd "$_"
$ uv venv --python=3.13
$ source .venv/bin/activate

เหตุผลที่ควรใช้ uv

คุณกำลังปวดหัวกับสิ่งเหล่านี้อยู่ใช่หรือไม่?

  • ต้องจัดการ Python project หลายโปรเจกต์ในเครื่องเดียว แต่ไม่อยากใช้ Docker
  • แต่ละ project ใช้ Python version แตกต่างกัน
  • ต้องการสร้าง package และส่งขึ้น repo ได้ง่าย
  • ต้องการติดตั้ง dependencies ได้เร็วขึ้น
  • ต้องการเครื่องมือที่มีประสิทธิภาพสูง

ถ้าใช่ แสดงว่า uv เป็นเครื่องมือที่เหมาะกับคุณ

จุดเด่นของ uv

  1. จัดการได้ทั้ง project, packages/dependencies และ virtual environment
  2. on-demand/short-lived virtualenv กล่าวคือ uv จะสร้าง virtualenv ให้เฉพาะตอนทำงานเท่านั้น
  3. สร้าง Python project พร้อม git repository ได้ในครั้งเดียว
  4. เลือกเวอร์ชันของ Python ได้
  5. สร้าง package แล้วส่งขึ้น repo ได้เลย
  6. ติดตั้ง dependencies ได้เร็วขึ้น
  7. เขียนด้วยภาษา Rust ทำให้มีประสิทธิภาพสูง

การติดตั้ง

โดยใช้ Standalone Installer
macOS and Linux:

$ curl -LsSf https://astral.sh/uv/install.sh | sh

Windows:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Update UV

เพื่อให้ได้ฟีเจอร์ใหม่ ปลอดภัย และไร้บั๊ก:

$ uv self update

เริ่มต้นใช้งาน uv

สร้าง directory/folder เพื่อเก็บโปรเจกต์ใหม่ด้วยคำสั่ง

$ mkdir -p hello-world && cd "$_"

สร้าง Python Project

โดยระบุเวอร์ชั่นของ Python ที่ต้องการ และ uv จะสร้าง git repository ใน directory ปัจจุบัน

$ uv init --python=3.8 .

เปิดใช้ virtualenv

$ uv venv --python=3.8
$ source .venv/bin/activate
ยกเลิกการใช้งาน virtualenv ได้ด้วยคำสั่ง
$ deactivate

จัดการเวอร์ชันของ Python

แสดงเวอร์ชัน

ดูว่ามี Python เวอร์ชันไหนที่ลงไว้ในเครื่องแล้ว และมีเวอร์ชันไหนที่สามารถติดตั้งได้

$ uv python list

ติดตั้งเฉพาะเวอร์ชันที่ต้องการ

$ uv python install 3.10 3.11 3.12
tip

สามารถดาวน์โหลด ติดตั้ง และใช้งาน Python เวอร์ชันที่ต้องการใน virtualenv ได้อย่างง่ายดาย

$ uv venv --python=3.9

จัดการ Dependencies

ติดตั้ง package deps ได้ง่ายๆ เช่น ต้องการติดตั้ง requests ด้วยคำสั่ง

$ uv add requests

ใช้ pip-compatible interface

หรือถ้ายังคุ้นเคยกับการใช้ pip หรือโปรเจกต์เดิม workflow ยังพึ่ง pip อยู่
uv ก็มี pip-interface ที่ทำงานได้ไวกว่า pip ธรรมดาถึง 10-100 เท่า

$ uv pip install langchain
Resolved 29 packages in 762ms
Prepared 14 packages in 1.03s
Installed 29 packages in 258ms

ย้าย requirements.txt ไปยัง pyproject.toml

อย่าลืม Initialize project ก่อน

สร้างไฟล์ pyproject.toml ด้วยคำสั่ง

$ uv init --python=3.12 .

ถ้าโปรเจกต์มีไฟล์ requirements.txt อยู่แล้ว สามารถย้าย deps ทั้งหมดไปยัง pyproject.toml ได้ด้วยคำสั่ง

$ uv add -r requirements.txt

เสร็จแล้วก็ติดตั้ง deps ทั้งหมดที่ระบุไว้ใน pyproject.toml ด้วยคำสั่ง

$ uv sync
วิธีเก็บ dependencies
$ uv pip freeze > requirements.txt

รัน Python script

สร้าง script

$ uv init --script example.py --python 3.12

กรณี script ไม่มี deps

hello.py
print("Hello world")
$ uv run hello.py
Hello world

กรณี script มี deps

เราสามารถใช้รูปแบบมาตรฐานของ Python ที่เรียกว่า inline script metadata เพื่อระบุ dependencies ได้ดังนี้

example.py
import requests
print(requests.get("https://astral.sh"))

สั่งให้ uv เพิ่ม declarative dependencies

$ uv add --script example.py requests
Updated `example.py`

ที่นี้เราก็จะรัน script ได้ด้วยคำสั่ง

$ uv run example.py
Reading inline script metadata from: example.py
Installed 5 packages in 12ms
<Response [200]>
info

uv นิยามการทำงานลักษณะนี้ว่า on-demand virtualenv หรือ short-lived virtualenv

ใช้งาน Tools ด้วย uvx

info

Tool เป็น Python package ประเภทหนึ่ง ที่เรียกใช้งานได้ผ่าน CLI

uvx เป็น package executor ที่ช่วยให้รัน tool แล้วใช้งานได้เลยทันที โดยไม่ต้องติดตั้งจริง

$ uvx pycowsay 'hello world!'

และถ้าใช้แล้วชอบ จะติดตั้งถาวรเลยก็ได้ด้วยคำสั่ง

$ uv tool install ruff

สร้าง Package และส่งขึ้น Repository

$ uv package create
$ uv package publish