Qu'est-ce que __pycache__?

653

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

Que faisons-nous avec le __pycache__dossier? 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 d'être créé, à quoi sert-il?

user2063042
la source
29
"Est-ce ce que nous donnons aux gens au lieu de notre code source?" - Non, vous leur donnez le code source dans un joli package installable afin qu'il soit facile à utiliser.
Lennart Regebro
79
Personne n'a encore mentionné, mais votre définition de cache est bizarre. Le cache est tout simplement un composant qui stocke les données afin que les demandes futures pour ces données puissent être traitées plus rapidement .
Ricardo Cruz
4
Voir: python.org/dev/peps/pep-3147
Mr_and_Mrs_D
1
Puisque Python 3.8vous pouvez utiliser une variable d'environnement pour modifier l'emplacement des répertoires de cache ennuyeux: stackoverflow.com/a/57414308/1612318
Rotareti
Un cache est quelque chose qui conserve une copie des choses au cas où vous en auriez besoin à nouveau, pour vous éviter d'avoir à revenir à l'original pour l'obtenir. Il est conçu pour être plus rapide que d'aller à l'endroit d'origine. Cela pourrait être plus rapide car il n'a pas à prétraiter ou à compiler les informations. Il peut également s'agir d'un stockage plus rapide, par exemple un cache disque dans la RAM ou un cache Web sur un disque local. Ce n'est pas par nature crypté (bien qu'il puisse parfois l'être), et ce n'est pas toujours un "fichier de fichiers similaires" - il peut s'agir d'un fichier, d'une charge de fichiers, d'un bloc de RAM, etc.
rjmunro

Réponses:

519

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 __pycache__dossier. 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 .pyc ou .pyo. Il s'agit respectivement des versions compilées en bytecode et optimisées en bytecode des fichiers de votre programme.

En tant que programmeur, vous pouvez simplement l'ignorer ... Tout ce qu'il fait est de faire démarrer votre programme un peu plus rapidement. Lorsque vos scripts changent, ils seront recompilés et si vous supprimez les fichiers ou le dossier entier et exécutez à nouveau votre programme, ils réapparaîtront (sauf si vous supprimez spécifiquement ce comportement)

Si vous utilisez cpython (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, consiste à définir la variable d'environnement PYTHONDONTWRITEBYTECODEsur n'importe quelle valeur (selon la page de manuel de python, toute "chaîne non vide").

scott_fakename
la source
48
Vous pouvez également ajouter la variable d'environnement PYTHONDONTWRITEBYTECODE=<any_value>pour la supprimer définitivement.
Mark Tolonen
11
Juste pour clarifier, c'est uniquement pour Python 3, n'est-ce pas?
Joe J
11
@JoeJ oui, je pense que c'est vrai. python2place les fichiers compilés dans le même répertoire que les originaux, si je ne me trompe pas.
scott_fakename
27
Une mise en garde IMPORTANTE est que le fichier .pyc mis en cache sera utilisé à la place du fichier .py si le fichier .py est manquant. En pratique, cela ne se produit que si vous supprimez (ou renommez) des modules, ce n'est donc pas une occurrence courante, mais si certaines choses continuent d'être "là", après vous être gratté la tête, exécutez find. -name * .pyc | xargs rm sur votre source est probablement une bonne première réaction.
yacc143
34
find . -name '*.pyc' -deleteOui, find a un indicateur pour supprimer les fichiers trouvés, vous n'avez donc pas besoin d'utiliser de shananigans xargs
vlad-ardelean
175

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

Je ne recommande pas de supprimer régulièrement ces fichiers ou de supprimer la 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 en cas de besoin car le bytecode peut devenir périmé dans les cas marginaux (voir commentaires).

Les programmeurs Python ignorent généralement le bytecode. En effet __pycache__et ce *.pycsont des lignes communes à voir dans les .gitignorefichiers. Le bytecode n'est pas destiné à la distribution et peut être démonté à l'aide du dismodule .


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 *.pycpour Python 2.

Cela définit un indicateur sur tous ces répertoires (fichiers .pyc) indiquant au Finder / Textmate 2 de les exclure des listes. Surtout, le bytecode est là, il est juste caché.

Réexécutez 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, bienvenue dans le script batch):

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

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


L'exécution de tests unitaires est un scénario (plus dans les commentaires) où la suppression des *.pycfichiers et des __pycache__dossiers est en effet utile. J'utilise les lignes suivantes dans mon ~/.bash_profileet je cours juste clpour nettoyer en cas de besoin.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'
saut de ligne
la source
Cela ne serait-il pas annulé à chaque exécution du code?
Holloway
2
@DoTheEvo: il n'est tout simplement pas créé, il n'y a donc pas d'accélération lors du prochain chargement du module. Aucune erreur n'est déclenchée.
Petr Viktorin
7
Ce n'est pas une bonne réponse. Le demandeur veut savoir à quoi servent ces fichiers. Cette réponse dit "ne vous inquiétez pas" et les fait disparaître.
intéressant de noter que
36
Absolument la peine de les supprimer : ce n'est pas inutile. Python ne détectera heureusement pas les modifications de fichiers et exécutera un fichier cache dans de nombreuses circonstances, vous faisant monter le mur avec "pourquoi le f ne fonctionne toujours pas, j'ai changé le code, pourquoi échoue-t-il toujours sur les appels inexistants". Surtout dans les frameworks de test, pycache-by-default est le pire.
Mike 'Pomax' Kamermans
2
Je ne suis pas d'accord avec ce conseil de "ne pas prendre la peine de supprimer ces fichiers" - j'ai vu cela recommandé plusieurs fois, plus récemment par "How To Python" de Kenneth Reitz ("l'astuce du bytecode")
Louis Maddox
38

