Nuitka: แปลง Python ให้เป็นไฟล์โปรแกรมสำเร็จรูป (แต่มีเงื่อนไขนะ!)

หลายคนใช้ Python เขียนโปรแกรมกันเยอะใช่ปะ คือมันก็ดีนะ เขียนง่าย prototype ไวดี แต่บางทีมันก็ติดเรื่อง performance หรือไม่ก็อยาก deploy ไปให้คนอื่นใช้แบบที่เครื่องเขาไม่ต้องมานั่งลง Python ทั้งก้อนอ่ะดิ

ทีนี้มันมี Nuitka เนี่ยแหละ มาช่วยตอบโจทย์ตรงนี้แหละ คือมันแปลง Python code ของเราให้เป็น C/C++ แล้วคอมไพล์เป็น executable เลย เหมือนโปรแกรมทั่วไปที่เรากดๆ รันได้เลยอ่ะ

ทำไมต้อง Nuitka?

  • Performance: อันนี้คือไฮไลท์เลย พอเป็น native code มันก็รันเร็วกว่า interpreter เยอะแน่นอน
  • Deployment ง่าย: ได้ไฟล์ .exe (บน Windows) หรือไฟล์รันได้มาเลย ก็เอาไปแจกให้คนอื่นใช้ได้เลย ไม่ต้องห่วงเรื่องเวอร์ชั่น Python หรือ dependency บนเครื่องปลายทางมากนัก
  • Protect Source Code: อันนี้ก็อาจจะข้อดีทางอ้อมนิดนึง คือมันไม่ใช่ .pyc ไฟล์ที่แกะง่ายๆ แล้วไง โค้ดเราก็ไม่เป็นไฟล์ plain text ให้ใครมาเปิดดูได้ตรงๆ ละ

ลองใช้ดูดิ๊!

อันดับแรกก็ติดตั้งก่อนเลย ผ่าน pip นี่แหละ

pip install nuitka

สมมติเรามีไฟล์ Python ง่ายๆ ชื่อ my_calc.py แบบนี้:

# my_calc.py
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

if __name__ == "__main__":
    num = 10
    print(f"Factorial of {num} is: {factorial(num)}")

    # ลองใส่ input จากผู้ใช้บ้าง
    try:
        user_num = int(input("Enter a number for factorial calculation: "))
        print(f"Factorial of {user_num} is: {factorial(user_num)}")
    except ValueError:
        print("Invalid input. Please enter an integer.")

การคอมไพล์ก็ใช้คำสั่งนี้เลย ถ้าอยากได้เป็นไฟล์เดียวจบนะ (onefile):

python -m nuitka --onefile --output-dir=build my_calc.py

รอมันแป๊บนึงนะ ถ้าโค้ดเราเล็กๆ ก็ไม่นานมาก ถ้าโปรเจคใหญ่ๆ ก็รอกันยาวๆ ไปเลยแหละ

พอเสร็จแล้ว ไปดูในโฟลเดอร์ build ที่เราสั่งให้มันสร้างไว้ ก็จะเห็นไฟล์ executable ของเราอยู่ในนั้นแหละ เช่น my_calc.exe บน Windows หรือ my_calc บน Linux/macOS

ทีนี้มาถึงความจริงที่ไม่ได้สวยหรูเสมอไป...

คือมันไม่ได้ง่ายแบบนั้นเสมอไปนะ เคยเจอเหมือนกันที่บาง library มันไม่ยอมถูก bundle เข้าไปดีๆ เช่นพวกที่มันมี C extension เยอะๆ หรือพวกที่มัน dynamic load อะไรบางอย่าง คือคอมไพล์แล้วรันไม่ได้เลย!

ตัวอย่าง error จริงที่เคยเจอ:

ตอนนั้นผมลองคอมไพล์โปรเจค Flask เล็กๆ ที่มันมีใช้ SQLAlchemy กับ Jinja2 ด้วย กะว่าจะให้มันเป็นไฟล์เดียวรันได้เลย ไปวางบนเครื่อง server ที่ไม่ได้ลง Python ไว้ แต่พอรันไฟล์ .exe ที่ได้มาเท่านั้นแหละ เจอ error ประมาณนี้เลย:

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Temp\_MEIxxxxxx\my_flask_app.py", line 5, in <module>
ModuleNotFoundError: No module named 'flask_sqlalchemy'

หรือบางทีก็เป็น error ที่มันหา template file ของ Jinja2 ไม่เจอ เพราะว่า Nuitka มันไม่รู้ว่าต้อง include ไฟล์พวกนี้มาด้วยอัตโนมัติไง

