Tôi biết rằng tệp .pyc
được tạo bởi trình thông dịch python và chứa mã byte như thế này question cho biết.Trình thông dịch python biết khi biên dịch và cập nhật tệp .pyc như thế nào?
Tôi nghĩ trình thông dịch python đang sử dụng dấu thời gian để phát hiện xem .pyc
có mới hơn .py
hay không và bỏ qua khi biên dịch lại khi thực thi. (Cách thức makefile làm)
Vì vậy, tôi đã làm một thử nghiệm, nhưng có vẻ như tôi đã sai.
- tôi đã viết
t.py
chứa vàt1.py
chứaimport t
. Lệnh chạypython t1.py
cho kết quả123
và được tạot.pyc
, tất cả như mong đợi. - Sau đó, tôi đã chỉnh sửa
t.py
làmprint '1234'
và cập nhật dấu thời gian củat.pyc
bằng cách sử dụngtouch t.pyc
. - Chạy
python t1.py
một lần nữa, tôi nghĩ tôi sẽ nhận được123
nhưng1234
thực sự. Vì vậy, có vẻ như thông dịch viên trăn vẫn biết rằngt.py
được cập nhật.
Sau đó, tôi tự hỏi liệu trình thông dịch python sẽ biên dịch và tạo t.pyc
mỗi lần chạy python t1.py
. Nhưng khi tôi chạy python t1.py
nhiều lần, tôi thấy rằng t.pyc
sẽ không được cập nhật khi t.py
không được cập nhật.
Vì vậy, câu hỏi của tôi là: cách trình thông dịch python biết khi nào biên dịch và cập nhật tệp .pyc
?
Cập nhật
Từ trăn dịch viên đang sử dụng dấu thời gian lưu trữ trong tập tin .pyc
. Tôi nghĩ rằng đó là một bản ghi khi .pyc
được cập nhật lần cuối. Và khi được nhập, hãy so sánh nó với dấu thời gian của tệp .py
.
Vì vậy, tôi đã cố gắng để hack nó theo cách này: thay đổi thời gian hệ điều hành để một cũ hơn, và chỉnh sửa .py
tập tin. Tôi nghĩ khi được nhập lại, .py
có vẻ cũ hơn .pyc
và trình thông dịch trăn sẽ không cập nhật .pyc
. Nhưng tôi lại sai.
Vì vậy, trình thông dịch python có so sánh hai dấu thời gian này không theo cách cũ hơn hoặc mới hơn nhưng theo cách chính xác không?
Trong một cách exectly bình đẳng, tôi có nghĩa là dấu thời gian trong .pyc
ghi lại khi .py
được sửa đổi lần cuối. Khi được nhập, nó so sánh dấu thời gian với dấu thời gian hiện tại của .py
, nếu nó không giống nhau, biên dịch lại và cập nhật .pyc
.
@JonathonReinhart: Tôi muốn nói trùng lặp thực sự, đặc biệt vì câu hỏi đó chứa câu trả lời: Dấu thời gian được tư vấn là không phải dấu thời gian của hệ thống tệp, nhưng dấu thời gian nội bộ được lưu trữ trong tệp '.pyc'. –
@TimPietzcker Đồng ý, đó chỉ là nhận xét được tạo tự động. Nếu tôi chỉ có một trong số họ * có huy hiệu vàng lạ mắt * Tôi sẽ đánh dấu nó trùng lặp ngay lập tức :-) –
Tuy nhiên, +1 cho câu hỏi, vì nỗ lực sáng tạo đã đi vào nó - tôi chưa bao giờ nghĩ về điều gì xảy ra nếu bạn sửa đổi dấu thời gian của tệp. –