Computer >> Máy Tính >  >> Lập trình >> Python

Byte-biên dịch 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ó biên dịch nội bộ mã nguồn thành mã byte khi một tập lệnh (phần mở rộng .py) được chạy và sau đó phiên bản bytecode sẽ tự động bị xóa. Khi một mô-đun (ngoài mô-đun tích hợp đượ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ạo tự động nhưng được lưu với phần mở rộng .pyc trong thư mục __pycache__. Các lệnh gọi tiếp theo để nhập lại cùng một mô-đun sẽ không biên dịch lại mô-đun thay vào đó sử dụng mô-đun đã được xây dựng.

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

Bạn sẽ không cần mô-đun này bình thường. Tuy nhiên, nó có thể hữu ích khi cài đặt mô-đun để sử dụng chung, đặc biệt nếu một số người dùng không có quyền ghi tệp bộ đệm mã byte vào 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 công tắc –m như sau

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

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

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

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

Tệp bytecode có 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 bình thường có phần mở rộng .py.

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

Tuy nhiên, nó có thể được thực thi bởi trình thông dịch cùng phiên bản mà tệp bytecode đã được biên dịch. Nếu chúng tôi 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 main () biên dịch một số tệp nguồn. Các tệp có tên là đối số được biên dịch và mã byte kết quả được lưu vào bộ nhớ cache theo cách bình thường. Chức năng này không tìm kiếm cấu trúc thư mục để định vị các tệp nguồn; nó chỉ biên dịch các tệp được đặt tên rõ ràng.

Mô-đun cũng xác định ngoại lệ PyCompileError được đưa ra khi lỗi xảy ra trong khi cố gắng biên dịch tệp. (Điều này sẽ chỉ được nâng lên nếu tùy chọn doraise được đặt thành True cho hàm compile ().

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