99 votes

Quand les fichiers .pyc sont-ils actualisés ?

Je comprends que les fichiers ".pyc" sont des versions compilées des fichiers ".py" en clair, créées au moment de l'exécution pour accélérer les programmes. Cependant, j'ai observé certaines choses :

  1. 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 de comparaison d'horodatage afin de savoir s'ils doivent être recompilés ou non.
  2. Après avoir supprimé tous les fichiers ".pyc" ( rm *.pyc ), le comportement du programme peut parfois changer. Ce qui indiquerait qu'ils ne sont pas compilés lors de la mise à jour des ".py".

Questions :

  • Comment décident-ils du moment où ils doivent être compilés ?
  • Existe-t-il un moyen de s'assurer qu'ils font l'objet d'un contrôle plus strict lors du développement ?

88voto

DaveTheScientist Points 610

En .pyc 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 le fichier .pyc l'horodatage interne du fichier n'est pas plus ancien que l'horodatage correspondant de l'utilisateur. .py fichier. Si c'est le cas, il charge le fichier .pyc ; s'il ne l'est pas ou si le .pyc n'existe pas encore, Python compile le fichier .py dans un fichier .pyc et le charge.

Qu'entendez-vous par "contrôle plus strict" ?

34voto

Zags Points 582

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 ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X