Các 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 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 không tự động bị 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 quá trình tái cấu trúc cấp tệp.
Trước hết, bạn có thể kết thúc việc đẩy mã chỉ hoạt động trên máy của bạn chứ không phải của ai khác. Nếu bạn có các tham chiếu lơ lửng đến các tệp bạn đã xóa, những 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 theo cách thủ công vì tệp .pyc có thể được sử dụng trong quá trình nhập. Điều này kết hợp với thực tế là hệ thống kiểm soát phiên bản được định cấu hình đúng sẽ chỉ đẩy tệp .py vào kho lưu trữ trung tâm, 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ứ nhập đều ổn). làm việc trên máy tính của người khác.
Thứ hai, bạn có thể gặp một số lỗi khá khủng khiếp nếu bạn biế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ó __init__.py
tệp) thành một mô-đun (tệp .py), các tệp .pyc đã từng đại diện cho gói đó vẫn còn. Đặc biệt, __init__.pyc
hài cốt. Vì vậy, nếu bạn có gói foo với một số mã không quan trọng, sau đó hãy xóa gói đó và tạo tệp foo.py với một số chức năng def bar(): pass
và chạy:
from foo import bar
bạn lấy:
ImportError: cannot import name bar
vì python vẫn đang sử dụng các tệp .pyc cũ từ gói foo, không có thanh định nghĩa nào trong số đó. Điều này có thể đặc biệt có vấn đề trên một máy chủ web, nơi mã hoạt động hoàn toàn có thể bị hỏng do tệp .pyc.
Do cả hai lý do này (và có thể cả những lý do khác), mã triển khai và mã thử nghiệm của bạn sẽ xóa các tệp .pyc, chẳng hạn như với dòng bash sau:
find . -name '*.pyc' -delete
Ngoài ra, kể từ python 2.6, bạn có thể chạy python với -B
cờ để không sử dụng tệp .pyc. Xem Cách tránh tệp .pyc? để biết thêm chi tiết.
Xem thêm: Làm cách nào để xóa tất cả các tệp .pyc khỏi một dự án?
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ụngfind . -name '*.pyc' -delete
thay thế