Quand sont.les fichiers pyc sont rafraîchis?

je le comprends ".pyc " les fichiers sont des versions compilées du texte brut ".les fichiers py", créés à l'exécution pour rendre les programmes plus rapides. Cependant j'ai observé quelques choses:

  1. lors de la modification des fichiers" py", modification du comportement du programme. Cela indique que les fichiers" py " sont compilés ou au moins passent par une sorte de processus de hachage ou de comparer des horodats afin de dire si oui ou non ils devraient être compilés de nouveau.
  2. sur la suppression de tous ".pyc " files ( rm *.pyc ) parfois le comportement du programme va changer. Ce qui indiquerait qu'ils ne sont pas compilés lors de la mise à jour de ".py"s.

Questions:

  • comment décident-ils quand être compilés?
  • y a-t-il un moyen de s'assurer qu'ils font l'objet d'un contrôle plus strict pendant leur développement?
73
demandé sur Martijn Pieters 2013-04-05 21:05:59

2 réponses

les fichiers .pyc ne sont créés (et éventuellement réécrits) que lorsque ce fichier python est importé par un autre script. Si l'import est appelé, Python vérifie si l'horodatage interne du fichier .pyc correspond au fichier .py correspondant. Si c'est le cas, il charge le .pyc ; si ce n'est pas, ou si le .pyc n'existe pas encore, Python compile les .py fichier dans un .pyc et le charge.

Que voulez-vous dire par "plus stricte vérification"?

64
répondu DaveTheScientist 2013-04-05 17:29:30

.fichiers pyc générés lorsque les éléments de code correspondants sont importés, et mis à jour si les fichiers de code correspondants ont été mis à jour. Si l' .pyc fichiers sont supprimés, ils seront automatiquement régénéré. Toutefois, ils sont et non automatiquement supprimés lorsque les fichiers de codes correspondants sont supprimés.

cela peut causer des bugs vraiment amusants pendant les refacteurs de niveau de fichier.

tout d'abord, vous pouvez finir pousser du code qui ne fonctionne que sur votre machine et sur celle de personne d'autre. Si vous avez des références pendantes à des fichiers que vous avez supprimés, elles fonctionneront encore localement si vous ne supprimez pas manuellement les fichiers concernés .fichiers pyc parce que .pyc fichiers peuvent être utilisés dans les importations. À cela s'ajoute le fait qu'un système de contrôle de version correctement configuré ne fera que pousser .les fichiers py vers le dépôt central, pas .fichiers pyc, ce qui signifie que votre code peut passer le "test d'importation" (est-ce que tout importation ok) juste très bien et pas le travail de quelqu'un d'autre ordinateur.

Deuxièmement, vous pouvez avoir des bogues assez terribles si vous transformez des paquets en modules. Lorsque vous convertissez un paquet (un dossier avec un __init__.py fichier) dans un module (un .py fichier), l' .les fichiers pyc qui représentaient ce paquet restent. En particulier, le __init__.pyc reste. Donc, si vous avez le paquet foo avec un code qui n'a pas d'importance, puis supprimez ce paquet et créez un fichier foo.py avec une certaine fonction def bar(): pass et exécuter:

from foo import bar

, vous obtenez:

ImportError: cannot import name bar

parce que python utilise toujours l'ancien .pyc fichiers du paquet foo, aucune définir bar. Cela peut être particulièrement problématique sur un serveur web, où le code totalement fonctionnel peut se casser à cause de .fichiers pyc.

en raison de ces deux raisons (et peut-être d'autres), votre code de déploiement et votre code de test devraient être supprimés .fichiers pyc, comme avec la ligne suivante de bash:

find . -name '*.pyc' -delete

aussi, à partir de python 2.6, vous pouvez lancer python avec le drapeau -B à ne pas utiliser .fichiers pyc. Voir Comment éviter .dossiers pyc? pour plus de détails.

voir aussi: Comment puis-je enlever tout .des fichiers pyc d'un projet?

25
répondu Zags 2017-05-23 12:10:47