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?
python
python-3.x
caching
user2063042
quelle
quelle
Python 3.8
Sie eine Umgebungsvariable verwenden können, um den Speicherort für die nervigen Cache-Verzeichnisse zu ändern : stackoverflow.com/a/57414308/1612318Antworten:
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
Eine andere Option, wie von tcaswell angegeben, besteht darin, die Umgebungsvariable
PYTHONDONTWRITEBYTECODE
auf einen beliebigen Wert zu setzen (laut Python-Manpage eine beliebige "nicht leere Zeichenfolge").quelle
PYTHONDONTWRITEBYTECODE=<any_value>
, um sie dauerhaft zu unterdrücken.python2
legt die kompilierten Dateien im selben Verzeichnis wie die Originale ab, wenn ich mich nicht irre.find . -name '*.pyc' -delete
Ja, find hat ein Flag zum Löschen der gefundenen Dateien, so dass Sie keine xargs shananigans verwenden müssen__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*.pyc
sind gemeinsame Zeilen in.gitignore
Dateien zu sehen . Bytecode ist nicht für die Verteilung gedacht und kann mithilfe desdis
Moduls 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.
Ersetzen
__pycache__
durch*.pyc
fü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):
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
*.pyc
Dateien und__pycache__
Ordner in der Tat nützlich ist. Ich verwende die folgenden Zeilen in meinem~/.bash_profile
und renne nurcl
, um bei Bedarf aufzuräumen.quelle
Ein
__pycache__
Ordner wird erstellt, wenn Sie die Zeile verwenden: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.
quelle
Aktualisierte Antwort von 3.7+ Dokumenten:
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.pyc
Dateien. 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:
.pyc
Dateien 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 .quelle
aus dem offiziellen Python-Tutorial Module
aus Python doc Programmier-FAQs
quelle
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.
quelle
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.py
mit derB
Option ignorieren .quelle
Python Version 2.x hat .pyc, wenn der Interpreter den Code kompiliert.
Python Version 3.x hat __pycache__, wenn der Interpreter den Code kompiliert.
quelle
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).quelle
Wenn Sie ein Modul importieren ,
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.
quelle