Je comprends que les fichiers ".pyc" sont des versions compilées des fichiers ".py" en texte brut, créés au moment de l'exécution pour accélérer l'exécution des programmes. Cependant, j'ai observé quelques choses:
- Lors de la modification des fichiers "py", le comportement du programme change. Cela indique que les fichiers "py" sont compilés ou au moins passent par une sorte de processus de hachage ou comparent les horodatages afin de dire s'ils doivent ou non être recompilés.
- Lors de la suppression de tous les fichiers ".pyc" (
rm *.pyc
), le comportement du programme changera parfois. Ce qui indiquerait qu'ils ne sont pas compilés lors de la mise à jour des ".py".
Des questions:
- Comment décident-ils du moment de la compilation?
- Existe-t-il un moyen de s'assurer qu'ils ont des contrôles plus stricts pendant le développement?
python
python-internals
pyc
Aaron Schif
la source
la source
rm *.pyc
. Cela ne supprimera pas les fichiers .pyc dans les dossiers imbriqués. Utiliser à lafind . -name '*.pyc' -delete
placeRéponses:
Les
.pyc
fichiers sont créés (et éventuellement écrasés) uniquement lorsque ce fichier python est importé par un autre script. Si l'importation est appelée, Python vérifie si l'.pyc
horodatage interne du fichier n'est pas plus ancien que le.py
fichier correspondant . Si c'est le cas, il charge le.pyc
; si ce n'est pas le cas ou si le.pyc
n'existe pas encore, Python compile le.py
fichier en a.pyc
et le charge.Qu'entendez-vous par «contrôle plus strict»?
la source
rm *.pyc
. Je sais que si je force tous les fichiers à être recréés, certains problèmes sont résolus, indiquant que les fichiers ne sont pas recompilés par eux-mêmes. Je suppose que s'ils utilisent les horodatages, il n'y a aucun moyen de rendre ce comportement plus strict, mais le problème persiste..pyc
horodatage doit être plus ancien que l'.py
horodatage correspondant pour déclencher une recompilation.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 fonctiondef bar(): pass
et exécutez:vous obtenez:
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:
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?
la source
__init__.py
fichier) ...". Ce serait un package, pas un module.__init__.pyc
restes. - Comment venir? Comme un paquet est un répertoire, la suppression d'un paquet signifie la suppression du répertoire donc il n'y a plus de fichiers….pyc
problème est également une raison: dépendances cachées sur les niveaux de correctifs du système d'exploitation et des utilitaires,.so
fichiers , fichiers de configuration, autres bibliothèques Python (si vous ne travaillez pas dans un environnement virtuel), obscur env vars ... la liste est longue. Pour être minutieux et trouver tous ces problèmes, vous devez faire une copie propre de votre code dans un référentiel git ou le publier en tant que package sur un serveur de style PyPi, et effectuer un clonage complet ou une configuration sur une nouvelle machine virtuelle. Certains de ces problèmes potentiels rendent ce.pyc
problème pâle en comparaison.