Qu'est-ce que __pycache__ ?

D'après ce que je comprends, un cache est un fichier crypté de fichiers similaires.

Que faisons-nous avec le dossier __pycache__ ? Est-ce que c'est ce que nous donnons aux gens à la place de notre code source ? C'est juste mes données d'entrée ? Ce dossier continue à être créé, à quoi sert-il ?

Lorsque vous exécutez un programme en python, l'interpréteur le compile d'abord en bytecode (c'est une simplification excessive) et le stocke dans le dossier __pycache__. Si vous regardez là-dedans, vous trouverez un tas de fichiers partageant les noms des fichiers .py dans le dossier de votre projet, seulement leurs extensions seront soit .pyc soit .pyo. Il s'agit de versions compilées en bytecode et optimisées en bytecode des fichiers de votre programme, respectivement.

En tant que programmeur, vous pouvez largement l'ignorer... Tout ce que cela fait, c'est que votre programme démarre un peu plus vite. Lorsque vos scripts sont modifiés, ils sont recompilés, et si vous supprimez les fichiers ou le dossier entier et que vous exécutez à nouveau votre programme, ils réapparaîtront (à moins que vous ne supprimiez spécifiquement ce comportement).

Si vous utilisez cpython (ce qui est le plus courant, car c'est l'implémentation de référence) et que vous ne voulez pas de ce dossier, vous pouvez le supprimer en démarrant l'interpréteur avec l'indicateur -B, par exemple

python -B foo.py

Une autre option, comme l'a noté tcaswell, est de définir la variable d'environnement PYTHONDONTWRITEBYTECODE à n'importe quelle valeur (selon la page de manuel de python, toute "chaîne de caractères non vide&quot ;).

Commentaires (11)

__pycache__ est un dossier contenant le bytecode de Python 3 compilé et prêt à être exécuté.

Je ne recommande pas de supprimer systématiquement ces fichiers ou de supprimer leur création pendant le développement car cela peut nuire aux performances. Ayez juste une commande récursive prête (voir ci-dessous) pour nettoyer quand c'est nécessaire car le bytecode peut devenir obsolète dans des cas limites (voir les commentaires).

Les programmeurs Python ignorent généralement le bytecode. En effet, __pycache__ et *.pyc sont des lignes communes à voir dans les fichiers .gitignore. Le bytecode n'est pas destiné à être distribué et peut être désassemblé en utilisant le [module dis][1].


Si vous utilisez OS X, vous pouvez facilement cacher tous ces dossiers dans votre projet en exécutant la commande suivante depuis le dossier racine de votre projet.

find . -name '__pycache__' -exec chflags hidden {} \;

Remplacez __pycache__ par *.pyc pour Python 2.

Cela place un drapeau sur tous ces répertoires (fichiers .pyc) indiquant au Finder/Textmate 2 de les exclure des listes. Il est important de noter que le bytecode est là, il est juste caché.

Relancez la commande si vous créez de nouveaux modules et souhaitez cacher le nouveau bytecode ou si vous supprimez les fichiers de bytecode cachés.


Sous Windows, la commande équivalente pourrait être (non testée, script batch bienvenu) :

dir * /s/b | findstr __pycache__ | attrib +h +s +r

Ce qui revient à parcourir les dossiers de masquage du projet en utilisant le clic droit > hide...


L'exécution de tests unitaires est un scénario (plus dans les commentaires) où la suppression des fichiers *.pyc et des dossiers __pycache__ est effectivement utile. J'utilise les lignes suivantes dans mon ~/.bash_profile et je lance simplement cl pour nettoyer quand c'est nécessaire.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'

[1] : https://docs.python.org/3.5/library/dis.html

Commentaires (10)

À partir de la version 3.2, Python enregistre les fichiers de code d'octet compilé .pyc dans un sous-répertoire nommé __pycache__ situé dans le répertoire où se trouvent vos fichiers sources avec des noms de fichiers qui identifient la version de Python qui les a créés (par exemple script.cpython-33.pyc).

Commentaires (0)