Когда обновляются файлы с кэшированным Python (pyc) в Python?
Иногда я запускаю юниттест в определенной модели, указывая на make PYTHON_TEST=path_of_module_to_test test
и если этот модуль path_of_module_to_test test
импортирует какой-либо другой модуль python, который был обновлен, будет ли импортирование, выполненное из этого модуля, извлечено из обновленного исходного файла py или из не обновленного файла pyc, или импорт приведет к обновлению зависимого файла pyc?
1 ответ
От PEP 3147:
CPython компилирует свой исходный код в "байтовый код" и по соображениям производительности кэширует этот байтовый код в файловой системе всякий раз, когда в исходном файле происходят изменения. Это значительно ускоряет загрузку модулей Python, поскольку этап компиляции можно обойти. Если исходный файл - foo.py, CPython кэширует байт-код в файле foo.pyc рядом с исходным кодом.
Если ваш источник меняется; CPython перекомпилирует и повторно кэширует байт-код.
Обратите внимание, что выше для Python 2.x
, Это все изменилось в Python 3.x
в Python 3.2: PEP 3147: каталоги репозитория PYC
Примечание. Когда мы ссылаемся на "CPython", здесь мы имеем в виду реализацию Python, которую вы, скорее всего, используете на https://www.python.org/ поскольку это поведение (я считаю) зависит от конкретной реализации.