Was ist __pycache__?

650

Soweit ich weiß, ist ein Cache eine verschlüsselte Datei mit ähnlichen Dateien.

Was machen wir mit dem __pycache__Ordner? Geben wir es den Menschen anstelle unseres Quellcodes? Sind es nur meine Eingabedaten? Dieser Ordner wird ständig erstellt. Wozu dient er?

user2063042
quelle
29
"Ist es das, was wir Leuten anstelle unseres Quellcodes geben?" - Nein, Sie geben ihnen den Quellcode in einem schönen installierbaren Paket, damit es einfach zu bedienen ist.
Lennart Regebro
79
Noch niemand erwähnt, aber Ihre Definition von Cache ist bizarr. Der Cache ist ganz einfach eine Komponente, die Daten speichert, damit zukünftige Anforderungen für diese Daten schneller bearbeitet werden können .
Ricardo Cruz
4
Siehe: python.org/dev/peps/pep-3147
Mr_and_Mrs_D
1
Da Python 3.8Sie eine Umgebungsvariable verwenden können, um den Speicherort für die nervigen Cache-Verzeichnisse zu ändern : stackoverflow.com/a/57414308/1612318
Rotareti
Ein Cache ist etwas, das eine Kopie des Materials aufbewahrt, falls Sie es erneut benötigen, damit Sie nicht zum Original zurückkehren müssen, um es zu erhalten. Es ist so konzipiert, dass es schneller ist als der ursprüngliche Ort. Es ist möglicherweise schneller, da die Informationen nicht vorverarbeitet oder kompiliert werden müssen. Oder es handelt sich um eine schnellere Speicherung, z. B. einen Festplatten-Cache im RAM oder einen Web-Cache auf einer lokalen Festplatte. Es ist von Natur aus nicht verschlüsselt (obwohl es manchmal sein könnte), und es ist nicht immer eine "Datei mit ähnlichen Dateien" - es kann eine Datei, eine Ladung von Dateien, ein RAM-Block usw. sein
rjmunro

Antworten:

518

Wenn Sie ein Programm in Python ausführen, kompiliert der Interpreter es zuerst zu Bytecode (dies ist eine übermäßige Vereinfachung) und speichert es im __pycache__Ordner. Wenn Sie dort nachsehen, finden Sie eine Reihe von Dateien, die die Namen der .py-Dateien im Ordner Ihres Projekts gemeinsam haben. Nur deren Erweiterungen sind entweder .pyc oder .pyo. Hierbei handelt es sich um bytecodekompilierte bzw. optimierte bytecodekompilierte Versionen der Dateien Ihres Programms.

Als Programmierer können Sie es weitgehend einfach ignorieren ... Alles, was Sie tun müssen, ist, Ihr Programm etwas schneller zu starten. Wenn sich Ihre Skripte ändern, werden sie neu kompiliert. Wenn Sie die Dateien oder den gesamten Ordner löschen und Ihr Programm erneut ausführen, werden sie erneut angezeigt (es sei denn, Sie unterdrücken dieses Verhalten ausdrücklich).

Wenn Sie cpython verwenden (was am häufigsten vorkommt, da es sich um die Referenzimplementierung handelt) und diesen Ordner nicht möchten, können Sie ihn unterdrücken, indem Sie den Interpreter beispielsweise mit dem Flag -B starten

python -B foo.py

Eine andere Option, wie von tcaswell angegeben, besteht darin, die Umgebungsvariable PYTHONDONTWRITEBYTECODEauf einen beliebigen Wert zu setzen (laut Python-Manpage eine beliebige "nicht leere Zeichenfolge").

scott_fakename
quelle
48
Sie können die Umgebungsvariable auch hinzufügen PYTHONDONTWRITEBYTECODE=<any_value>, um sie dauerhaft zu unterdrücken.
Mark Tolonen
11
Nur zur Klarstellung, dies ist nur für Python 3, richtig?
Joe J
11
@ JoeJ ja, ich denke das ist wahr. python2legt die kompilierten Dateien im selben Verzeichnis wie die Originale ab, wenn ich mich nicht irre.
scott_fakename
27
Eine WICHTIGE Einschränkung ist, dass die zwischengespeicherte .pyc-Datei anstelle der .py-Datei verwendet wird, wenn die .py-Datei fehlt. In der Praxis geschieht dies nur, wenn Sie Module löschen (oder umbenennen), so dass dies nicht häufig vorkommt, aber wenn einige Dinge nach dem Kratzen am Kopf weiterhin "da" sind und find ausführen. -name * .pyc | xargs rm auf Ihrer Quelle ist wahrscheinlich eine gute erste Reaktion.
yacc143
34
find . -name '*.pyc' -deleteJa, find hat ein Flag zum Löschen der gefundenen Dateien, so dass Sie keine xargs shananigans verwenden müssen
vlad-ardelean
174

__pycache__ist ein Ordner mit Python 3-Bytecode, der kompiliert und zur Ausführung bereit ist .

