Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การคอมไพล์ไลบรารี Python แบบไบต์โค้ด (Byte-compile)

Python เป็นภาษาที่ใช้ตัวแปล (Interpreter) แต่ภายในจะคอมไพล์โค้ดต้นทางเป็นไบต์โค้ดเมื่อรันสคริปต์ (ไฟล์ .py) และหลังจากนั้นเวอร์ชันไบต์โค้ดจะถูกลบอัตโนมัติ เมื่อมีการนำโมดูลเข้า (import) ครั้งแรก (นอกจากโมดูลสำเร็จรูปที่คอมไพล์ไว้แล้ว) เวอร์ชันที่คอมไพล์แล้วจะถูกสร้างขึ้นอัตโนมัติและบันทึกด้วยนามสกุล .pyc ในโฟลเดอร์ __pycache__ การเรียก import โมดูลเดิมซ้ำจะไม่ทำให้คอมไพล์ใหม่ แต่จะใช้ไฟล์ที่สร้างไว้แล้ว

อย่างไรก็ตาม ไฟล์สคริปต์ Python ที่มีนามสกุล .py สามารถคอมไพล์ได้โดยตรงโดยไม่ต้องรัน โมดูล py_compile มีฟังก์ชัน compile() สำหรับวัตถุประสงค์นี้ ชื่อไฟล์ .pyc ที่ได้จะต่อท้ายด้วยหมายเลขเวอร์ชันของ Python ในกรณีของ Python 3.7 ชื่อจะมีส่วนต่อท้ายว่า 'cpython-37'

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

โมดูลนี้มีอินเทอร์เฟซบรรทัดคำสั่ง สามารถนำเข้าใช้ด้วยสวิตช์ -m ดังนี้:

E:\python37>python -m py_compile hello.py

คำสั่งนี้จะสร้างและบันทึกไฟล์ 'hello.cpython-37.pyc' ในโฟลเดอร์ย่อย __pycache__

การคอมไพล์แบบไบต์โค้ดยังสามารถทำได้ผ่านโปรแกรมโดยใช้ฟังก์ชัน compile() ในโมดูล py_compile:

import py_compile
py_compile.compile("hello.py")

ไฟล์ไบต์โค้ดที่มีนามสกุล .pyc สามารถรันได้โดยตรงจากบรรทัดคำสั่งเช่นเดียวกับสคริปต์ทั่วไปที่มีนามสกุล .py:

E:\python37>python __pycache__/hello.cpython-37.pyc

อย่างไรก็ตาม ไฟล์นี้สามารถรันได้เฉพาะกับอินเทอร์พรีเตอร์เวอร์ชันเดียวกับที่ใช้คอมไพล์ หากลองรันกับ Python เวอร์ชันอื่น จะเกิดข้อผิดพลาดดังนี้:

C:\python36>python e:hello.cpython-37.pyc
RuntimeError: Bad magic number in .pyc file

โมดูล py_compile มีฟังก์ชัน main() อีกฟังก์ชันหนึ่ง ซึ่งคอมไพล์ไฟล์ต้นทางหลายไฟล์ ไฟล์ที่ระบุเป็นอาร์กิวเมนต์จะถูกคอมไพล์และไบต์โค้ดที่ได้จะถูกแคชในวิธีปกติ ฟังก์ชันนี้ไม่ค้นหาโครงสร้างไดเรกทอรีเพื่อหาไฟล์ต้นทาง แต่คอมไพล์เฉพาะไฟล์ที่ระบุชื่ออย่างชัดเจนเท่านั้น

โมดูลนี้ยังกำหนดข้อยกเว้น PyCompileError ซึ่งจะถูกยกขึ้นเมื่อเกิดข้อผิดพลาดขณะพยายามคอมไพล์ไฟล์ (จะยกขึ้นก็ต่อเมื่อตัวเลือก doraise ถูกตั้งค่าเป็น True สำหรับฟังก์ชัน compile())

ตัวเลือก optimize ของฟังก์ชัน compile() ควบคุมระดับการเพิ่มประสิทธิภาพและส่งต่อไปยังฟังก์ชัน built-in compile() ค่าเริ่มต้น -1 จะเลือกระดับการเพิ่มประสิทธิภาพของอินเทอร์พรีเตอร์ปัจจุบัน