Файлы .pyc, создаваемые при импорте соответствующих элементов кода, и обновляются, если соответствующие файлы кода были обновлены. Если файлы .pyc удалены, они будут автоматически восстановлены. Однако они не удаляются автоматически при удалении соответствующих файлов кода.
Это может вызвать некоторые действительно забавные ошибки во время рефакторинга на уровне файлов.
Прежде всего, вы можете отправить код, который работает только на вашем компьютере и ни на каком другом. Если у вас есть висящие ссылки на удаленные вами файлы, они все равно будут работать локально, если вы не удалите вручную соответствующие файлы .pyc, поскольку файлы .pyc можно использовать при импорте. Это усугубляется тем фактом, что правильно настроенная система контроля версий будет отправлять только файлы .py в центральный репозиторий, а не файлы .pyc, а это означает, что ваш код может пройти «тест на импорт» (все ли импортируются правильно) нормально, а не работать на чужом компьютере.
Во-вторых, вы можете столкнуться с ужасными ошибками, если превратите пакеты в модули. Когда вы конвертируете пакет (папку с __init__.py
файлом) в модуль (файл .py), файлы .pyc, которые когда-то представляли этот пакет, остаются. В частности, __init__.pyc
осталось. Итак, если у вас есть пакет foo с каким-то кодом, который не имеет значения, то позже удалите этот пакет и создайте файл foo.py с некоторой функцией def bar(): pass
и запустите:
from foo import bar
Вы получаете:
ImportError: cannot import name bar
потому что python все еще использует старые файлы .pyc из пакета foo, ни один из которых не определяет bar. Это может быть особенно проблематично на веб-сервере, где полностью работающий код может сломаться из-за файлов .pyc.
В результате обеих этих причин (и, возможно, других) ваш код развертывания и тестовый код должны удалить файлы .pyc, например, со следующей строкой bash:
find . -name '*.pyc' -delete
Кроме того, начиная с python 2.6, вы можете запускать python с -B
флагом, чтобы не использовать файлы .pyc. См. Как избежать файлов .pyc? Больше подробностей.
См. Также: Как удалить все файлы .pyc из проекта?
rm *.pyc
. Это не приведет к удалению файлов .pyc во вложенных папках. Использоватьfind . -name '*.pyc' -delete
вместо