19 คะแนน โดย GN⁺ 2024-03-26 | 7 ความคิดเห็น | แชร์ทาง WhatsApp
  • ช่วยให้สลับใช้งานระหว่าง Python หลายเวอร์ชันได้อย่างง่ายดาย
  • เรียบง่าย ไม่รบกวนการทำงาน และยึดตามแนวทางเครื่องมือแบบดั้งเดิมของ UNIX ที่มีจุดประสงค์เดียวแต่ทำงานได้ดี
  • โปรเจ็กต์นี้แตกแขนงมาจาก rbenv และ ruby-build แล้วปรับให้เหมาะกับ Python

pyenv ทำอะไรได้บ้าง

  • เปลี่ยน เวอร์ชัน Python แบบ global ได้ในระดับผู้ใช้
  • รองรับ เวอร์ชัน Python รายโปรเจ็กต์
  • override เวอร์ชัน Python ได้ด้วย environment variable
  • ค้นหา คำสั่ง Python หลายเวอร์ชัน ได้พร้อมกัน มีประโยชน์สำหรับการทดสอบข้ามเวอร์ชันด้วย tox

สิ่งที่ pyenv ไม่ได้ทำ...

  • ไม่พึ่งพา Python เอง pyenv ถูกสร้างด้วยเชลล์สคริปต์ล้วน
  • ไม่จำเป็นต้องโหลด เข้าเชลล์ โดยใช้แนวทาง shim ผ่านการเพิ่มไดเรกทอรีลงใน PATH แทน
  • ไม่จัดการ virtualenv โดยตรง แน่นอนว่าผู้ใช้สามารถสร้าง virtualenv เองหรือใช้ pyenv-virtualenv เพื่อทำให้เป็นอัตโนมัติได้

หลักการทำงาน

  • pyenv ใช้ไฟล์สั่งรัน shim ที่ถูกแทรกเข้าไปใน PATH เพื่อดักจับคำสั่ง Python จากนั้นจะตัดสินใจเลือกเวอร์ชัน Python ที่แอปพลิเคชันระบุ แล้วส่งคำสั่งต่อไปยัง Python ที่ติดตั้งไว้ตามนั้น

ทำความเข้าใจ PATH

  • เมื่อรันคำสั่งอย่าง python หรือ pip ระบบปฏิบัติการจะค้นหาไฟล์สั่งรันตามชื่อนั้นในรายการไดเรกทอรีที่อยู่ใน environment variable PATH

ทำความเข้าใจ Shims

  • pyenv จะแทรกไดเรกทอรี shims ไว้ด้านหน้าสุดของ PATH ผ่านกระบวนการ rehashing เพื่อคง shim สำหรับทุกคำสั่ง Python ของทุกเวอร์ชัน Python ที่ติดตั้งไว้

ทำความเข้าใจการเลือกเวอร์ชัน Python

  • เมื่อมีการรัน shim, pyenv จะอ่านและใช้เวอร์ชัน Python จากแหล่งต่อไปนี้ตามลำดับ:
    1. environment variable PYENV_VERSION (ถ้ากำหนดไว้)
    2. ไฟล์ .python-version สำหรับแอปพลิเคชันในไดเรกทอรีปัจจุบัน (ถ้ามี)
    3. ไฟล์ .python-version แรกที่พบจากการค้นหาในไดเรกทอรีแม่ขึ้นไปเรื่อย ๆ จนถึง root ของไฟล์ระบบ (ถ้ามี)
    4. ไฟล์ global $(pyenv root)/version

การค้นหาตำแหน่งติดตั้ง Python ที่ pyenv จัดเตรียมไว้

  • pyenv จะส่งคำสั่งไปยัง Python ที่ติดตั้งไว้ตามเวอร์ชัน Python ที่มันตัดสินใจเลือก
  • Python แต่ละเวอร์ชันจะถูกติดตั้งอยู่ในไดเรกทอรีของตัวเองภายใต้ $(pyenv root)/versions

วิธีใช้งาน

ติดตั้ง Python เวอร์ชันเพิ่มเติม

  • ใช้ pyenv install เพื่อติดตั้ง Python เวอร์ชันเพิ่มเติม

resolve เป็นเวอร์ชันล่าสุดโดยอัตโนมัติ

  • ทุกคำสั่งย่อยของ Pyenv ยกเว้น uninstall จะ resolve prefix แบบเต็มเป็นเวอร์ชันล่าสุดโดยอัตโนมัติ

เวอร์ชัน Python ที่มีการรองรับเพิ่มเติม

  • มี Python release บางตัวที่ใช้แพตช์จากผู้ใช้เพื่อเพิ่มการรองรับในบางสภาพแวดล้อม

สลับระหว่างเวอร์ชัน Python

  • หากต้องการใช้ Python ที่ Pyenv ติดตั้งไว้ ให้รันคำสั่งใดคำสั่งหนึ่งต่อไปนี้:
    • pyenv shell
    • pyenv local
    • pyenv global

