tệp .pyc được tạo bất cứ khi nào các phần tử mã tương ứng được nhập và cập nhật nếu các tệp mã tương ứng đã được cập nhật. Nếu các tệp .pyc bị xóa, chúng sẽ tự động được tạo lại. Tuy nhiên, chúng được không tự động xóa khi các tệp mã tương ứng bị xóa.
Điều này có thể gây ra một số lỗi thực sự thú vị trong các trình tái cấu trúc cấp tệp.
Trước hết, bạn có thể kết thúc đẩy mã chỉ hoạt động trên máy của bạn và không phải của người khác. Nếu bạn có các tham chiếu lơ lửng đối với các tệp bạn đã xóa, các tệp này sẽ vẫn hoạt động cục bộ nếu bạn không xóa các tệp .pyc có liên quan do tệp .pyc có thể được sử dụng trong nhập. Điều này là phức tạp với thực tế là một hệ thống điều khiển phiên bản được cấu hình đúng sẽ chỉ đẩy các tệp .py vào kho lưu trữ trung tâm, chứ không phải tệp .pyc, có nghĩa là mã của bạn có thể vượt qua "kiểm tra nhập" (mọi thứ đều ổn) chỉ tốt và không làm việc trên máy tính của người khác.
Thứ hai, bạn có thể có một số lỗi khá khủng khiếp nếu bạn chuyển các gói thành mô-đun. Khi bạn chuyển đổi một gói (một thư mục có tệp __init__.py
) thành một mô-đun (tệp .py), tệp .pyc đã từng đại diện cho gói đó vẫn còn. Cụ thể, __init__.pyc
vẫn còn. Vì vậy, nếu bạn có foo gói với một số mã mà không quan trọng, sau đó xóa gói đó và tạo ra một foo.py tập tin với một số chức năng def bar(): pass
và chạy:
from foo import bar
bạn nhận được:
ImportError: cannot import name bar
vì python vẫn đang sử dụng tệp .pyc cũ từ gói foo, không có thanh nào trong số đó xác định thanh.Điều này có thể đặc biệt có vấn đề trên máy chủ web, nơi mã hoạt động hoàn toàn có thể bị hỏng do tệp .pyc.
Theo kết quả của cả những lý do này (và có thể những người khác), mã triển khai của bạn và mã thử nghiệm nên xóa file pyc, chẳng hạn như với các dòng sau của bash:
find . -name '*.pyc' -delete
Ngoài ra, tính đến python 2.6, bạn có thể chạy python với cờ -B
để không sử dụng các tệp .pyc. Xem How to avoid .pyc files? để biết thêm chi tiết.
Xem thêm: How do I remove all .pyc files from a project?
Cẩn thận với xóa pyc file với 'rm * .pyc'. Thao tác này sẽ không xóa các tệp .pyc trong các thư mục lồng nhau. Sử dụng 'tìm. -name '* .pyc' -delete' thay vì – Zags
Có lẽ một lưu ý về câu hỏi của bạn: Chương trình không chạy nhanh hơn khi được đọc từ tệp '.pyc' hoặc '.pyo' hơn khi được đọc từ tập tin '.py'; điều duy nhất nhanh hơn về các tệp ‘.pyc’ hoặc ‘.pyo’ là tốc độ tải chúng. [link] (http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html) – maggie
@maggie sự khác biệt giữa thời gian tải và thời gian thực hiện là gì? –