Я знал, что файл .pyc
генерируется интерпретатором python и содержит байтовый код, как это сказал question.
Я думал, что интерпретатор python использует метку времени, чтобы определить, является ли .pyc
более новым, чем .py
, и если это так, пропустил его компиляцию при выполнении. (Способ создания make файла)
Итак, я сделал тест, но, похоже, я ошибся.
- Я написал
t.py
содержитprint '123'
иt1.py
содержитimport t
. Запуск командыpython t1.py
дал результат123
и сгенерированныйt.pyc
, все как ожидалось. - Затем я отредактировал
t.py
какprint '1234'
и обновил отметку времениt.pyc
с помощьюtouch t.pyc
. - Запустите
python t1.py
снова, я думал, что получаю123
, но1234
в самом деле. Таким образом, казалось, что интерпретатор python все еще знал, чтоt.py
обновляется.
Затем я задавался вопросом, будет ли интерпретатор python компилироваться и генерировать t.pyc
каждый раз при запуске python t1.py
. Но когда я запускал python t1.py
несколько раз, я обнаружил, что t.pyc
не будет обновляться, если t.py
не обновляется.
Итак, мой вопрос: как интерпретатор python знает, когда компилировать и обновлять файл .pyc
?
Обновление
Так как интерпретатор python использует временную метку, хранящуюся в файле .pyc
. Я думаю, что это запись о том, когда .pyc
был в последний раз обновлен. И при импорте сравните его с меткой времени файла .py
.
Итак, я попытался взломать его таким образом: измените время работы ОС на более старый и отредактируйте файл .py
.
Я думал, что при импорте снова .py
кажется старше, чем .pyc
, и интерпретатор python не будет обновлять .pyc
. Но я снова ошибся.
Итак, интерпретатор python сравнивает эти две временные метки не по старому или новному пути, а точно так же?
В прямолинейном эквиваленте я означает, что временная метка в .pyc
записывает, когда последний раз был изменен .py
. При импорте он сравнивает временную метку с текущей меткой времени .py
, если она не то же самое, перекомпилируйте и обновите .pyc
.