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?
python
python-3.x
caching
user2063042
la source
la source
Python 3.8
vous pouvez utiliser une variable d'environnement pour modifier l'emplacement des répertoires de cache ennuyeux: stackoverflow.com/a/57414308/1612318Réponses:
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
Une autre option, comme l'a noté 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").la source
PYTHONDONTWRITEBYTECODE=<any_value>
pour la supprimer définitivement.python2
place les fichiers compilés dans le même répertoire que les originaux, si je ne me trompe pas.find . -name '*.pyc' -delete
Oui, find a un indicateur pour supprimer les fichiers trouvés, vous n'avez donc pas besoin d'utiliser de shananigans xargs__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*.pyc
sont des lignes communes à voir dans les.gitignore
fichiers. Le bytecode n'est pas destiné à la distribution et peut être démonté à l'aide dudis
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.
Remplacez
__pycache__
par*.pyc
pour 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):
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
*.pyc
fichiers et des__pycache__
dossiers est en effet utile. J'utilise les lignes suivantes dans mon~/.bash_profile
et je cours justecl
pour nettoyer en cas de besoin.la source
Un
__pycache__
dossier est créé lorsque vous utilisez la ligne: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.
la source
Réponse mise à jour à partir de 3,7+ documents:
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.pyc
fichiers 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:
.pyc
fichiers 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 .la source
à partir des modules officiels de tutoriel python
à partir de la FAQ de programmation de Python doc
la source
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.
la source
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 utilisant
python -B abc.py
l'B
option.la source
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.
la source
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)la source
Lorsque vous importez un module ,
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.
la source