ลบเวอร์ชัน Python

  • เมื่อเวลาผ่านไป เวอร์ชัน Python จะสะสมอยู่ในไดเรกทอรี $(pyenv root)/versions
  • หากต้องการลบเวอร์ชัน Python เก่า ให้ใช้ pyenv uninstall

งานอื่น ๆ

  • หากต้องการดูรายการคำสั่งย่อยทั้งหมดที่มี ให้รัน pyenv commands

การลบ pyenv

  • สามารถปิดใช้งาน Pyenv ชั่วคราวหรือลบออกจากระบบได้อย่างง่ายดาย

ปลั๊กอินของ Pyenv

  • สามารถใช้ปลั๊กอินเพื่อขยายและปรับแต่งความสามารถของ Pyenv ได้ในแบบที่เรียบง่าย ยืดหยุ่น และดูแลรักษาได้

การตั้งค่าขั้นสูง

  • มี environment variable สำหรับควบคุมพฤติกรรมของ Pyenv

การพัฒนา

  • ซอร์สโค้ดของ Pyenv โฮสต์อยู่บน GitHub
  • รันทดสอบด้วย Bats

ความเห็นของ GN⁺

  • pyenv เป็นเครื่องมือที่มีประโยชน์มากสำหรับการจัดการ Python หลายเวอร์ชัน โดยเฉพาะสำหรับนักพัฒนาที่ต้องใช้ Python คนละเวอร์ชันในหลายโปรเจ็กต์
  • เครื่องมือนี้ไม่พึ่งพา Python เองและประกอบด้วยเชลล์สคริปต์ล้วน จึงสามารถติดตั้งและจัดการได้แม้ในระบบที่ยังไม่ได้ติดตั้ง Python
  • แม้ pyenv จะไม่จัดการ virtualenv โดยตรง แต่สามารถทำให้การจัดการ virtualenv เป็นอัตโนมัติได้ผ่านปลั๊กอิน pyenv-virtualenv ซึ่งสะดวกมาก
  • เนื่องจากการติดตั้งและการใช้งานค่อนข้างง่าย วิศวกรซอฟต์แวร์ระดับเริ่มต้นที่ต้องการจัดการเวอร์ชัน Python ก็เข้าถึงได้ไม่ยาก
  • เครื่องมืออื่นที่มีความสามารถคล้าย pyenv คือ conda ซึ่งถูกใช้อย่างแพร่หลายในด้าน data science และ machine learning โดย conda มีทั้งการจัดการแพ็กเกจและ environment จึงเหมาะกับผู้ใช้ที่ต้องการความสามารถเหล่านี้
  • เมื่อนำ pyenv มาใช้ ควรระวังหากในระบบมี Python ติดตั้งไว้หลายเวอร์ชันอยู่แล้ว เพื่อหลีกเลี่ยงปัญหาการชนกันของ path แม้ว่าข้อดีของ pyenv คือช่วยให้จัดการเวอร์ชันได้ง่ายขึ้น แต่การตั้งค่าที่ผิดพลาดอาจรบกวน path ของ Python พื้นฐานในระบบได้

7 ความคิดเห็น

 
koxel 2024-03-26

สำหรับ conda ต้องระวังว่าในองค์กรที่มีขนาดถึงระดับหนึ่ง
จะเป็นแบบมีค่าใช้จ่าย
ต่อให้บริษัทเล็ก แต่ถ้าบริษัทต้นสังกัดหลักมีขนาดใหญ่ ก็ลำบากที่จะส่งมอบงาน

 
koxel 2024-03-26

ตัว conda เองใช้ฟรีภายใต้ BSD แต่ควรตรวจสอบไลเซนส์ของรีโพซิทอรีและแพ็กเกจให้ดีนะครับ

 
tujuc 2024-03-26

ผมตั้ง asdf ไว้เป็นตัวหลักที่ระดับบนสุด https://asdf-vm.com/

ส่วนแยกตามแต่ละโปรเจกต์ก็มีทั้งตั้งค่าแบบ local บ้าง แล้วก็ใช้คอนเทนเนอร์บ้าง...

ช่วงนี้มีเครื่องมือสำหรับตั้งค่าสภาพแวดล้อมใหม่ + จัดการมันออกมาเยอะมาก เลยแทบไม่ได้ใช้อยู่เหมือนกันครับ.. 5555

 
sngwn 2024-03-26

ผมก็ใช้แบบนั้นเป๊ะเลย
ฮ่าๆๆ ส่วนตัวผมรู้สึกว่า pyenv มันเริ่มดูค่อนข้างเชยไปหน่อยแล้ว

 
joyfui 2024-03-26

