- uv ทำให้การติดตั้ง Python และการจัดการสภาพแวดล้อมเสมือนง่ายขึ้นอย่างมาก และช่วยแก้ปัญหาความซับซ้อนของการตั้งค่าสภาพแวดล้อมในระบบนิเวศ Python
- เขียนด้วย Rust จึงมีทั้งความเร็วและความเสถียร พร้อมจัดการการติดตั้งเวอร์ชัน Python การจัดการแพ็กเกจ และการแก้ dependency ได้ด้วยคำสั่งเดียว
- สามารถตรวจจับ
pyproject.tomlอัตโนมัติเพื่อจัดเตรียมสภาพแวดล้อมของโปรเจ็กต์ และใช้uv syncเพื่อทำซ้ำสภาพแวดล้อมการพัฒนาที่เหมือนกันทุกประการระหว่างทีมได้ - ผ่านคำสั่งอย่าง
uv run,uv add,uvxจึงสามารถรันได้โดยไม่ต้อง activate virtual environment, เพิ่มแพ็กเกจและรันแบบครั้งเดียวได้ - ด้วยการทำให้การติดตั้งและการรัน Python มีความสม่ำเสมอ uv จึงถูกมองว่าเป็นจุดเปลี่ยนที่ช่วยยกระดับประสิทธิภาพการทำงานของนักพัฒนาและการทำงานร่วมกันอย่างมาก
ภาพรวมของ uv
- uv เป็นเครื่องมือจัดการ Python แบบโอเพนซอร์สฟรีที่พัฒนาโดย Astral โดยมีเป้าหมายเพื่อทำให้กระบวนการตั้งค่าสภาพแวดล้อมที่ซับซ้อนง่ายขึ้น
- Astral คือทีมที่สร้างเครื่องมือพัฒนา Python อย่าง Ruff
- uv รองรับการติดตั้งเวอร์ชัน Python, การติดตั้งแพ็กเกจ, การจัดการ virtual environment, การแก้ dependency และในด้านความเร็วนั้นเหนือกว่าเครื่องมือเดิมอย่างชัดเจน
- พัฒนาด้วย Rust ทำให้มีประสิทธิภาพสูงมาก และทำงานได้บนแทบทุกแพลตฟอร์ม เช่น macOS, Linux, Windows
การติดตั้งและการใช้งานพื้นฐาน
- การติดตั้งง่ายมาก และสามารถรันได้ด้วยคำสั่ง
curlหรือ PowerShell เพียงบรรทัดเดียว- Linux/Mac:
curl -LsSf https://astral.sh/uv/install.sh | sh - Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- Linux/Mac:
- สามารถลองใช้ได้อย่างปลอดภัยเพราะจะไม่ไปเปลี่ยนแปลงการติดตั้ง Python เดิมที่มีอยู่
การจัดการสภาพแวดล้อมของโปรเจ็กต์
- uv จะจัดการ virtual environment ให้โดยอัตโนมัติสำหรับแต่ละโปรเจ็กต์ Python และตั้งค่าสภาพแวดล้อมโดยอิงจากไฟล์
pyproject.toml- ใน
pyproject.tomlจะกำหนดเวอร์ชัน Python, รายการ dependency, ชื่อและเวอร์ชันของโปรเจ็กต์ เป็นต้น - ตัวอย่าง:
[project] name = "my_project" version = "1.0.0" requires-python = ">=3.9,<3.13" dependencies = ["astropy>=5.0.0", "pandas>=1.0.0,<2.0"] - วิธีนี้ให้การนิยามสภาพแวดล้อมที่ชัดเจนและเป็นมาตรฐานมากกว่า pip
- ใน
การสร้างโปรเจ็กต์ใหม่
- สามารถสร้างโปรเจ็กต์ใหม่ได้ง่ายด้วยคำสั่ง
uv init- จะสร้างไฟล์ที่จำเป็นอย่าง
pyproject.toml,README.mdโดยอัตโนมัติ - รองรับรูปแบบการเริ่มต้นที่หลากหลายผ่านออปชันอย่าง
--bare,--package - ตรวจสอบออปชันเพิ่มเติมได้ด้วย
uv init --help
- จะสร้างไฟล์ที่จำเป็นอย่าง
การซิงก์โปรเจ็กต์เดิม
- หากโปรเจ็กต์มี
pyproject.tomlอยู่แล้ว ก็สามารถใช้งานได้ทันทีด้วยคำสั่งuv sync- ติดตั้งเวอร์ชัน Python ให้อัตโนมัติ
- สร้าง virtual environment ในไดเรกทอรี
.venv - สร้าง
uv.lockที่บันทึกข้อมูลเวอร์ชันที่แน่นอนของทุกแพ็กเกจ
- หากใช้คำสั่ง
uv runก็สามารถรันสคริปต์ Python ได้โดยไม่ต้อง activate สภาพแวดล้อม- ตัวอย่าง:
uv run myscript.py,uv run jupyter lab
- ตัวอย่าง:
การจัดการ dependency และเวอร์ชัน Python
- ใช้คำสั่ง
uv add numpy>=2.0เพื่อเพิ่มและจัดการ dependency โดยอัตโนมัติได้- ไม่จำเป็นต้องแก้ไข
pyproject.tomlด้วยตนเอง
- ไม่จำเป็นต้องแก้ไข
- ใช้คำสั่ง
uv python pin 3.12.9เพื่อตรึงเวอร์ชัน Python ที่ต้องการได้ ซึ่งช่วยรับประกันความสามารถในการทำซ้ำของสภาพแวดล้อม
uvx: การรันแบบครั้งเดียวที่รวดเร็ว
uvxคือคำสั่งที่ช่วยให้รันเครื่องมือได้ทันทีโดยไม่ต้องตั้งค่าสภาพแวดล้อมแยกต่างหาก- ตัวอย่าง:
uvx ruff,uvx jupyter lab,uvx --with pandas,pyarrow ipython - ด้วยระบบแคชจึงสามารถรันซ้ำได้อย่างรวดเร็วมาก และเหมาะกับงานทดลอง
- ตัวอย่าง:
- ทำให้นักพัฒนาสามารถจัดเตรียมสภาพแวดล้อมชั่วคราวสำหรับการรันได้อย่างง่ายดายโดยไม่ต้องผูกติดกับ virtual environment
ถ้ายังไม่พอจะโน้มน้าวคุณ: บันทึกส่วนตัว
- ระหว่างการพัฒนา The Astrosky Ecosystem มีการนำ uv มาใช้เพื่อทำให้สภาพแวดล้อม Python เป็นมาตรฐานเดียวกันบนหลายระบบปฏิบัติการ
- ช่วยให้ทั้งนักพัฒนาและเซิร์ฟเวอร์ทุกตัวใช้การติดตั้ง Python และเวอร์ชัน dependency ที่เหมือนกันทุกประการ
- uv ยังใช้จัดการสภาพแวดล้อม Python ใน GitHub Actions และบนเซิร์ฟเวอร์โปรดักชันด้วย
- ด้วย uv ปัญหาความไม่ตรงกันของสภาพแวดล้อมติดตั้งและทดสอบหายไป และการทำงานร่วมกันระหว่างนักพัฒนาก็ง่ายขึ้น
บทสรุป
- uv ช่วยแก้ความซับซ้อนของการติดตั้งและจัดการ Python ได้อย่างถึงราก และทำให้นักพัฒนาทำงานร่วมกันได้อย่างเสถียรบนสภาพแวดล้อมเดียวกัน
- ด้วยความเร็วสูงและความเสถียรจากการพัฒนาด้วย Rust ทำให้ uv ได้รับการประเมินว่าเป็น “นวัตกรรมที่ยิ่งใหญ่ที่สุดที่เกิดขึ้นกับระบบนิเวศ Python ในรอบ 10 ปี”
7 ความคิดเห็น
ผมเคยคิดว่า
pdmคล้ายกับuvมากเหมือนกัน แต่ดูเหมือนจะไม่ค่อยมีการพูดถึงpdmเท่าไรนะโพสต์เกี่ยวกับ uv ตอนนี้ดูเหมือนว่าเนื้อหาจะไม่ค่อยเปลี่ยนไปมากแล้ว
Maven กับ Gradle ด้วย..
ความเห็นจาก Hacker News
เมื่อก่อนเคยได้ยินว่าชุดเครื่องมือของ Python ดีพออยู่แล้ว แต่ตอนนี้พอเห็นนักพัฒนา Python ได้ลองใช้ ecosystem ที่อิง lockfile แบบ npm, cargo หรือ bundler แล้วค่อยตระหนักถึงข้อดีของมัน ก็รู้สึกสะใจอยู่ไม่น้อย
npm เองก็มีปัญหา แต่เรื่อง การติดตั้งที่สม่ำเสมอและไฟล์ล็อก เป็นแนวคิดที่ยอดเยี่ยมจริงๆ
น่าประหลาดใจที่การจัดการสภาพแวดล้อมไม่สะดวกอยู่แบบนี้มานานมาก
ไม่แน่ใจว่าเหตุที่ความพยายามจำนวนมากล้มเหลวเป็นเพราะ ความยากของการจัดการแพ็กเกจ อย่างเดียว หรือเพราะต้องมีเงินทุน VC ด้วย
pip freeze > requirements.txtกับpip install -r requirements.txtมาตลอดถ้าไม่ใช้ช่วงเวอร์ชัน requirements.txt ก็ทำหน้าที่เป็น lockfile ได้โดยพฤตินัย
เลยรู้สึกว่ากระแส ‘official lockfile’ ช่วงนี้อาจจะถูกพูดเกินจริงไปหน่อย
มองว่า npm พัฒนาขึ้นมากเพราะการมาของ yarn
เร็วกว่า มีประสิทธิภาพกว่า และกำหนดผลลัพธ์ได้แน่นอนกว่า
ดูรายละเอียดได้ที่ pnpm.io/motivation
ใช้ UV scripts เพื่อ แจกจ่าย MCP client/server เป็นไฟล์เดียว ได้
บทความที่เกี่ยวข้อง: MCP server in a file
สคริปต์ส่วนใหญ่เป็นไฟล์เดียวอยู่แล้ว แค่เพิ่มโค้ดด้านล่างไว้บนสุด ชีวิตก็ง่ายขึ้นมาก
#!/usr/bin/env -S uv run --scriptแบบนี้สคริปต์จะทำงานเหมือน executable แบบอิสระ และ uv จะติดตั้งโมดูลที่จำเป็นให้อัตโนมัติ
เพราะคนเขียนสคริปต์อาจซ่อน dependency อันตรายไว้ได้
ถ้ามีฟังก์ชัน whitelist ก็น่าจะดี
แต่บางแพ็กเกจตรวจจับวันที่ออกรีลีสไม่ได้ (เช่น yaml)
/usr/bin/env -Sและชื่อ dependency ต้องใช้เป็น ชื่อแพ็กเกจที่ใช้แจกจ่าย ตามที่ใช้ในคำสั่งuv pip installนี่เป็นมาตรฐาน PEP 723 และ pipx ก็รองรับด้วย
ก่อนใช้ uv ไม่ได้สนใจ Rust เท่าไร แต่เพราะ uv เลยเริ่มย้าย โค้ดที่ไวต่อประสิทธิภาพ ไปเขียนด้วย Rust
อยากให้ conda หายไปเลย ใน ML cluster ขนาดของ conda environment ใหญ่มากและ reproducibility ก็ไม่ดี
เมื่อก่อนพอใจกับชุด pyenv + venv + pip + pipx อยู่แล้ว แต่ uv นั้น
uv run,uv addเป็นต้นแทนที่จะ activate environment การใส่
uvนำหน้าคำสั่งสะดวกกว่ามากการจัดการเวอร์ชัน Python ก็ง่ายขึ้น และให้ความรู้สึกแบบ batteries-included ในระดับต่อโปรเจกต์
ยังไม่รู้ว่าระยะยาวจะเสถียรแค่ไหน แต่ตอนนี้ใช้เป็นค่าเริ่มต้นสำหรับโปรเจกต์ใหม่แล้ว
บางคนไม่ชอบที่ uv ตรวจจับ environment ให้อัตโนมัติ
ไม่ค่อยเห็นคุณค่าของการจัดการเวอร์ชัน Python เท่าไร แต่การสร้าง environment ใหม่ด้วย uv เร็วกว่ามาก
uvทำให้รันคำสั่งแบบ stateless ได้ จึงสะดวกเวลาทำงานร่วมกันuvก็ยังมีประโยชน์อยู่.venvได้เลยบล็อกโพสต์นี้ตรงกับประสบการณ์ของฉันแทบทั้งหมด
แรงเสียดทานลดลงและเรียบง่ายขึ้น
อยากให้ชุมชน Python รับ uv เป็นเครื่องมือมาตรฐาน
เครื่องมือที่เขียนด้วย Rust เปลี่ยน ความเร็วของ feedback loop ไปอย่างสิ้นเชิง
แต่ก็สงสัยว่า Astral จะทำรายได้ยังไง เพราะรับเงินลงทุนมาแล้วแต่ยังไม่มีสินค้าแบบเสียเงิน
เช่น package registry ภายในองค์กร
บทสัมภาษณ์ที่เกี่ยวข้อง: สัมภาษณ์ Charlie Marsh
ถ้ามีนักพัฒนา Python 10 ล้านคน ก็คิดว่า uv ก็ สร้างรายได้ได้เพียงพอ เหมือนกัน
ส่วนตัวคิดว่า type annotations และ การเอา GIL ออก สำคัญกว่า uv
uv ยังอยู่ช่วงต้นและก็ยังมีจุดที่ไม่สะดวก สุดท้ายมันก็เป็นแค่อีก package manager ตัวหนึ่ง
resolver ตัวใหม่ของ pip และการเพิ่มขึ้นของ การแจกจ่ายแบบ wheel มีบทบาทมาก
บทความที่เกี่ยวข้อง: Wheels are faster for pure Python
ที่เขียนด้วย Rust ก็ชวนสนใจด้วย เพราะมีโครงสร้างรองรับภาษาอื่นได้แบบ LLVM
จากมุมมอง end-user แล้ว uv ดีกว่ามาก และถ้าฝั่งผู้ดูแลรักษาไม่สะดวกก็ควรส่ง feedback
ถ้ามี strict mode ก็อาจช่วยเรื่องประสิทธิภาพได้ แต่ก็ขัดกับปรัชญาของภาษา
ถึงอย่างนั้น ถ้า conda หายไปก็ยินดีจะย้ายมาใช้ uv
ฉันไม่ชอบ uv
uv pipเลยไม่ใช่การแทนที่แบบสมบูรณ์แต่ pip กับ venv เองก็พังบ่อยและดีบักยากกว่า
uv ไม่ได้แทนที่ ruff
และแทบไม่ต้องไปยุ่งกับ environment variables เลย
uv pipไม่ได้เรียกใช้ pip แต่ให้ interface ที่เข้ากันได้ในทางปฏิบัติ uv คือสิ่งที่มาแทน pip
เลยสงสัยว่าปัญหาเรื่องความเข้ากันได้กับ Docker ที่ว่าเป็นเรื่องอะไรโดยเฉพาะ
uv add,uv sync,uv runจะ ใช้งานตามหลักสรีรศาสตร์ได้ดีกว่า และเร็วกว่าดูเอกสารเพิ่มเติมได้ที่ แนวคิดเรื่อง dependencies ของ uv
uv เร็วก็ดีอยู่หรอก แต่ก็แอบคิดเหมือนกันว่าถ้าไปในทางปรับปรุง pip แทนจะเป็นอย่างไรนะ
ผมใช้อยู่เยอะทั้งในสาย ML และ Web และก็หวังว่า uv จะกลายเป็นเทคโนโลยีที่ธรรมดาจนน่าเบื่อได้ไว ๆ ครับ 555
พอเห็นรีโปที่มีแค่ requirements แต่ไม่มี
pyproject.tomlเดี๋ยวนี้ก็ดูเชยไปแล้วนะ 555;