8 คะแนน โดย waveware 2025-05-31 | 2 ความคิดเห็น | แชร์ทาง WhatsApp

ขอแนะนำ zimport สำหรับเวลาที่การจัดการแพ็กเกจ Python มีไฟล์จำนวนมหาศาลจนกลายเป็นภาระ

บทนำ

  • zimport เป็นเครื่องมือที่ใช้แทนและปรับปรุง zipimport มาตรฐานของ Python
  • zimport ใช้สำหรับโหลดและจัดการแพ็กเกจ Python จาก zip-archives กล่าวคือ สามารถจัดการแพ็กเกจ Python ได้คล้ายกับ Java jar นอกจากนี้ยังรองรับการโหลดไลบรารีแบบไดนามิก (.dll, .pyd, .so)
  • หลังจากสร้างเครื่องมือนี้ขึ้นมา ไดเรกทอรีงาน Python ของผมลดลงจากประมาณ 160GB กับไฟล์หลายล้านไฟล์ เหลือระดับ 80GB และประมาณ 10,000 ไฟล์

ฟีเจอร์หลัก

  • รองรับการโหลดไลบรารีแบบไดนามิกจาก zip-archive (.pyd, .dll, .so, .dylib)
  • รองรับการอ่านไฟล์ภายใน (เช่น ไฟล์ environment) ระหว่าง read() ภายใน zip-archive คล้าย getresource ของ Java
  • รองรับไฟล์ .pyc ที่คอมไพล์แล้ว (name.cpython-version.pyc และโฟลเดอร์ __pycache__)

เทคโนโลยีที่ใช้

  • importlib, meta_path, path_hooks
  • function intercept (open, stat, read, ctypes.WinDLL, ctypes.CDLL มาตรฐาน เป็นต้น)

สภาพแวดล้อมการใช้งาน

  • รองรับ Python บน win/linux/macosx
  • รองรับ Python เวอร์ชัน 3.8~3.12

วิธีใช้งาน

python -m pip install zimport
import zimport

  • เพียงบีบอัดแพ็กเกจทั้งหมดในไดเรกทอรี lib/site-package แล้วเพิ่มเข้าไปใน sys.path ก็ทำงานได้ตามปกติ
  • แน่นอนว่า หากคุณมีเวลา จะบีบอัดแยกตามแต่ละแพ็กเกจ แล้วเพิ่มแพ็กเกจลงใน sys.path ตาม dependency เหมือน jar ของ Java ก็ได้
  • อีกทั้งแพ็กเกจที่บีบอัดแล้วหนึ่งครั้งยังสามารถนำไปแชร์ใช้ร่วมกันได้ จึงช่วยลดการสิ้นเปลืองพื้นที่ฮาร์ดดิสก์ได้

สุดท้ายนี้

  • ซอร์สโค้ดถูกเผยแพร่ไว้บน GitHub และเวอร์ชันปัจจุบันคือ 0.1.4 โดยยังมีบางแพ็กเกจ (เช่น transformers) ที่ยังไม่รองรับ แต่ได้ยืนยันแล้วว่าแพ็กเกจหลักอย่าง torch, torchvision, numpy, pandas ทำงานได้โดยไม่มีปัญหา

https://github.com/waveware4ai/zimport

  • นอกจากนี้ยังเข้ากันได้ดีกับ portable Python ซึ่งผมก็อัปโหลดไว้บน GitHub เช่นกัน เวอร์ชัน Linux คอมไพล์ขึ้นมาเอง ส่วนเวอร์ชัน Windows ดัดแปลงมาจาก embedded

https://github.com/waveware4ai/PortablePython

  • หากพบบั๊กหรือปัญหาในการใช้งาน รบกวนช่วยรายงานเข้ามา แล้วผมจะปรับปรุงให้ดีขึ้น

ขอบคุณครับ ขอให้เป็นวันที่ดี

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

 
waveware 2025-06-11
  • ได้แก้ไขให้สามารถทำงานได้แล้ว หลังมีการสอบถามเกี่ยวกับการ import ของแพ็กเกจอย่าง av ที่ใช้ cython
    หากมีแพ็กเกจอื่นที่ยังใช้งานไม่ได้ กรุณาแจ้งรายงานเข้ามา แล้วจะดำเนินการแก้ไขให้ครับ
 
waveware 2025-06-02
  • ตอนนี้รองรับแพ็กเกจ transformers แล้ว
    เดิมทีเป้าหมายคือทำให้ Wan2.1 บนพื้นฐาน ComfyUI (https://github.com/kijai/ComfyUI-WanVideoWrapper, https://github.com/Wan-Video/Wan2.1) ทำงานได้แบบพกพา แต่เมื่อกี้เพิ่งแก้ไขซอร์สที่เกี่ยวข้องกับ transformers เสร็จ และพอลองให้ทำงานด้วย zimport ก็ใช้งานได้ดีครับ
    ขอบคุณที่ใช้งานครับ
    https://github.com/waveware4ai/zimport