wake-up-neo.com

Was ist __pycache__?

Nach meinem Verständnis ist ein Cache eine verschlüsselte Datei mit ähnlichen Dateien.

Was machen wir mit dem __pycache__-Ordner? Ist es das, was wir den Menschen statt unseres Quellcodes geben? Sind es nur meine Eingabedaten? Dieser Ordner wird ständig erstellt, wozu er dient? 

431
user2063042

Wenn Sie ein Programm in Python ausführen, kompiliert der Interpreter es zuerst mit dem Bytecode (dies ist eine zu starke Vereinfachung) und speichert es im Ordner __pycache__. Wenn Sie dort nachschauen, werden Sie eine Reihe von Dateien finden, die die Namen der .py-Dateien im Ordner Ihres Projekts gemeinsam nutzen. Nur ihre Erweiterungen sind entweder .pyc oder .pyo. Hierbei handelt es sich um bytecode-kompilierte bzw. optimierte bycode-kompilierte Versionen der Programmdateien.

Als Programmierer können Sie es weitgehend ignorieren ... Sie müssen lediglich Ihr Programm etwas schneller starten. Wenn sich Ihre Skripts ändern, werden sie erneut kompiliert. Wenn Sie die Dateien oder den gesamten Ordner löschen und das Programm erneut ausführen, werden sie erneut angezeigt (sofern Sie dies nicht ausdrücklich unterdrücken).

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

python -B foo.py

Wie von tcaswell angemerkt, besteht eine weitere Option darin, die Umgebungsvariable PYTHONDONTWRITEBYTECODE auf einen beliebigen Wert zu setzen (gemäß der Python-Manpage "beliebiger" nicht leerer String).

361
scott_fakename

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

Versuchen Sie nicht, diese Dateien zu löschen oder die Erstellung zu unterdrücken, da dies die Leistung beeinträchtigen kann. Halten Sie einfach einen rekursiven Befehl bereit (siehe unten), um ihn bei Bedarf aufzuräumen, da Bytecode in Edge-Fällen veraltet sein kann (siehe Kommentare).

Python-Programmierer ignorieren normalerweise den Bytecode. Tatsächlich sind __pycache__ und *.pyc übliche Zeilen, die in .gitignore-Dateien angezeigt werden. Bytecode ist nicht für die Verteilung gedacht und kann mit dis module 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 Sie __pycache__ durch *.pyc für Python 2.

Dadurch wird für alle Verzeichnisse (.pyc-Dateien) ein Flag gesetzt, das Finder/Textmate 2 mitteilt, um sie von den Listen auszuschließen. Wichtig ist der Bytecode, 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 ist das gleiche wie das Durchsuchen von Ordnern 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 tatsächlich nützlich ist. Ich verwende die folgenden Zeilen in meinem ~/.bash_profile und führe einfach cl aus, um bei Bedarf aufzuräumen. 

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

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 ein wenig schneller, wenn Sie das Programm zum zweiten Mal ausführen, um die andere Datei zu öffnen.

17
Aleks. S.

__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 adressiert das (und es lohnt sich auf jeden Fall zu lesen diese Antwort ).

Grundsätzlich gilt,

  • dadurch läuft Ihr Programm etwas schneller
  • sie können es im Allgemeinen einfach ignorieren

Die Python-Dokumente gehen näher auf die Funktionsweise und die Gründe dafür ein:

  • Es wurde in Python 3.2 hinzugefügt , weil das vorhandene System zum Verwalten von .pyc-Dateien im selben Verzeichnis verschiedene Probleme verursacht hat, beispielsweise wenn ein Programm mit Python-Interpreter verschiedener Versionen ausgeführt wurde. Die vollständige Feature-Spezifikation finden Sie unter PEP 3174 .
11
FluxLemur

aus dem offiziellen Python-Tutorial Module

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

aus Python doc Häufig gestellte Fragen zur Programmierung

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 Unterverzeichnis __pycache__ des Verzeichnisses mit der Datei .py erstellt werden. Die .pyc-Datei hat einen Dateinamen, der mit dem gleichen Namen wie die .py-Datei beginnt und mit .pyc endet. Die mittlere Komponente hängt von der jeweiligen Python-Binärdatei ab, mit der sie erstellt wurde.

3
Yossarian42

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

Wenn das Projekt erneut ausgeführt wird und der Interpreter feststellt, dass das * .py-Skript nicht geändert wurde, überspringt es den Kompilierungsschritt und führt die zuvor generierte * .pyc-Datei aus, die im Ordner __pycache__ 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 ignorieren, indem Sie python -B abc.py mit der Option B verwenden.

2
Marcus Thornton

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

1

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

Der Name der Datei ist derselbe wie der Modulname. Der Teil nach dem ersten Punkt gibt die Python-Implementierung an, mit der der Cache erstellt wurde (möglicherweise CPython), gefolgt von der Versionsnummer.

0
TechFree