Файли .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
замість цього