1098 votes

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 d'être créé, à quoi sert-il ?

54 votes

"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 pour faciliter son utilisation.

174 votes

Personne n'en a encore parlé, mais votre définition de cache est bizarre. Le cache est tout simplement un composant qui stocke des données pour que les futures demandes de ces données puissent être servies plus rapidement.

10 votes

948voto

scott_fakename Points 822

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 dedans, vous trouverez un tas de fichiers portant les noms des fichiers .py de votre projet, seulement leurs extensions seront soit .pyc ou .pyo. Ce sont respectivement des versions bytecode compilées et bytecode compilées optimisées de vos fichiers de programme.

En tant que programmeur, vous pouvez largement l'ignorer.

Tout ce qu'il fait, c'est rendre votre programme un peu plus rapide au démarrage. 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).

Lorsque vous envoyez votre code à d'autres personnes, la pratique habituelle est de supprimer ce dossier, mais cela n'a pas vraiment d'importance que vous le fassiez ou non. Lorsque vous utilisez un contrôle de version (git), ce dossier est généralement répertorié dans le fichier d'ignorance (.gitignore) et donc non inclus.

.gitignore

__pycache__

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 le drapeau -B, par exemple

python -B foo.py

Une autre option, comme indiqué par tcaswell, est de définir la variable d'environnement PYTHONDONTWRITEBYTECODE sur n'importe quelle valeur (selon la page de manuel de Python, n'importe quelle "chaîne non vide").

74 votes

Vous pouvez également ajouter la variable d'environnement PYTHONDONTWRITEBYTECODE= pour la supprimer définitivement.

19 votes

Juste pour clarifier, ceci est uniquement pour Python 3, n'est-ce pas?

16 votes

@JoeJ oui, je pense que c'est vrai. python2 place les fichiers compilés dans le même répertoire que les fichiers originaux, si je ne me trompe pas.

245voto

line break Points 1169

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

Je ne recommande pas de supprimer laborieusement ces fichiers de manière routinière ou de supprimer leur création pendant le développement car cela gaspille votre temps. Ayez simplement une commande récursive prête (voir ci-dessous) pour nettoyer lorsque nécessaire car le bytecode peut devenir obsolète dans des cas particuliers (voir commentaires).

Les programmeurs Python ignorent généralement le bytecode. En effet, __pycache__ et *.pyc sont des lignes courantes à voir dans les fichiers .gitignore. Le bytecode n'est pas destiné à être distribué et peut être désassemblé en utilisant le 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) indiquant à Finder/Textmate 2 de les exclure des listes. Il est important de noter que le bytecode est toujours présent, il est simplement masqué.

Réexécutez la commande si vous créez de nouveaux modules et souhaitez masquer le nouveau bytecode ou si vous supprimez les fichiers de bytecode masqués.


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

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

C'est la même chose que de parcourir le projet en masquant les dossiers en utilisant clic droit > masquer...


L'exécution de tests unitaires est un scénario (plus de détails dans les commentaires) où supprimer les fichiers *.pyc et les dossiers __pycache__ est en effet utile. J'utilise les lignes suivantes dans mon ~/.bash_profile et j'exécute simplement cl pour le nettoyage lorsque nécessaire.

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

et plus récemment

# pip install pyclean
pyclean .

0 votes

Est-ce que cela ne serait pas annulé à chaque fois que vous exécutez le code ?

0 votes

Non, je viens de tester sur Python 2 et 3 pour vérifier à nouveau. Il ne sera annulé que si vous supprimez les fichiers cachés. Ensuite, vous devez l'exécuter à nouveau.

0 votes

Que se passerait-il s'il n'y a pas de permission pour créer ces fichiers dans le répertoire où le fichier .py est lancé ? Par exemple, Linux /usr/share/...

90voto

Aleks. S. Points 375

Un dossier __pycache__ est créé lorsque vous utilisez la ligne :

import nom_fichier

ou si vous essayez d'obtenir des informations à partir d'un autre fichier que vous avez créé. Cela rend l'exécution de votre programme un peu plus rapide lorsqu'il est exécuté une deuxième fois pour ouvrir l'autre fichier.

43voto

FluxLemur Points 441

Réponse mise à jour à partir de la documentation 3.7+ :

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 encode le format du fichier compilé; il contient généralement le numéro de version de Python. Par exemple, dans la version CPython 3.3, la version compilée de spam.py serait mise en cache en tant que __pycache__/spam.cpython-33.pyc. Cette convention de nommage permet aux modules compilés de différentes versions de publication et 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 commité dans le contrôle de 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 automatiquement générés par python, à savoir des fichiers python compilés, ou .pyc. Vous vous demandez peut-être pourquoi Python, un langage "interprété", a des fichiers compilés du tout. Cette question SO aborde cela (et ça vaut vraiment la peine de lire cette réponse).

La documentation python va plus en profondeur sur exactement comment cela fonctionne et pourquoi cela existe :

  • Il a été ajouté dans python 3.2 parce que le système existant de maintenance des fichiers .pyc dans le même répertoire causait divers problèmes, comme lorsque un programme était exécuté avec des interpréteurs Python de différentes versions. Pour la spécification complète des fonctionnalités, voir PEP 3174.

0 votes

Voici la principale partie que je devais savoir: "Il ne devrait pas être commité dans le contrôle de source". Merci! J'ajoute __pycache__/ aux fichiers .gitignore de mes dépôts à la racine du dépôt maintenant pour que Git ignore tous ces répertoires __pycache__ générés automatiquement!

11voto

Ehsan Barkhordar Points 658

Lorsque vous importez un module,

import nom_fichier

Python stocke le bytecode compilé dans le répertoire __pycache__ afin que les prochains imports puissent l'utiliser directement, plutôt que de devoir le parser et le compiler à nouveau.

Il ne le fait pas simplement en exécutant un script, seulement lorsque un fichier est importé.

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

PYTHONDONTWRITEBYTECODE ---> Si cette variable est définie sur une chaîne non vide, Python n'essaiera pas d'écrire des fichiers .pyc lors de l'importation de modules sources. Cela équivaut à spécifier l'option -B.

0 votes

Y a-t-il un gain de performance si le file_name est un fichier contenant les définitions de fonctions?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X