• วิธีใช้ uv กับสคริปต์ Python เพื่อสร้าง สคริปต์แบบรันได้เองที่พร้อมใช้งานทันทีโดยไม่ต้องติดตั้ง dependencies ล่วงหน้า
  • เป็นแนวทางเชิงปฏิบัติที่เกิดขึ้นจากสถานการณ์ที่ใช้สคริปต์ Python สำหรับทดสอบ API ในโปรเจกต์ Go

ข้อจำกัดของวิธีเดิม

  • หากต้องการรันสคริปต์ Python ที่ใช้แพ็กเกจอย่าง httpx, IPython, loguru เป็นต้น ก่อนหน้านี้ต้องเลือกอย่างใดอย่างหนึ่งต่อไปนี้
    • ติดตั้งแพ็กเกจลงในระบบ Python โดยตรง
    • สร้าง virtual environment แล้วติดตั้งแพ็กเกจก่อนรัน
  • ทั้งสองวิธีล้วนยุ่งยาก อาจส่งผลต่อสภาพแวดล้อมของระบบ และเมื่อต้องแชร์ให้ผู้อื่นก็มักต้องอธิบายขั้นตอนยาวขึ้น

รันสคริปต์ได้ง่ายขึ้นด้วย uv

  • uv เป็นตัวจัดการแพ็กเกจ Python และเป็นเครื่องมือทดแทน pip ที่ช่วยให้รันสคริปต์ Python ใน สภาพแวดล้อมแบบแยกขาด ได้
  • สามารถระบุ ข้อมูล dependencies ไว้ภายในสคริปต์เอง ได้ผ่านคอมเมนต์ # /// script
    # /// script  
    # dependencies = ["ipython", "httpx", "loguru"]  
    # ///  
    
  • สคริปต์ที่มีการตั้งค่านี้สามารถรันได้ด้วยคำสั่งต่อไปนี้:
    uv run jam_users.py  
    
  • uv จะจัดการสร้าง virtual environment ชั่วคราว ติดตั้งแพ็กเกจที่จำเป็น และรันสคริปต์ให้โดยอัตโนมัติในครั้งเดียว

ทำให้เป็นสคริปต์ที่รันได้โดยตรง

  • แม้จะทำให้รันได้เหมือนสคริปต์ Python ทั่วไปด้วย #!/usr/bin/env python ได้ แต่วิธีนี้จะไม่รู้จักคอมเมนต์ script ของ uv
  • จึงแก้ปัญหาได้ด้วยการใส่คำสั่ง uv ลงใน shebang โดยตรงดังนี้
    #!/usr/bin/env -S uv run --script  
    # /// script  
    # dependencies = ["ipython", "httpx", "loguru"]  
    # ///  
    
  • วิธีนี้สามารถ chmod +x แล้วรันได้โดยตรง และบนระบบยูนิกซ์อื่น ๆ ก็ยังทำงานได้เหมือนเดิมหากมี uv ติดตั้งอยู่:
    ./jam_users.py  
    

ข้อดีและการนำไปใช้

  • แนวทางของ uv มีประโยชน์มากเมื่อจำเป็นต้องส่งต่อสคริปต์ให้ผู้อื่น
  • ไม่ต้องตั้งค่าล่วงหน้าที่ซับซ้อน เพราะแพ็กเกจและสภาพแวดล้อมที่ต้องใช้จะถูกจัดเตรียมให้อัตโนมัติ
  • ไม่ทำให้ system Python หรือสภาพแวดล้อมแบบ global ปนเปื้อน
  • สคริปต์เพียงไฟล์เดียวก็จัดการได้ทั้งการรันและการดูแล dependencies

ผู้เขียนอธิบายว่าในอดีตเคยมีประสบการณ์ที่ต้องส่งสคริปต์ Python ให้คนอื่นพร้อมคำอธิบายการติดตั้งที่ซับซ้อน แต่ตอนนี้สามารถแก้ปัญหานี้ได้อย่างง่ายดายด้วย uv

  • มีประสิทธิภาพทั้งกับสคริปต์ทดสอบขนาดเล็กและสคริปต์อัตโนมัติที่ใช้ในงานจริง

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น