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 ne sont pas automatiquement supprimés lorsque les fichiers de code correspondants sont supprimés.
Cela peut provoquer des bugs vraiment amusants lors des refactors au niveau des fichiers.
Tout d'abord, vous pouvez finir par pousser du code qui ne fonctionne que sur votre machine et sur personne d'autre. Si vous avez des références en suspens à des fichiers que vous avez supprimés, celles-ci fonctionneront toujours localement si vous ne supprimez pas manuellement les fichiers .pyc pertinents, car les fichiers .pyc peuvent être utilisés dans les importations. Cela est aggravé par le fait qu'un système de contrôle de version correctement configuré ne poussera que les fichiers .py vers le référentiel central, pas les fichiers .pyc, ce qui signifie que votre code peut passer le "test d'importation" (tout est-il bien importé) très bien et non travailler sur l'ordinateur de quelqu'un d'autre.
Deuxièmement, vous pouvez avoir des bugs assez terribles si vous transformez des paquets en modules. Lorsque vous convertissez un package (un dossier avec un __init__.py
fichier) en un module (un fichier .py), les fichiers .pyc qui représentaient autrefois ce package restent. En particulier, les __init__.pyc
restes. Donc, si vous avez le package foo avec un code qui n'a pas d'importance, supprimez plus tard ce package et créez un fichier foo.py avec une fonction def bar(): pass
et exécutez:
from foo import bar
vous obtenez:
ImportError: cannot import name bar
car python utilise toujours les anciens fichiers .pyc du package foo, dont aucun ne définit bar. Cela peut être particulièrement problématique sur un serveur Web, où un code totalement fonctionnel peut être interrompu à cause de fichiers .pyc.
En raison de ces deux raisons (et éventuellement 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' -B
indicateur pour ne pas utiliser de fichiers .pyc. Voir Comment éviter les fichiers .pyc? pour plus de détails.
Voir aussi: Comment supprimer tous les fichiers .pyc d'un projet?
rm *.pyc
. Cela ne supprimera pas les fichiers .pyc dans les dossiers imbriqués. Utiliser à lafind . -name '*.pyc' -delete
place