Tệp Python PYC là gì?

Mô-đun cung cấp chức năng tạo tệp mã byte từ tệp nguồn và một chức năng khác được sử dụng khi tệp nguồn mô-đun được gọi dưới dạng tập lệnh

Mặc dù không thường xuyên cần thiết, chức năng này 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 có thể không có quyền ghi các tệp bộ đệm mã byte trong thư mục chứa mã nguồn

ngoại lệ py_compile. PyCompileError

Ngoại lệ xuất hiện khi xảy ra lỗi trong khi cố gắng biên dịch tệp

py_compile. biên dịch(tệp , cfile=Không có , dfile=Không có , doraise=Sai , tối ưu hóa=- 1 , invalidation_mode=PycInvalidationMode. DẤU THỜI GIAN , yên lặng=0)

Biên dịch tệp nguồn thành mã byte và ghi tệp bộ đệm mã byte. Mã nguồn được tải từ tệp có tên tệp. Mã byte được ghi vào cfile, mặc định là đường dẫn PEP 3147/PEP 488, kết thúc bằng .pyc. Ví dụ: nếu tệp là /foo/bar/baz.py cfile sẽ mặc định là /foo/bar/__pycache__/baz.cpython-32.pyc cho Python 3. 2. Nếu dfile được chỉ định, thì nó được sử dụng thay vì tệp làm tên của tệp nguồn mà từ đó các dòng nguồn được lấy để hiển thị trong truy nguyên ngoại lệ. Nếu doraise là true, a được nâng lên khi gặp lỗi trong khi biên dịch tệp. Nếu doraise là sai (mặc định), một chuỗi lỗi được ghi vào sys.stderr, nhưng không có ngoại lệ nào được đưa ra. Hàm này trả về đường dẫn đến tệp được biên dịch theo byte, tôi. e. bất kỳ giá trị cfile nào đã được sử dụng

Các đối số doraise và silence xác định cách xử lý lỗi trong khi biên dịch tệp. Nếu yên tĩnh là 0 hoặc 1 và doraise là sai, hành vi mặc định được bật. một chuỗi lỗi được ghi vào sys.stderr và hàm trả về None thay vì một đường dẫn. Nếu doraise là đúng, thay vào đó a được nâng lên. Tuy nhiên, nếu yên tĩnh là 2, không có tin nhắn nào được viết và doraise không có tác dụng

Nếu đường dẫn mà cfile trở thành (được chỉ định rõ ràng hoặc được tính toán) là một liên kết tượng trưng hoặc tệp không thông thường, sẽ được nâng lên. Điều này nhằm cảnh báo rằng quá trình nhập sẽ biến các đường dẫn đó thành các tệp thông thường nếu nó được phép ghi các tệp được biên dịch theo byte vào các đường dẫn đó. Đây là tác dụng phụ của việc nhập bằng cách đổi tên tệp để đặt tệp được biên dịch theo byte cuối cùng vào vị trí nhằm ngăn các sự cố ghi tệp đồng thời

tối ưu hóa kiểm soát mức độ tối ưu hóa và được chuyển đến chức năng tích hợp. Giá trị mặc định của py_compile2 chọn mức độ tối ưu hóa của trình thông dịch hiện tại

invalidation_mode phải là một thành viên của enum và kiểm soát cách thức bộ đệm mã byte được tạo bị vô hiệu hóa khi chạy. Giá trị mặc định là nếu biến môi trường py_compile5 được đặt, nếu không thì giá trị mặc định là

Đã thay đổi trong phiên bản 3. 2. Đã thay đổi giá trị mặc định của cfile thành tuân thủ PEP 3147. Mặc định trước đó là tệp + py_compile7 (_______6_______8 nếu bật tính năng tối ưu hóa). Cũng đã thêm tham số tối ưu hóa.

Đã thay đổi trong phiên bản 3. 4. Đã thay đổi mã để sử dụng cho việc ghi tệp bộ đệm mã byte. Điều này có nghĩa là ngữ nghĩa tạo/ghi tệp hiện khớp với những gì hiện có, e. g. quyền, ngữ nghĩa ghi và di chuyển, v.v. Cũng đã thêm cảnh báo được nêu ra nếu cfile là một liên kết tượng trưng hoặc tệp không thông thường.

