Когда будут.файлы pyc обновилась?


Я понимаю, что ".файлы pyc-это скомпилированные версии файлов с открытым текстом.py, созданные во время выполнения для ускорения работы программ. Однако я заметил несколько вещей:

  1. при изменении файлов " py " поведение программы изменяется. Это указывает на то, что файлы" py " компилируются или, по крайней мере, идут через какой-то процесс хэширования или сравнивают временные метки, чтобы сказать, должны ли они быть повторно скомпилированы.
  2. после удаления всех ".pyc " файлы (rm *.pyc) иногда поведение программы изменится. Что указывает на то, что они не компилируются при обновлении". py " s.

вопросы:

  • как они решают, когда должен быть составлен?
  • есть ли способ гарантировать, что они имеют более строгую проверку во время разработки?
2 73

2 ответа:

The .pyc файлы создаются (и, возможно, перезаписываются) только тогда, когда этот файл python импортируется каким-либо другим скриптом. Если импорт вызывается, Python проверяет, есть ли .pyc внутренняя метка времени файла соответствует соответствующему . Если это так, он загружает .pyc; Если это не так или если .pyc еще не существует, Python компилирует на .pyc и загружает его.

что вы подразумеваете под "более жесткие проверки"?

.файлы pyc генерируются при каждом импорте соответствующих элементов кода и обновляются, если соответствующие файлы кода были обновлены. Если.pyc файлы удаляются, они будут автоматически восстановлены. Тем не менее, они не автоматически удаляется при удалении соответствующих файлов кода.

это может вызвать некоторые действительно забавные ошибки во время рефакторинга на уровне файлов.

прежде всего, вы можете в конечном итоге нажать код, который работает только на вашем если у вас есть висячие ссылки на файлы, которые вы удалили, они все равно будут работать локально, если вы не удалите вручную соответствующие .файлы pyc, потому что .pyc файлы могут быть использованы в импорте. Это усугубляется тем, что правильно настроенная система управления версиями будет только толкать файлы .py в центральный репозиторий, а не .pyc-файлы, что означает, что ваш код может пройти "тест импорта" (все ли импортируется нормально) просто отлично и не работает ни на кого другого компьютер.

во-вторых, вы можете иметь некоторые довольно ужасные ошибки, если вы превратите пакеты в модули. При преобразовании пакета (папка с __init__.py file) в модуль (файл .py), the .файлы pyc, которые когда-то представляли этот пакет, остаются. В частности,__init__.pyc остается. Итак, если у вас есть пакет foo с некоторым кодом, который не имеет значения, затем удалите этот пакет и создайте файл foo.py с некоторой функцией def bar(): pass и

from foo import bar

вы получить:

ImportError: cannot import name bar

потому что python все еще использует старый .файлы pyc из пакета foo, ни один из которых не определяет бар. Это может быть особенно проблематично на веб-сервере, где полностью функционирующий код может сломаться из-за .файлы pyc.

в результате обеих этих причин (и, возможно, других) ваш код развертывания и код тестирования должны быть удалены .файлы pyc, например, со следующей строкой bash:

find . -name '*.pyc' -delete

кроме того, начиная с python 2.6, вы можете запустить питон с -B флаг не использовать .файлы pyc. Смотрите Как избежать .файлы pyc? для более подробной информации.

Читайте также: Как удалить все .pyc файлы из проекта?