ตอนนั้นคือต้องมานั่ง debug ว่า Nuitka มัน detect dependency ได้ครบไหม ซึ่งบางทีมันก็ไม่ครบไงครับ ต้องมานั่งเพิ่ม --follow-imports หรือ --include-package เองเลย บางทีก็ต้องใช้ --nofollow-imports บางโมดูลที่มันดึงมาเกินจำเป็นอีก คือวุ่นวายเอาเรื่องนะ

แล้วก็เรื่องขนาดไฟล์นะ ถ้าโปรเจคใหญ่ๆ มีหลาย package มี third-party library เยอะๆ นี่คือไฟล์มันบวมมากก บางทีเป็นร้อยเมกก็มีนะ! ซึ่งก็แอบขัดใจนิดๆ กับขนาดที่ใหญ่ขึ้นเยอะ

ความเห็นส่วนตัวนะ:

คือถ้าจะใช้ Nuitka จริงจังนะ ต้องลองกับโปรเจคเล็กๆ ก่อน แล้วค่อยขยับไปโปรเจคใหญ่ๆ มันไม่ได้เหมาะกับทุกเคสหรอกครับ

สำหรับโปรเจคที่ performance สำคัญจริงๆ หรืออยากทำเป็น CLI tool ง่ายๆ ที่ให้คนอื่นรันได้เลยแบบไม่ต้องลง Python อันนี้เวิร์คอยู่

แต่ถ้าโปรเจคใหญ่ๆ มี GUI มี complex dependency เยอะๆ นี่อาจจะปวดหัวเอาเรื่อง เพราะต้องมานั่งจูน option เยอะมาก แถมคอมไพล์นานอีกด้วย (บางทีเป็นชั่วโมงเลยถ้าโค้ดใหญ่จริงๆ)

สรุปก็คือ Nuitka มันเป็นอีกทางเลือกที่น่าสนใจสำหรับ dev Python ที่อยาก push performance หรืออยาก distribute app แบบง่ายๆ แต่ก็ต้องพร้อมเจอความท้าทายเล็กน้อยเหมือนกันนะ 😅 ไม่ได้โรยด้วยกลีบกุหลาบเสมอไปหรอก แต่ถ้าแก้ได้ มันก็เจ๋งอยู่!

Read more

รมว.พลังงาน ปรับส่วนต่าง E20 ห่างโซฮอล์ 95 ลิตรละ 3 บาท กระตุ้นคนไทยใช้พลังงานสะอาด พร้อมขอความร่วมมือประหยัดไฟ

รมว.พลังงาน ปรับส่วนต่าง E20 ห่างโซฮอล์ 95 ลิตรละ 3 บาท กระตุ้นคนไทยใช้พลังงานสะอาด พร้อมขอความร่วมมือประหยัดไฟ

รมว.พลังงาน ประกาศปรับส่วนต่าง E20 ห่างโซฮอล์ 95 เป็น 3 บาท กระตุ้นใช้เชื้อเพลิงชีวภาพ พร้อมรณรงค์คนไทยประหยัดพลังงาน สร้างความมั่นคงพลังงานของชาติ

By ทีมงาน devdog
DMC: จากปรากฏการณ์ดนตรีระดับโลกสู่แสงธรรมนำทางชีวิต

DMC: จากปรากฏการณ์ดนตรีระดับโลกสู่แสงธรรมนำทางชีวิต

สำรวจสองความหมายสำคัญของ DMC! จาก Run-DMC ผู้บุกเบิกการร่วมงานฮิปฮอป-ร็อกที่พลิกโฉมวงการ สู่ dmc.tv ช่องธรรมะนำทางจิตใจเพื่อสันติสุขภายใน.

By ทีมงาน devdog
PM 2.5 กลับมาคลุ้ง! เปิด 12 อันดับค่าฝุ่นสูงสุดในกรุงเทพมหานคร

PM 2.5 กลับมาคลุ้ง! เปิด 12 อันดับค่าฝุ่นสูงสุดในกรุงเทพมหานคร

อัปเดตสถานการณ์ PM 2.5 ในกรุงเทพฯ ประจำวันที่ 10 มี.ค. 2569 พร้อมเปิด 12 เขตค่าฝุ่นสูงสุด และคำแนะนำป้องกันผลกระทบต่อสุขภาพ

By ทีมงาน devdog
One Piece Netflix ภาค 2: การผจญภัยสู่แกรนด์ไลน์ พร้อมกิจกรรมสุดอลังการที่สวนลุมฯ!

One Piece Netflix ภาค 2: การผจญภัยสู่แกรนด์ไลน์ พร้อมกิจกรรมสุดอลังการที่สวนลุมฯ!

One Piece Netflix ซีซัน 2 "มุ่งหน้าสู่แกรนด์ไลน์" เตรียมลงจอ 10 มี.ค. 2569 พร้อมกิจกรรม "GRAND LINE IN THAILAND" ที่สวนลุมพินี ห้ามพลาด!

By ทีมงาน devdog