Đã thay đổi trong phiên bản 3. 7. Thông số invalidation_mode đã được thêm vào như được chỉ định trong PEP 552. Nếu biến môi trường py_compile5 được đặt, invalidation_mode sẽ buộc phải.

Đã thay đổi trong phiên bản 3. 7. 2. Biến môi trường py_compile5 không còn ghi đè giá trị của đối số invalidation_mode và thay vào đó xác định giá trị mặc định của nó.

Đã thay đổi trong phiên bản 3. 8. Tham số yên tĩnh đã được thêm vào.

lớp py_compile. Chế độ vô hiệu hóa Pyc

Bảng liệt kê các phương thức khả thi mà trình thông dịch có thể sử dụng để xác định xem tệp mã byte có được cập nhật với tệp nguồn hay không. Tệp .pyc cho biết chế độ vô hiệu mong muốn trong tiêu đề của nó. Xem để biết thêm thông tin về cách Python vô hiệu hóa các tệp .pyc khi chạy

Mới trong phiên bản 3. 7

DẤU THỜI GIAN

Tệp .pyc bao gồm dấu thời gian và kích thước của tệp nguồn, mà Python sẽ so sánh với siêu dữ liệu của tệp nguồn trong thời gian chạy để xác định xem tệp .pyc có cần được tạo lại hay không

CHECKED_HASH

Tệp .pyc bao gồm một hàm băm của nội dung tệp nguồn, mà Python sẽ so sánh với nguồn trong thời gian chạy để xác định xem tệp .pyc có cần được tạo lại hay không

UNCHECKED_HASH

Giống như, tệp .pyc bao gồm hàm băm của nội dung tệp nguồn. Tuy nhiên, trong thời gian chạy, Python sẽ giả định rằng tệp .pyc đã được cập nhật và hoàn toàn không xác thực tệp .pyc đối với tệp nguồn

Tùy chọn này hữu ích khi /foo/bar/baz.py5 được cập nhật bởi một số hệ thống bên ngoài Python như hệ thống xây dựng

Giao diện dòng lệnh

Mô-đun này có thể được gọi dưới dạng tập lệnh để biên dịch một số tệp nguồn. Các tệp có tên trong tên tệp được biên dịch và mã byte kết quả được lưu vào bộ đệm theo cách thông thường. Chương trình này không tìm kiếm cấu trúc thư mục để định vị các tệp nguồn; . Trạng thái thoát là khác không nếu một trong các tệp không thể được biên dịch

. -

Đối số vị trí là các tệp để biên dịch. Nếu /foo/bar/baz.py6 là tham số duy nhất, danh sách các tệp được lấy từ đầu vào tiêu chuẩn

Tại sao. Tệp PYC được tạo bằng Python?

Khi tệp nguồn Python (mô-đun) được nhập trong quá trình thực thi lần đầu tiên , tùy chọn thích hợp. tệp pyc được tạo tự động. Nếu cùng một mô-đun được nhập lại, thì mô-đun đã được tạo. tập tin pyc được sử dụng.

Python có cần PYC để chạy không?

tệp pyc không được biên dịch theo nghĩa chặt chẽ nhất của thuật ngữ, vì nó không phải là mã máy gốc. Như @tomdachi đã viết, mã byte dành riêng cho python (rất giống với Java. class), đó là lý do nó vẫn cần trình thông dịch python để thực thi . trên thực tế, pyc chỉ được tạo khi bạn nhập tệp py.

tôi có thể xóa. Tệp PYC?

các tệp pyc từ một thư mục. Bạn có thể sử dụng lệnh find (trên OS X và Linux) để định vị tất cả. các tệp pyc, sau đó sử dụng tùy chọn xóa để xóa chúng . Rõ ràng, điều này có thể được sử dụng cho bất kỳ loại tệp nào bạn muốn xóa, không chỉ.

tôi có nên kiểm tra. Tệp PYC?

Các tệp này là các phiên bản được biên dịch của mã đã có trong repo, để Python có thể thực thi mã nhanh hơn. Vì chúng là kết quả tính toán trực tiếp của mã nguồn thực tế nên không có ích lợi gì khi kiểm tra chúng - chúng chỉ cần được cập nhật mỗi khi mã nguồn .