Ich empfehle nicht, diese Dateien routinemäßig zu löschen oder die Erstellung während der Entwicklung zu unterdrücken, da dies die Leistung beeinträchtigen kann. Halten Sie einfach einen rekursiven Befehl bereit (siehe unten), um ihn bei Bedarf zu bereinigen, da der Bytecode in Randfällen veraltet sein kann (siehe Kommentare).

Python-Programmierer ignorieren normalerweise Bytecode. In der Tat __pycache__und *.pycsind gemeinsame Zeilen in .gitignoreDateien zu sehen . Bytecode ist nicht für die Verteilung gedacht und kann mithilfe des disModuls zerlegt werden .


Wenn Sie OS X verwenden, können Sie alle diese Ordner in Ihrem Projekt einfach ausblenden, indem Sie den folgenden Befehl im Stammordner Ihres Projekts ausführen.

find . -name '__pycache__' -exec chflags hidden {} \;

Ersetzen __pycache__durch *.pycfür Python 2.

Dies setzt ein Flag für alle diese Verzeichnisse (.pyc-Dateien) und weist Finder / Textmate 2 an, sie von den Listen auszuschließen. Wichtig ist, dass der Bytecode vorhanden ist, er ist nur versteckt.

Führen Sie den Befehl erneut aus, wenn Sie neue Module erstellen und neuen Bytecode ausblenden möchten oder wenn Sie die ausgeblendeten Bytecode-Dateien löschen.


Unter Windows lautet der entsprechende Befehl möglicherweise (nicht getestet, Batch-Skript willkommen):

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

Dies entspricht dem Ausblenden von Ordnern durch das Projekt mit Rechtsklick> Ausblenden ...


Das Ausführen von Komponententests ist ein Szenario (mehr in Kommentaren), in dem das Löschen der *.pycDateien und __pycache__Ordner in der Tat nützlich ist. Ich verwende die folgenden Zeilen in meinem ~/.bash_profileund renne nur cl, um bei Bedarf aufzuräumen.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'
Zeilenumbruch
quelle
Wäre dies nicht jedes Mal rückgängig gemacht, wenn Sie den Code ausführen?
Holloway
2
@DoTheEvo: Es wird einfach nicht erstellt, sodass beim nächsten Laden des Moduls keine Beschleunigung erfolgt. Es wird kein Fehler ausgelöst.
Petr Viktorin
7
Dies ist keine gute Antwort. Der Fragesteller möchte wissen, wofür diese Dateien bestimmt sind. Diese Antwort lautet "Mach dir keine Sorgen" und lässt sie dann verschwinden.
Interessanterweise gibt es
36
Absolut Mühe diese zu löschen : Esnicht sinnlos. Python erkennt glücklicherweise keine Dateiänderungen und führt unter vielen Umständen eine Cache-Datei aus, was Sie mit dem Unsinn "Warum funktioniert das f immer noch nicht, ich habe den Code geändert, warum schlägt es bei nicht vorhandenen Aufrufen immer noch fehl?" Insbesondere in Test-Frameworks ist Pycache standardmäßig am schlechtesten.
Mike 'Pomax' Kamermans
2
Ich würde diesem Rat nicht zustimmen, "diese Dateien nicht zu löschen" - habe dies schon oft empfohlen, zuletzt von Kenneth Reitz '"How To Python" ("der Bytecode-Trick")
Louis Maddox
38

Ein __pycache__Ordner wird erstellt, wenn Sie die Zeile verwenden:

import file_name

oder versuchen Sie, Informationen aus einer anderen von Ihnen erstellten Datei abzurufen. Dies macht es etwas schneller, wenn Sie Ihr Programm zum zweiten Mal ausführen, um die andere Datei zu öffnen.

Aleks. S.
quelle
27

Aktualisierte Antwort von 3.7+ Dokumenten:

Um das Laden von Modulen zu beschleunigen, speichert Python die kompilierte Version jedes Moduls im __pycache__Verzeichnis unter dem Namen zwischen module.version.pyc, wobei die Version das Format der kompilierten Datei codiert. Es enthält im Allgemeinen die Python-Versionsnummer. In CPython Release 3.3 wird beispielsweise die kompilierte Version von spam.py als zwischengespeichert __pycache__/spam.cpython-33.pyc. Diese Namenskonvention ermöglicht die Koexistenz kompilierter Module aus verschiedenen Releases und verschiedenen Versionen von Python.

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

Das heißt, dieses Verzeichnis wird von Python generiert und ist vorhanden, damit Ihre Programme schneller ausgeführt werden. Es sollte nicht der Quellcodeverwaltung verpflichtet sein und in Frieden mit Ihrem lokalen Quellcode koexistieren.


__pycache__ist ein Verzeichnis, das Bytecode-Cache-Dateien enthält, die automatisch von Python generiert werden, nämlich kompilierte Python- oder .pycDateien. Sie fragen sich vielleicht, warum Python, eine "interpretierte" Sprache, überhaupt kompilierte Dateien hat. Diese SO-Frage spricht das an (und es lohnt sich auf jeden Fall, diese Antwort zu lesen ).