พอมีพวก rbenv, pyenv, nodenv โผล่มาเรื่อย ๆ สุดท้ายก็เลยมี anyenv เกิดขึ้นมาจนได้ 555
https://github.com/anyenv/anyenv

 
GN⁺ 2024-03-26
ความคิดเห็นจาก Hacker News
  • คำเตือนเกี่ยวกับการใช้ pyenv

    • pyenv มีข้อเสียใหญ่คือคอมไพล์ Python บนเครื่องของผู้ใช้เอง
    • มีรูปแบบความล้มเหลวที่อาจเกิดขึ้นได้มากมายในสถานการณ์นี้
    • pyenv ไม่ใช่เครื่องมือสำหรับมือใหม่ในการแก้ปัญหา Python packaging แต่เป็นเครื่องมือสำหรับผู้เชี่ยวชาญเพื่อทำให้การตั้งค่ามีมาตรฐานเดียวกัน
    • ผู้ใช้จำนวนมากกำลังเจอปัญหาที่เกิดจาก pyenv แต่บ่อยครั้งก็ไม่รู้ตัว
  • ความทุกข์ของโปรแกรมเมอร์ Python

    • รู้สึกประหลาดใจกับความยุ่งยากที่ไม่จำเป็นที่โปรแกรมเมอร์ Python ต้องเจอ
    • การต้องติดตั้ง Python หลายเวอร์ชันเป็นเรื่องที่ไร้เหตุผล
    • แนวคิดที่ว่าโปรแกรม Python จะทำงานได้ทุกที่นั้นไม่ค่อยใช้ได้จริง
    • ทุกอย่างเปราะบางจนไม่สามารถทำงานได้หากไม่มีเวอร์ชันภาษาที่ตรงเป๊ะ
    • ปัญหา dependency รุนแรงจนกลายเป็นสถานการณ์ที่ต้องมีตัวจัดการของตัวจัดการแพ็กเกจ
  • เครื่องมือสำหรับทำให้โปรแกรม Python เสถียร

    • รายการเครื่องมือที่ช่วยรับประกันว่าโปรแกรม Python จะทำงานเหมือนเดิมกับตอนที่เขียนครั้งแรก
    • มีเครื่องมือหลากหลาย เช่น requirements.txt, pip, pipenv, pyenv, virtualenv เป็นต้น
  • แนะนำเครื่องมือ Mise

    • Mise ที่เขียนด้วย Rust คล้าย asdf แต่เร็วกว่า และไม่มี shims เป็นค่าเริ่มต้น
    • ติดตั้ง runtime แบบขนานและดาวน์โหลดปลั๊กอินที่จำเป็น
    • สามารถใช้เป็นเครื่องมือที่ดีกว่า asdf หรือ pyenv ได้
  • ข้อดีของ ASDF

    • ASDF รองรับไม่ใช่แค่ Python แต่ยังรวมถึง Rust, Go, Node และภาษาอื่น ๆ รวมถึงเครื่องมือต่าง ๆ ด้วย
  • แชร์ประสบการณ์การใช้ pyenv

    • ตอนเริ่มใช้ pyenv แรก ๆ ไม่มีปัญหา แต่หลังจากติดตั้ง Python หลายเวอร์ชันแล้วก็เริ่มมีปัญหา
    • แทนที่จะใช้ pyenv การดาวน์โหลด Python จาก python.org แล้วจัดการ virtual environment ด้วย python<version> -m venv /my/virtual/env มีความเสถียรกว่า
  • สแตกการจัดการ Python ส่วนตัว

    • ใช้ pyenv จัดการเวอร์ชัน Python และใช้ venv เพื่อสร้าง virtual environment ใหม่สำหรับแต่ละโปรเจกต์
    • ใช้ Poetry สำหรับการเริ่มต้นโปรเจกต์และจัดการ dependency
    • หากใช้ Dropbox จะเพิ่มโฟลเดอร์ .venv เข้าไปในรายการที่ไม่ต้องซิงก์
    • Pyenv ทำงานได้ดีหลังจากรวบรวม dependency ทั้งหมดที่ Ubuntu ต้องการแล้ว
  • การจัดการ runtime dependency ด้วย Mise

    • ใช้ mise เพื่อจัดการ runtime dependency ส่วนใหญ่ เช่น Python, Node, Ruby, Terraform ในรูปแบบเดียวกัน
    • ยังสามารถเปิดใช้งาน Python virtual environment ได้ด้วย
  • แชร์เวิร์กโฟลว์บน macOS

    • ดาวน์โหลด Python binary ที่ต้องการจาก python.org และใช้ virtualenv เพื่อตั้งค่า virtual environment
    • ใช้ pyproject.toml และ pip-compile ในการจัดการโปรเจกต์
    • แม้พื้นที่การจัดการโปรเจกต์ Python จะเปลี่ยนไปมาก แต่เวิร์กโฟลว์นี้ช่วยให้มองข้ามการเปลี่ยนแปลงเหล่านั้นได้ทั้งหมด
 
edunga1 2024-03-26

มีรูปแบบความล้มเหลวที่อาจเกิดขึ้นได้มากมายอย่างยิ่งในสถานการณ์นี้

ตรงนี้ดูเหมือนจะเป็นจุดที่ทรมานมากจริง ๆ