Un __pycache__dossier est créé lorsque vous utilisez la ligne:

import file_name

ou essayez d'obtenir des informations à partir d'un autre fichier que vous avez créé. Cela le rend un peu plus rapide lors de la deuxième exécution de votre programme pour ouvrir l'autre fichier.

Aleks. S.
la source
27

Réponse mise à jour à partir de 3,7+ documents:

Pour accélérer le chargement des modules, Python met en cache la version compilée de chaque module dans le __pycache__répertoire 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.3 de CPython, la version compilée de spam.py serait mise en cache en tant que __pycache__/spam.cpython-33.pyc. Cette convention de dénomination permet aux modules compilés de différentes versions et de différentes versions de Python de coexister.

Source: https://docs.python.org/3/tutorial/modules.html#compiled-python-files

Autrement dit, ce répertoire est généré par Python et existe pour accélérer l'exécution de vos programmes. Il ne doit pas être dédié au contrôle de code source et doit coexister en paix avec votre code source local.


__pycache__est un répertoire qui contient des fichiers de cache de bytecode qui sont générés automatiquement par python, à savoir des .pycfichiers python compilés ou . Vous vous demandez peut-être pourquoi Python, un langage "interprété", a des fichiers compilés. Cette question SO répond à cela (et cela vaut vraiment la peine de lire cette réponse ).

Les documents python expliquent plus en détail comment cela fonctionne et pourquoi il existe:

  • Il a été ajouté en python 3.2 parce que le système existant de gestion des .pycfichiers dans le même répertoire a causé divers problèmes, comme lorsqu'un programme était exécuté avec des interprètes Python de différentes versions. Pour les caractéristiques complètes, voir PEP 3174 .
FluxLemur
la source
5

à partir des modules officiels de tutoriel python

Pour accélérer le chargement des modules, Python met en cache la version compilée de chaque module dans le __pycache__répertoire 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 en tant que __pycache__/spam.cpython-36.pyc.

à partir de la FAQ de programmation de Python doc

Lorsqu'un module est importé pour la première fois (ou lorsque le fichier source a changé depuis la création du fichier compilé en cours), un fichier .pyc contenant le code compilé doit être créé dans un __pycache__sous - répertoire du répertoire contenant le .pyfichier. Le .pycfichier aura un nom de fichier qui commence par le même nom que le .pyfichier et se termine .pycpar un composant intermédiaire qui dépend du binaire python particulier qui l'a créé.

Yossarian42
la source
5

L'exécution d'un script python entraînerait la génération du code d'octets en mémoire et sa conservation jusqu'à l'arrêt du programme. Dans le cas où un module est importé, pour une réutilisation plus rapide, Python créerait un fichier cache .pyc (PYC est 'Python' 'Compilé') où 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 (compiler une fois, exécuter la politique plusieurs fois) lorsqu'ils sont réimportés.

Le nom du fichier est le même que le nom du module. La partie après le point initial indique l'implémentation Python qui a créé le cache (pourrait être CPython) suivie de son numéro de version.

TechFree
la source
3

L'interpréteur python compile le fichier de script * .py et enregistre les résultats de la compilation dans le __pycache__répertoire.

Lorsque le projet est exécuté à nouveau, si l'interpréteur identifie que le script * .py n'a pas été modifié, il ignore l'étape de compilation et exécute le fichier * .pyc généré précédemment stocké dans le __pycache__dossier.

Lorsque le projet est complexe, vous pouvez raccourcir le temps de préparation avant d'exécuter le projet. Si le programme est trop petit, vous pouvez ignorer cela en utilisantpython -B abc.py l' Boption.

Marcus Thornton
la source
3

Python version 2.x aura .pyc lorsque l'interpréteur compilera le code.

Python version 3.x aura __pycache__ lorsque l'interpréteur compilera le code.

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$
Alok Tiwari
la source
2

Dans 3.2 et versions 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ù vos fichiers source résident avec des noms de fichiers qui identifient la version Python qui les a créés (par exemple script.cpython-33.pyc)

Shashidhar Yalagi
la source
Comment puis-je éviter la création du dossier " pycache " et tous les .pyc doivent être nommés de la même manière que le fichier .py?
Ashwani
1

Lorsque vous importez un module ,

import file_name

Python stocke le bytecode compilé dans le __pycache__répertoire afin que les futures importations puissent l'utiliser directement, plutôt que d'avoir à analyser et compiler à nouveau la source.

Il ne le fait pas uniquement pour l'exécution d'un script, uniquement lorsqu'un fichier est importé.

(Les versions précédentes stockaient le bytecode mis en cache sous forme de fichiers .pyc qui jonchent le même répertoire que les fichiers .py, mais à partir de Python 3, ils ont été déplacés vers un sous-répertoire pour rendre les choses plus ordonnées.)

PYTHONDONTWRITEBYTECODE ---> Si ce paramètre est défini sur une chaîne non vide, Python n'essaiera pas d'écrire des fichiers .pyc lors de l'importation des modules source. Cela équivaut à spécifier l'option -B.

Ehsan Barkhordar
la source