In den Python-Dokumenten erfahren Sie mehr darüber, wie es genau funktioniert und warum es existiert:

  • Es wurde in Python 3.2 hinzugefügt, da das vorhandene System zum Verwalten von .pycDateien im selben Verzeichnis verschiedene Probleme verursachte, z. B. wenn ein Programm mit Python-Interpreten verschiedener Versionen ausgeführt wurde. Die vollständige Funktionsspezifikation finden Sie in PEP 3174 .
FluxLemur
quelle
5

aus dem offiziellen Python-Tutorial Module

Um das Laden von Modulen zu beschleunigen, speichert Python die kompilierte Version jedes Moduls im __pycache__Verzeichnis unter dem Namen zwischen module.version.pyc, wobei die Version das Format der kompilierten Datei codiert. Es enthält im Allgemeinen die Python-Versionsnummer. In CPython Release 3.6 wird beispielsweise die kompilierte Version von spam.py als zwischengespeichert __pycache__/spam.cpython-36.pyc.

aus Python doc Programmier-FAQs

Wenn ein Modul zum ersten Mal importiert wird (oder wenn sich die Quelldatei seit der Erstellung der aktuellen kompilierten Datei geändert hat), sollte eine .pyc-Datei mit dem kompilierten Code in einem __pycache__Unterverzeichnis des Verzeichnisses erstellt werden, das die .pyDatei enthält. Die .pycDatei hat einen Dateinamen, der mit demselben Namen wie die .pyDatei beginnt und .pycmit einer mittleren Komponente endet , die von der jeweiligen Python-Binärdatei abhängt, die sie erstellt hat.

Yossarian42
quelle
5

Die Ausführung eines Python-Skripts würde dazu führen, dass der Bytecode im Speicher generiert und beibehalten wird, bis das Programm heruntergefahren wird. Wenn ein Modul importiert wird, erstellt Python zur schnelleren Wiederverwendbarkeit eine Cache-Cache-Datei (PYC ist 'Python' 'Compiled'), in der der Bytecode des zu importierenden Moduls zwischengespeichert wird. Die Idee ist, das Laden von Python-Modulen zu beschleunigen, indem eine erneute Kompilierung (einmal kompilieren, Richtlinie mehrmals ausführen) beim erneuten Import vermieden wird.

Der Name der Datei entspricht dem Modulnamen. Der Teil nach dem ersten Punkt gibt die Python-Implementierung an, die den Cache erstellt hat (möglicherweise CPython), gefolgt von der Versionsnummer.

TechFree
quelle
3

Der Python-Interpreter kompiliert die Skriptdatei * .py und speichert die Ergebnisse der Kompilierung im __pycache__Verzeichnis.

Wenn das Projekt erneut ausgeführt wird und der Interpreter feststellt, dass das Skript * .py nicht geändert wurde, überspringt er den Kompilierungsschritt und führt die zuvor generierte * .pyc-Datei aus, die im __pycache__Ordner gespeichert ist .

Wenn das Projekt komplex ist, können Sie die Vorbereitungszeit verkürzen, bevor das Projekt ausgeführt wird. Wenn das Programm zu klein ist, können Sie dies python -B abc.pymit der BOption ignorieren .

Marcus Thornton
quelle
3

Python Version 2.x hat .pyc, wenn der Interpreter den Code kompiliert.

Python Version 3.x hat __pycache__, wenn der Interpreter den Code kompiliert.

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

In Version 3.2 und höher speichert Python .pyc-kompilierte Bytecodedateien in einem Unterverzeichnis mit dem Namen __pycache__in dem Verzeichnis, in dem sich Ihre Quelldateien befinden, mit Dateinamen, die die Python-Version identifizieren, mit der sie erstellt wurden (z. B. script.cpython-33.pyc).

Shashidhar Yalagi
quelle
Wie kann ich die Erstellung eines " pycache " -Ordners vermeiden und alle .pyc-Dateien sollten den gleichen Namen wie die .py-Datei haben?
Ashwani
1

Wenn Sie ein Modul importieren ,

import file_name

Python speichert den kompilierten Bytecode im __pycache__Verzeichnis, damit zukünftige Importe ihn direkt verwenden können, anstatt die Quelle erneut analysieren und kompilieren zu müssen.

Dies geschieht nicht nur zum Ausführen eines Skripts, sondern nur beim Importieren einer Datei.

(In früheren Versionen wurde der zwischengespeicherte Bytecode als .pyc-Dateien gespeichert, die sich im selben Verzeichnis wie die .py-Dateien befanden. Ab Python 3 wurden sie jedoch in ein Unterverzeichnis verschoben, um die Übersichtlichkeit zu verbessern.)

PYTHONDONTWRITEBYTECODE ---> Wenn dies auf eine nicht leere Zeichenfolge festgelegt ist, versucht Python beim Import von Quellmodulen nicht, .pyc-Dateien zu schreiben. Dies entspricht der Angabe der Option -B.

Ehsan Barkhordar
quelle