De ce que je comprends, un cache est un fichier crypté de fichiers similaires.
Que faisons-nous avec le dossier __pycache__
? Est-ce ce que nous donnons aux gens au lieu de notre code source? Est-ce juste mes données d'entrée? Ce dossier continue à être créé, à quoi ça sert?
Lorsque vous exécutez un programme en python, l'interpréteur le compile d'abord en bytecode (il s'agit d'une simplification excessive) et le stocke dans le dossier __pycache__
. Si vous regardez dedans, vous trouverez un tas de fichiers partageant les noms des fichiers .py dans le dossier de votre projet, seules leurs extensions seront soit .pyc ou .pyo. Ce sont des versions optimisées des fichiers de votre programme, compilées en bytecode et optimisées.
En tant que programmeur, vous pouvez en grande partie l'ignorer ... Tout ce que cela fait, c'est que votre programme démarre un peu plus vite. Lorsque vos scripts changent, ils sont recompilés et si vous supprimez les fichiers ou le dossier entier et exécutez votre programme à nouveau, ils réapparaîtront (à moins que vous ne supprimiez spécifiquement ce comportement).
Si vous utilisez cpython (ce qui est le plus courant en tant qu’implémentation de référence) et que vous ne voulez pas ce dossier, vous pouvez le supprimer en démarrant l’interpréteur avec l’option -B, par exemple.
python -B foo.py
Une autre option, comme le note tcaswell, consiste à définir la variable d'environnement PYTHONDONTWRITEBYTECODE
sur n'importe quelle valeur (selon la page de manuel de python, toute "chaîne non vide").
__pycache__
est un dossier contenant le bytecode Python 3 compilé et prêt à être exécuté.
Ne supprimez pas ces fichiers et ne supprimez pas la création, cela risquerait de nuire aux performances. Ayez juste une commande récursive prête (voir ci-dessous) à nettoyer au besoin, car le bytecode peut devenir périmé dans les cas Edge (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é à la distribution et peut être désassemblé à l'aide de dis
module .
Si vous utilisez OS X, vous pouvez facilement masquer tous ces dossiers dans votre projet en exécutant la commande suivante à partir du dossier racine de votre projet.
find . -name '__pycache__' -exec chflags hidden {} \;
Remplacez __pycache__
par *.pyc
pour Python 2.
Cela définit un indicateur sur tous ces répertoires (fichiers .pyc) et indique à Finder/Textmate 2 de les exclure des listes. De manière importante, le bytecode est là, il est juste caché.
Relancez la commande si vous créez de nouveaux modules et souhaitez masquer un nouveau bytecode ou si vous supprimez les fichiers de bytecode masqués.
Sous Windows, la commande équivalente peut être (non testée, script batch bienvenu):
dir * /s/b | findstr __pycache__ | attrib +h +s +r
Ce qui revient à parcourir les dossiers du projet par un clic droit> masquer ...
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 juste cl
pour nettoyer si nécessaire.
alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc" -delete'
...
alias cl='cpy && cpc && ...'
Un dossier __pycache__ est créé lorsque vous utilisez la ligne
import file_name
ou essayez d'obtenir des informations d'un autre fichier que vous avez créé. Cela rend un peu plus rapide lors de l'exécution du programme votre deuxième fois pour ouvrir l'autre fichier.
__pycache__
est un répertoire qui contient des fichiers de cache de code intermédiaire générés automatiquement par python, à savoir des fichiers compilés en python ou .pyc
. Vous vous demandez peut-être pourquoi Python, un langage "interprété", contient des fichiers compilés. Cette SO question répond à cette question (et sa lecture vaut certainement la peine cette réponse ).
Fondamentalement,
La documentation python explique plus en détail comment cela fonctionne et pourquoi il existe:
.pyc
dans le même répertoire posait divers problèmes, notamment lorsqu'un programme était exécuté avec des interpréteurs Python de versions différentes. Pour connaître les caractéristiques complètes, voir PEP 3174 .du tutoriel officiel de python Modules
Pour accélérer le chargement des modules, Python met en cache la version compilée de chaque module dans le répertoire
__pycache__
sous le nommodule.version.pyc
, où la version code le format du fichier compilé; il contient généralement le numéro de version Python. Par exemple, dans la version 3.6 de CPython, la version compilée de spam.py serait mise en cache sous le nom__pycache__/spam.cpython-36.pyc
.
from Python doc FAQ sur la programmation
Lorsqu'un module est importé pour la première fois (ou lorsque le fichier source a changé depuis la création du fichier compilé actuel), un fichier .pyc contenant le code compilé doit être créé dans un sous-répertoire
__pycache__
du répertoire contenant le fichier.py
. Le fichier.pyc
aura un nom de fichier qui commence par le même nom que le fichier.py
et se termine par.pyc
, avec un composant du milieu qui dépend du binaire python particulier qui l'a créé.
L'interpréteur python compile le fichier de script * .py et enregistre les résultats de la compilation dans le répertoire __pycache__
.
Lorsque le projet est exécuté à nouveau, si l'interprète détermine que le script * .py n'a pas été modifié, il ignore l'étape de compilation et exécute le fichier * .pyc précédemment généré, stocké dans le dossier __pycache__
.
Lorsque le projet est complexe, vous pouvez raccourcir le temps de préparation avant l’exécution du projet. Si le programme est trop petit, vous pouvez l'ignorer en utilisant python -B abc.py
avec l'option B
.
Dans les versions 3.2 et ultérieures, Python enregistre les fichiers de code d'octets compilés .pyc dans un sous-répertoire nommé __pycache__
situé dans le répertoire où se trouvent vos fichiers source, avec des noms de fichiers identifiant la version de Python qui les a créés (exemple: script.cpython-33.pyc)
L'exécution d'un script python entraînerait la génération du code d'octet en mémoire et sa conservation jusqu'à la fermeture du programme. Si un module est importé, pour une réutilisation plus rapide, Python créerait un fichier cache .pyc (PYC est "Python" "Compilé") dans lequel le code d'octet du module importé est mis en cache. L’idée est d’accélérer le chargement des modules python en évitant la recompilation (compilation unique, exécution répétée de la stratégie) lors de la réimportation.
Le nom du fichier est identique au nom du module. La partie située après le point initial indique l'implémentation Python ayant créé le cache (pouvant être CPython), suivie de son numéro de version.