Fichiers .pyc générés à chaque fois que les éléments de code correspondants sont importés, et mis à jour si les fichiers de code correspondants ont été mis à jour. Si les fichiers .pyc sont supprimés, ils seront automatiquement régénérés. Cependant, ils sont pas automatiquement supprimés lorsque les fichiers de code correspondants sont supprimés.
Cela peut provoquer des bogues très amusants lors des remaniements au niveau des fichiers.
Tout d'abord, vous pouvez vous retrouver à pousser du code qui ne fonctionne que sur votre machine et sur celle de personne d'autre. Si vous avez des références à des fichiers que vous avez supprimés, elles fonctionneront toujours localement si vous ne supprimez pas manuellement les fichiers .pyc correspondants, car les fichiers .pyc peuvent être utilisés dans les importations. Ceci est aggravé par le fait qu'un système de contrôle de version correctement configuré ne pousse que les fichiers .py vers le dépôt central, et non les fichiers .pyc, ce qui signifie que votre code peut très bien passer le "test d'importation" (tout est bien importé) et ne pas fonctionner sur l'ordinateur de quelqu'un d'autre.
Deuxièmement, vous pouvez avoir des bogues assez terribles si vous transformez des paquets en modules. Lorsque vous convertissez un paquet (un dossier avec une extension __init__.py
) en un module (un fichier .py), les fichiers .pyc qui représentaient ce paquet restent. En particulier, les fichiers __init__.pyc
reste. Ainsi, si vous avez le paquetage foo avec du code qui n'a pas d'importance, vous supprimez ensuite ce paquetage et créez un fichier foo.py avec une certaine fonction def bar(): pass
et courir :
from foo import bar
vous obtenez :
ImportError: cannot import name bar
car python utilise toujours les anciens fichiers .pyc du paquet foo, dont aucun ne définit bar. Cela peut s'avérer particulièrement problématique sur un serveur web, où un code totalement fonctionnel peut se briser à cause des fichiers .pyc.
En raison de ces deux raisons (et peut-être d'autres), votre code de déploiement et votre code de test doivent supprimer les fichiers .pyc, comme avec la ligne suivante de bash :
find . -name '*.pyc' -delete
De plus, à partir de python 2.6, vous pouvez exécuter python avec l'option -B
pour ne pas utiliser les fichiers .pyc. Voir Comment éviter les fichiers .pyc ? pour plus de détails.
Voir aussi : Comment supprimer tous les fichiers .pyc d'un projet ?