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

ไลบรารี Python ที่คอมไพล์ไบต์


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

อย่างไรก็ตาม ไฟล์สคริปต์ Python ที่มีนามสกุล .py สามารถคอมไพล์ได้โดยไม่ต้องเรียกใช้ 'py_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")

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

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

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

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

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

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

ตัวเลือกการปรับให้เหมาะสมของฟังก์ชันคอมไพล์ () ควบคุมระดับการปรับให้เหมาะสมและถูกส่งไปยังฟังก์ชันคอมไพล์ () ในตัว ค่าดีฟอลต์ของ -1 จะเลือกระดับการปรับให้เหมาะสมของล่ามปัจจุบัน