ทำไมการสร้างแอป Python แบบ Standalone ถึงเป็นเรื่องยาก

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

นี่คือปัญหาที่พบได้บ่อย การแพ็ก Python ให้เป็นไฟล์เดียวที่ทำงานได้ทุกที่นั้นเป็นเรื่องยาก และมันไม่ใช่แค่เรื่องของการขาดไฟล์ requirements เท่านั้น

ปัญหานี้เริ่มต้นจากวิธีการทำงานของ Python

Python เป็นภาษาแบบ dynamic ซึ่งจะมีการตัดสินใจหลายอย่างในขณะที่โปรแกรมกำลังทำงาน มันสามารถ import library ได้ทันที (on the fly) และสามารถเปลี่ยนวิธีการทำงานของฟังก์ชันในขณะที่กำลังประมวลผลได้

ภาษาแบบ Compiled อย่าง Go หรือ Rust จะตัดสินใจทุกอย่างก่อนที่โปรแกรมจะเริ่มทำงาน พวกมันจะตัดโค้ดที่ไม่ได้ใช้งานออกเพื่อให้ได้ไฟล์ที่มีขนาดเล็กและทำงานได้รวดเร็ว

Python ไม่สามารถทำแบบนั้นได้ คุณไม่สามารถคาดเดาได้ง่ายๆ ว่าโค้ดของคุณจะต้องใช้ส่วนไหนของ runtime บ้าง เพื่อให้มั่นใจว่ามันจะทำงานได้ คุณจึงต้องรวม Python runtime ทั้งหมดเข้าไปด้วย

สิ่งนี้ก็นำไปสู่ปัญหาเรื่อง library

ในภาษาอื่นๆ คอมไพเลอร์จะใช้เทคนิค tree-shaking เพื่อทำให้ไฟล์มีขนาดเล็ก แต่ Python ไม่สามารถใช้เทคนิคนี้ได้ คุณต้องรวมทุก dependency และทุก sub-dependency เข้าไปด้วย รวมถึงต้องรวมไฟล์ binary ที่ผ่านการ compile แล้วด้วย สิ่งนี้ทำให้สคริปต์เล็กๆ ของคุณกลายเป็นแพ็กเกจขนาด 300MB ได้เลย

คุณมีทางเลือกหลักๆ อยู่ 3 ทาง:

  • กำหนดให้เครื่องปลายทางต้องมี Python ติดตั้งอยู่ วิธีนี้ใช้ได้กับนักพัฒนา แต่ใช้ไม่ได้กับผู้ใช้งานทั่วไป
  • รวม interpreter เข้าไปด้วย เครื่องมืออย่าง PyInstaller หรือ Nuitka จะแพ็ก runtime เข้าไปในแอปของคุณ โดย PyInstaller เป็นที่นิยมมาก ส่วน Nuitka จะแปลงโค้ดของคุณเป็นภาษา C เพื่อเพิ่มความเร็ว
  • ใช้ Docker วิธีนี้ให้ความน่าเชื่อถือสูงสุดเพราะรวมไปถึงเลเยอร์ของระบบปฏิบัติการทั้งหมดด้วย ซึ่งเหมาะสำหรับเซิร์ฟเวอร์ แต่จะทำให้ไฟล์มีขนาดใหญ่

เครื่องมือใหม่อย่าง PyApp เป็นทางเลือกสายกลาง โดยใช้ launcher ขนาดเล็กเพื่อดาวน์โหลด Python เวอร์ชันที่ถูกต้องมาให้คุณ

วิธีการเลือก:

• สำหรับทีมเทคนิค: ใช้ virtual environment และไฟล์ requirements • สำหรับผู้ที่ไม่ใช่นักพัฒนา: ใช้ PyInstaller ซึ่งเป็นวิธีที่ผ่านการทดสอบมามากที่สุด • สำหรับเซิร์ฟเวอร์และ data pipelines: ใช้ Docker เพราะในกรณีนี้ความน่าเชื่อถือสำคัญกว่าขนาดไฟล์ • สำหรับแอปบนเดสก์ท็อปที่เน้นความเร็ว: ใช้ Nuitka

Python จะไม่เปลี่ยนธรรมชาติหลักของตัวเองเพื่อแก้ปัญหานี้ ภาษาจะยังคงความเป็น dynamic ต่อไป เราจึงต้องพึ่งพาเครื่องมือที่ดีขึ้นเพื่อลดช่องว่างนี้

ที่มา: https://dev.to/azadarjoe/why-standalone-python-apps-are-so-hard-to-build-3g31