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" ;).
__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 && ...'
À 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).