Rye: ประสบการณ์ Python แบบไร้ความยุ่งยาก
(rye.astral.sh)- Rye เป็นเครื่องมือจัดการโปรเจ็กต์และแพ็กเกจที่ตั้งใจให้ดูแลการติดตั้ง Python, โปรเจ็กต์
pyproject.toml, การพึ่งพา, virtualenv และการติดตั้งเครื่องมือแบบ global ได้ในที่เดียว - ปัจจุบัน หยุดพัฒนาแล้ว และแนะนำให้ใช้โปรเจ็กต์สืบทอด uv ที่สร้างโดยผู้ดูแลชุดเดียวกัน
- ผู้ใช้เดิมสามารถย้ายไปได้โดยอ้างอิง uv migration guide และแม้ Rye จะยังดาวน์โหลดได้ แต่ไม่มีแผนอัปเดตเพิ่มเติมอีกแล้ว
- การหยุดอัปเดตรวมถึง การอัปเดตด้านความปลอดภัย ด้วย ดังนั้นสำหรับโปรเจ็กต์ใหม่หรือสภาพแวดล้อมที่ต้องดูแลระยะยาว ควรพิจารณาย้ายไปใช้ uv
- ประสบการณ์ Python แบบครบวงจรที่ Rye ตั้งเป้าไว้ครอบคลุมถึงโปรเจ็กต์ที่ซับซ้อนและ monorepo แต่จุดศูนย์กลางของการบำรุงรักษาได้ย้ายไปอยู่ที่ uv
สถานะปัจจุบันของ Rye
-
หยุดพัฒนาและแนะนำ uv
- แนะนำให้ผู้ใช้ทุกคนใช้ uv
- uv เป็นโปรเจ็กต์สืบทอด ที่สร้างโดยผู้ดูแลชุดเดียวกัน
- uv ได้รับการดูแลอย่างต่อเนื่องและถูกใช้งานอย่างแพร่หลายกว่า Rye มาก
- ผู้ใช้ Rye เดิมสามารถดู uv migration guide ได้
- ยังสามารถใช้ Rye ต่อได้ แต่ไม่มีแผนอัปเดตเพิ่มเติม
- ไม่มีแผนสำหรับการอัปเดตด้านความปลอดภัยเช่นกัน
ความสามารถที่ Rye เคยมอบให้
- Rye เป็น โซลูชันจัดการโปรเจ็กต์และแพ็กเกจ สำหรับ Python
- ถูกสร้างขึ้นโดยมีเป้าหมายเป็นเครื่องมือแบบ one-stop สำหรับผู้ใช้ Python
- ภายในประสบการณ์แบบรวมศูนย์เดียว สามารถจัดการงานต่อไปนี้ได้
- การจัดการการติดตั้ง Python
- การจัดการโปรเจ็กต์บนพื้นฐาน
pyproject.toml - การจัดการการพึ่งพา
- การจัดการ virtualenv
- การติดตั้งเครื่องมือแบบ global
- ออกแบบมาให้รองรับโปรเจ็กต์ที่ซับซ้อนและ monorepo
- ดูวิดีโอแนะนำได้ที่ Watch an introduction
2 ความคิดเห็น
ผมใช้ Introduction - PDM
อยู่แล้ว หลังจากลองใช้นู่นนี่มาสักพัก
คงต้องลองใช้ Rye ดูบ้างแล้วครับ
ความคิดเห็นบน Hacker News
งานพัฒนาแพ็กเกจจิงหลักส่วนใหญ่ตอนนี้กำลังดำเนินอยู่ที่ uv และ Rye ใช้ uv ภายใน ดังนั้นเมื่อ uv ดีขึ้น Rye ก็จะดีขึ้นตามไปด้วย
ตัวอย่างเช่น เมื่อเร็ว ๆ นี้ uv ได้เพิ่ม การแก้ dependency แบบครอบคลุมทุกแพลตฟอร์ม ทำให้สามารถสร้าง
requirements.txtที่ล็อกไว้ด้วยผลลัพธ์การแก้ dependency ชุดเดียวที่ทำงานได้บนทุกแพลตฟอร์มและทุกระบบปฏิบัติการ ไม่ใช่แค่ระบบที่กำลังรันอยู่ในขณะนั้น และ Rye เวอร์ชันล่าสุดก็รองรับสิ่งนี้แล้วhttps://github.com/astral-sh/uv
ผมกำลังพัฒนา Rye และ uv อยู่ ถ้ามีคำถามก็ยินดีตอบ
https://github.com/python-poetry/poetry/issues/6409
https://news.ycombinator.com/item?id=39257501
หนึ่งในเหตุผลที่ทีมของผมยังลังเลจะย้ายก็เพราะส่วนนี้ เราทำงานด้าน ML ดังนั้นถ้ายกโปรเจกต์ที่ใช้ PyTorch เป็นตัวอย่าง สถานะที่ต้องการคือใส่ dependency ทั้งหมดไว้ใน
pyproject.tomlแล้วสร้าง lock file สำหรับการตั้งค่าแพลตฟอร์มต่อไปนี้จากเครื่อง AArch64 Mac หรือเวิร์กสเตชัน AMD64 Windows ได้: Mac ที่ใช้ MPS PyTorch พื้นฐาน, Windows ที่ใช้ CUDA PyTorch, AArch64 Linux ที่ใช้ CPU PyTorch, AMD64 Linux ที่ใช้ CPU PyTorch, AMD64 Linux ที่ใช้ CUDA PyTorchขอบคุณที่สร้าง Ruff ขึ้นมา ผมพอใจมากทั้งเรื่อง linting และ formatting
pyenv+venv+pipก็ทรมานเสมอ แต่ตอนนี้ย้ายมาใช้ Rye แล้วตอนนี้แค่ติดตั้ง Rye, ดึงจาก GitHub, พิมพ์
rye syncก็จบhttps://guac.sh/
https://pypi.org/project/sbom4python/ https://github.com/CycloneDX/cyclonedx-python
ฟีเจอร์เลิกตรึง dependency ที่เพิ่งเพิ่มเข้ามาช่วยชี้นำให้รักษาความเข้ากันได้ระหว่างการพัฒนา และสามารถสร้าง
requirements.txtที่ถูกต้องชัดเจนเพื่อความสามารถในการทำซ้ำได้ ทำให้ขั้นตอนการจัดการช่องโหว่และ SBOM ง่ายกว่าเครื่องมืออย่าง Poetry มากด้วยเหตุผลคล้ายกัน ผมจึงใช้ https://hatch.pypa.io/latest/why/ อยู่ และชอบที่มันเข้ากันได้ดีกับ
uvสิ่งที่ทำให้ลังเลกับ Rye คือส่วนที่แนะนำอย่างหนักให้ใช้ Python build ที่ไม่ใช่มาตรฐาน
ในหน้าปรัชญา (https://rye.astral.sh/philosophy/) อธิบายว่า build ของ CPython จาก python.org ไม่เหมาะสมอย่างสิ้นเชิง บางแพลตฟอร์มมีแค่ไฟล์ติดตั้ง
.msiหรือมีแค่ tarball และ Python distribution หลายตัวก็แตกต่างกันมากจนสร้างปัญหาสารพัดให้กับ ecosystem ย่อย ดังนั้นโปรเจกต์นี้จึงใช้ build แบบ standalone ของ indygreg และหวังว่าสักวันหนึ่งจะมี Python build ที่ดูแลดีและเชื่อถือได้ออกมาแทนที่ความสับสนในปัจจุบันข้อมูลของ build indygreg นั้นอยู่ที่ https://gregoryszorc.com/docs/python-build-standalone/main/ และยังเลือก Python ตัวอื่นได้ด้วย: https://rye.astral.sh/guide/toolchains/
แต่ผมแทบไม่เคยเจอปัญหาที่พวกเขาพูดถึงเลย Python build ทางการที่ได้จาก python.org ก็ใช้งานได้, Python ธรรมดาที่ติดตั้งผ่าน package manager ของ distribution ก็ใช้งานได้, และ Python ที่มากับ image ของคอนเทนเนอร์ Docker ทางการก็ใช้งานได้
build พิเศษเหล่านั้นก็คงใช้งานได้ดี แต่ผมลังเลเพราะ ความไม่เป็นมาตรฐาน ถึงขั้นมีรายการพฤติกรรมเฉพาะตัวด้วยซ้ำ ผมไม่เข้าใจว่าทำไมต้องเพิ่มความเฉพาะตัวให้กับสิ่งที่ไม่ได้มีปัญหา ปรัชญาของ Rye ที่ผลักดันให้ใช้ build นั้นอย่างมากก็ทำให้มันน่าสนใจน้อยลง เมื่อเทียบกับทางเลือกที่ใช้ Python ที่มีอยู่แล้วในระบบปฏิบัติการเป็นค่าเริ่มต้น
ถ้าจะ build Python จากซอร์ส ก็ต้องมี system dependency ใหม่ ๆ ใช้เวลานาน และสุดท้ายก็เจอข้อผิดพลาดที่ยิ่งไม่เข้าใจเกี่ยวกับไฟล์ header ที่หายไป พอค้นข้อผิดพลาดนั้นก็เจอ flag ของ
./configureที่ใช้เลี่ยงปัญหาที่ upstream GCC แก้ไปแล้วตั้งแต่ปี 2017 และสุดท้ายก็สำเร็จอยู่ดีถ้าไม่เคยเจอข้อผิดพลาดแบบนี้สัก 3 ครั้งหรือ สภาพแวดล้อม build ของ manylinux ก็แปลว่าคุณหลบเลี่ยงโลกแห่งความเจ็บปวดไปได้ทั้งใบแล้ว เรื่องสคริปต์ติดตั้งบน Windows หรือส่วนอย่าง “ข้อจำกัดของคำสั่ง CPU ที่ใช้งานได้” ในหน้านั้นก็เช่นกัน
ดาวน์โหลดซอร์สโค้ด Python เป็นประจำ คอมไพล์ด้วยการปรับแต่งมาตรฐานสำหรับโปรดักชัน แล้วติดตั้งไว้ที่
/use/local/python${version}ซึ่งทำงานได้อย่างสม่ำเสมอมากตั้งแต่ Python 3.7 ออกมาในปี 2018จากประสบการณ์ของผม คำสั่งเหล่านี้เสถียรและสม่ำเสมอมากจนแทบจะเอาไปทำอัตโนมัติได้ เลยสงสัยว่าจุดที่ผู้เขียนมองว่าเป็นปัญหา หรือข้อคัดค้านพื้นฐานจริง ๆ คืออะไร
ตัวอย่างเช่น ไม่สามารถดาวน์โหลดไฟล์ติดตั้ง Python 3.10.14 ได้ และไฟล์ติดตั้ง Windows ตัวสุดท้ายคือ Python 3.10.11 เวอร์ชันวันที่ 5 เมษายน 2023
ชอบ Rye มันทำสิ่งที่ประกาศไว้ได้ตรงตามนั้น ทำให้กระบวนการทั้งหมดของ
venv/เวอร์ชัน Python/แพ็กเกจจิงใช้งานได้สบายขึ้นจริง และสำหรับคนที่คุ้นกับวิธีใช้งาน Python อย่างเป็นทางการอย่างpyproject.tomlก็แทบจะรู้สึกโปร่งใสไม่สะดุดแถมยังทำให้ Python ให้ความรู้สึกเหมือน Cargo ซึ่ง Cargo เองก็เป็นเครื่องมือที่ใช้งานดี
ส่วนตัวมองว่า pip-tools มีการออกแบบที่ดีกว่า Poetry หรือ Pipenv มาก มันตั้งฉากกับทั้ง pip และ
virtualenvและทั้งสองอย่างก็เป็นแนวทางที่อยู่กับ Python มานานแล้ว Rye จึงมองได้ว่าเป็นภาพของแนวทางที่สอดคล้องกับมาตรฐานและผ่านการปรับปรุงซ้ำ ๆ จนชนะนอกจากความเร็วที่ได้จาก Rust แล้ว ยังชอบที่มันให้ค่าเริ่มต้นที่เหมาะสมเรื่องจะวาง virtual environment ไว้ที่ไหน (
.venv) และจะติดตั้ง Python หลายเวอร์ชันอย่างไร ดูเหมือนเรื่องเล็ก แต่หลังจาก wheel แก้ปัญหาการติดตั้ง numpy ไปแล้ว ค่าเริ่มต้นที่สมเหตุสมผลแบบนี้กับ pip-tools ในตัวนี่แหละคือสิ่งที่ขาดอยู่แทบทั้งหมด ในแง่นั้นก็สงสัยเหมือนกันว่าหลังจากมี binary wheel แล้ว เหตุผลในการมีอยู่ของ Anaconda คืออะไรกันแน่ดีใจที่อย่างน้อยตอนนี้มันกำลังดีขึ้น
ดูเหมือน package manager ของ Python จะมีมากกว่าแอปแชตของ Google เสียอีก
และในแง่การคัดสรร ข้อเสนอให้เชื่อใจองค์กรเล็กมากกว่าองค์กรที่ใหญ่กว่าและเก่ากว่าดูไม่น่าโน้มน้าวนัก กล่าวคืออยากรู้ว่าสิ่งที่ประกาศไว้นั้นคืออะไรกันแน่ เท่าที่อ่านได้ก็ประมาณว่า “package manager ที่ดีก็ดี เร็ว และดี” ถ้ามีหน้าที่เปรียบเทียบหรืออธิบายปรัชญาก็น่าจะดี
บางครั้งความประชดประชันบน HN ก็น่าทึ่ง
ชอบ Rye หลังจากใช้ package manager ของภาษาอื่นอย่าง Cargo หรือ Hex แล้ว ผมรู้สึกเสียดายมาตลอดที่ Python ไม่มีระบบคล้ายกัน และ Rye ก็เติมเต็มความกระหายนั้นได้หมดจดจริง ๆ ในฐานะคนที่ไม่อยากติดตั้งหลายเครื่องมือเพื่อจัดการ
venv, เวอร์ชัน Python และ dependency ของโปรเจกต์ การที่ Rye ตัวเดียวจัดการได้ทั้งหมด นั้นดีมากผมยังไม่ค่อยจับทาง Rye ได้ แต่ conda ก็จัดการ
venv, เวอร์ชัน Python และ dependency ของโปรเจกต์ได้ดีเหมือนกันการเจอ dependency manager ตัวใหม่ของ Python ให้ความรู้สึกเหมือนบังเอิญเจอ JavaScript framework ตัวใหม่
venvถ้าต้องจัดการ port หรือต้องแจกจ่ายโปรแกรม หรือไลบรารีพึ่งพา C หรือองค์ประกอบของระบบปฏิบัติการ การไปทำงานคอนซัลต์ที่รับเงินแล้วไม่ต้องดูแลโค้ดเบสหรือรับผิดชอบทีหลังน่าจะดีกว่า
ทุกวันนี้ยังรัน CUDA และ PyTorch ใน Docker ได้ด้วย ในเธรดแบบนี้ ถ้ามีคนบอกว่า “ก็ใช้ Docker สิ” คำตอบที่พบบ่อยคือ “ไม่อยากเรียน Docker” แต่ต่อให้ไม่มีประสบการณ์ Docker เลย การเปิดคอนเทนเนอร์ Python ใช้เวลาแค่ 10 นาที
pixi(https://pixi.sh/latest/) ดีมาก สามารถตรึงเวอร์ชัน Python และติดตั้งแพ็กเกจจาก conda กับ PyPI ได้ อีกทั้งเขียนด้วย Rust
curlแล้ว pipe เข้า bash จากนั้นให้evalเอาต์พุตคำสั่งตามอำเภอใจต่อ รู้สึกน่ากังวลภูมิหลังค่อนข้างซับซ้อน เดิมบริษัท Anaconda มี conda ที่เขียนด้วย Python และ conda-forge ซึ่งเป็น ecosystem โอเพนซอร์สก็เป็น conda channel ที่มีบอทบิลด์ CI ต่อมาภายใต้ร่ม conda-forge เดียวกัน mamba ที่เขียนด้วย C++ ก็ออกมาเป็นตัวแทน conda และเป็น drop-in replacement จริงในระดับที่
alias conda=mambaควรจะใช้งานได้ ตอนนี้ conda เองก็ใช้ libmamba เป็น resolver เพื่อเพิ่มความเร็วแล้วหลังจากนั้นผู้เขียน mamba แยกมันออกมาเป็น pixi และเขียนใหม่ด้วย Rust พร้อมเปลี่ยนปรัชญาเรื่องตำแหน่งของ environment และวิธี activate แต่ยังเข้ากันได้เต็มที่กับ conda environment
conda รองรับการติดตั้งแพ็กเกจ PyPI ผ่าน
pipมาโดยตลอดในกรณีที่ไม่มีอยู่ในช่อง conda และ pixi ก็รองรับแพ็กเกจ PyPI ผ่าน uv ดังนั้น pixi จึงเร็ว ตามบทความบล็อก ยังมีการปรับให้เหมาะสมอื่น ๆ ที่ทำให้เร็วกว่า mamba มากด้วยถ้าใช้แพ็กเกจที่ไม่ใช่ Python ล้วน ๆ สาย conda คือคำตอบ ส่วนการเลือกตัวจัดการแพ็กเกจ (conda/mamba/pixi) เป็นเรื่องรอง
ปัญหาของ PyPI คือขาดบทบาทผู้เฝ้าประตู อีกทั้งยังซ้อนกับปัญหาที่ขาดวิธีมาตรฐานในการแพ็กเกจสิ่งที่ไม่ใช่ Python ล้วน ๆ ทำให้สภาพแวดล้อมรั่วไหล หรือโดยเฉพาะถ้าแจกจ่ายแค่ซอร์ส แล้วทำเรื่องแปลก ๆ อย่างบูตสแตรปสภาพแวดล้อมใน
setup.pyไปจนถึงคอมไพเลอร์ ก็จะทำให้ทำซ้ำไม่ได้ฝั่ง conda นั้น ช่อง conda-forge มีการควบคุมคุณภาพค่อนข้างดี ตรวจสอบข้อกำหนดจำกัด ไลเซนส์ ปัญหาที่ไฟล์ไลเซนส์หายไปจากชุดเผยแพร่บน PyPI การแยกสภาพแวดล้อม ฯลฯ แน่นอนว่าไม่สมบูรณ์แบบ เพราะผู้ดูแลสามารถใช้บอตทางการที่ merge อัตโนมัติการเปลี่ยนแปลงจาก PyPI ที่มีข้อกำหนดเวอร์ชันผิดได้
ปัญหาที่ตอนนี้ไม่มีเครื่องมือไหนแก้ได้คือการมี PyPI เป็นศูนย์กลาง ต้องจัดการแพ็กเกจที่ไม่มีใน conda และการปล่อยแพ็กเกจก็แทบถูกบังคับให้ปล่อยบน PyPI ก่อน
แม้ตอนติดตั้งแพ็กเกจที่มีเฉพาะบน PyPI ผ่าน conda ก็เป็นไปได้ว่าบาง dependency ของแพ็กเกจนั้นมีอยู่ใน conda เท่าที่ผมรู้ ไม่มีตัวจัดการแพ็กเกจตัวไหนที่ใช้แพ็กเกจ conda เพื่อเติมเต็ม dependency ของแพ็กเกจ PyPI ได้ คุณสามารถเพิ่มแพ็กเกจ conda ด้วยมือเพื่อให้ dependency ครบได้ แต่มีความเสี่ยงว่าจะไม่ได้ใช้ข้อกำหนดเวอร์ชันที่ถูกต้อง
แม้ตอนเขียนแพ็กเกจ Python แบบโอเพนซอร์ส ถึงการตั้งค่าจะพึ่งพาเฉพาะช่อง conda ก็ตาม ส่วนใหญ่ก็ต้องหรือควรปล่อยบน PyPI ก่อนอยู่ดี เพราะการปล่อยบนช่อง conda-forge โดยพฤตินัยต้องการให้มีอยู่บน PyPI ดังนั้นสำหรับคนอย่างผม Rye ก็ยังอาจมีประโยชน์และควรค่าแก่การลองดู
ผมคาดหวังกับโปรเจกต์นี้มาก แต่ตั้งใจจะรอจนกว่าจะถึง ระยะที่เติบโตเต็มที่ มากกว่านี้ ผมชอบทุกอย่างที่ทีม Astral ทำออกมา จึงคาดหวังสูง
ทุกครั้งที่เริ่มโปรเจกต์ Python ผมรู้สึกเหมือนต้องเรียนรู้สถานะล่าสุดของการจัดการ dependency/virtual environment ใหม่อีกรอบ