Когда обновляются файлы с кэшированным 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/ поскольку это поведение (я считаю) зависит от конкретной реализации.

Другие вопросы по тегам