web-dev-qa-db-fra.com

Qu'est-ce que __pycache__?

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? 

431
user2063042

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").

361
scott_fakename

__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 && ...'
122
F. Malina

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.

17
Aleks. S.

__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,

  • cela rend votre programme un peu plus rapide
  • vous pouvez généralement simplement l'ignorer

La documentation python explique plus en détail comment cela fonctionne et pourquoi il existe:

  • Il a été ajouté dans python 3.2 car le système existant de conservation des fichiers .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 .
11
FluxLemur

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 nom module.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éé.

3
Yossarian42

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.

2
Marcus Thornton

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)

1
Shashidhar Yalagi

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.

0
TechFree