Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Biên dịch byte thư viện Python


Python là một ngôn ngữ dựa trên trình thông dịch. Tuy nhiên, nó nội bộ biên dịch mã nguồn thành bytecode khi chạy một tập lệnh (phần mở rộng .py) và sau đó phiên bản bytecode sẽ tự động bị xóa. Khi một mô-đun (ngoại trừ các mô-đun tích hợp sẵn đã được biên dịch trước) được nhập lần đầu tiên, phiên bản biên dịch của nó cũng được tự động xây dựng nhưng được lưu với phần mở rộng .pyc trong thư mục __pycache__. Các lần gọi import cùng một mô-đun lần sau sẽ không biên dịch lại mà sử dụng phiên bản đã xây dựng sẵn.

Tuy nhiên, một tập tin tập lệnh Python với phần mở rộng .py có thể được biên dịch tường minh mà không cần chạy nó. Mô-đun py_compile chứa hàm compile() cho mục đích này. Tên file .pyc kết quả được nối thêm số phiên bản của Python. Trong trường hợp Python 3.7, tên có hậu tố cpython-37.

Bạn thường không cần mô-đun này. Tuy nhiên, nó có thể hữu ích khi cài đặt các mô-đun để sử dụng chung, đặc biệt nếu một số người dùng không có quyền ghi các file cache bytecode trong thư mục chứa mã nguồn.

Mô-đun có giao diện dòng lệnh. Nó có thể được nhập bằng cách sử dụng chuyển đổi -m như sau:

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

Thao tác này sẽ tạo và lưu file hello.cpython-37.pyc trong thư mục con __pycache__.

Biên dịch bytecode cũng có thể được thực hiện theo chương trình bằng hàm compile() trong mô-đun py_compile.

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

File bytecode với phần mở rộng .pyc có thể được thực thi trực tiếp từ dòng lệnh giống như tập lệnh thông thường với phần mở rộng .py.

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

Tuy nhiên, nó chỉ có thể được thực thi bởi trình thông dịch cùng phiên bản với phiên bản đã biên dịch file bytecode. Nếu chúng ta cố gắng chạy nó với bất kỳ phiên bản Python nào khác, lỗi sau sẽ được hiển thị:

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

Mô-đun py_compile có một hàm khác là main() để biên dịch nhiều file nguồn. Các file được đặt tên làm đối số sẽ được biên dịch và bytecode kết quả được lưu trữ theo cách thông thường. Hàm này không tìm kiếm cấu trúc thư mục để định vị các file nguồn; nó chỉ biên dịch các file được chỉ định tường minh.

Mô-đun cũng định nghĩa ngoại lệ PyCompileError được ném ra khi xảy ra lỗi trong quá trình cố gắng biên dịch file. (Ngoại lệ này chỉ được ném ra nếu tùy chọn doraise được đặt thành True cho hàm compile().

Tùy chọn optimize của hàm compile() kiểm soát mức độ tối ưu hóa và được truyền cho hàm tích hợp sẵn compile(). Giá trị mặc định -1 chọn mức độ tối ưu hóa của trình thông dịch hiện tại.