Was ist __pycache__?

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

Was machen wir mit dem Ordner __pycache__? Geben wir ihn anstelle unseres Quellcodes an andere weiter? Sind das nur meine Eingabedaten? Dieser Ordner wird ständig erstellt, wofür ist er da?

Wenn Sie ein Programm in Python ausführen, kompiliert der Interpreter es zuerst in Bytecode (dies ist eine starke Vereinfachung) und speichert es im Ordner __pycache__. Wenn Sie dort nachsehen, werden Sie eine Reihe von Dateien finden, die die Namen der .py-Dateien in Ihrem Projektordner teilen, nur ihre Erweiterungen sind entweder .pyc oder .pyo. Dies sind bytecode-kompilierte und optimierte bytecode-kompilierte Versionen Ihrer Programmdateien.

Als Programmierer können Sie sie weitgehend ignorieren... Es sorgt lediglich dafür, dass Ihr Programm ein wenig schneller startet. Wenn sich Ihre Skripte ändern, werden sie neu kompiliert, und wenn Sie die Dateien oder den gesamten Ordner löschen und Ihr Programm erneut ausführen, erscheinen sie wieder (es sei denn, Sie unterdrücken dieses Verhalten ausdrücklich)

Wenn Sie cpython verwenden (was am häufigsten vorkommt, da es die Referenzimplementierung ist) und Sie diesen Ordner nicht haben wollen, können Sie ihn unterdrücken, indem Sie den Interpreter mit dem Flag -B starten, zum Beispiel

python -B foo.py

Eine andere Möglichkeit ist, wie von tcaswell erwähnt, die Umgebungsvariable PYTHONDONTWRITEBYTECODE auf einen beliebigen Wert zu setzen (laut Python's Manpage eine beliebige "nicht leere Zeichenkette").

Kommentare (11)

__pycache__ ist ein Ordner, der Python 3 Bytecode enthält, der kompiliert und zur Ausführung bereit ist.

Ich empfehle nicht, diese Dateien routinemäßig zu löschen oder ihre 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 bei Bedarf aufzuräumen, da Bytecode in Grenzfällen veraltet sein kann (siehe Kommentare).

Python-Programmierer ignorieren normalerweise Bytecode. In der Tat sind __pycache__ und *.pyc häufig in .gitignore Dateien zu finden. Bytecode ist nicht für die Weitergabe gedacht und kann mit dem dis Modul disassembliert werden.


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

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

Ersetzen Sie __pycache__ mit *.pyc für Python 2.

Dies setzt eine Markierung für alle diese Verzeichnisse (.pyc-Dateien), die Finder/Textmate 2 anweist, sie von der Auflistung auszuschließen. Wichtig ist, dass der Bytecode da ist, er ist nur versteckt.

Führen Sie den Befehl erneut aus, wenn Sie neue Module erstellen und neuen Bytecode verstecken wollen oder wenn Sie die versteckten Bytecode-Dateien löschen.


Unter Windows könnte der entsprechende Befehl lauten (nicht getestet, Batch-Skript erwünscht):

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

Das ist dasselbe wie das Ausblenden von Ordnern im Projekt mit Rechtsklick > ausblenden...


Das Ausführen von Unit-Tests ist ein Szenario (mehr dazu in den Kommentaren), bei 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 lasse einfach cl laufen, um bei Bedarf aufzuräumen.

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

Ab Version 3.2 speichert Python kompilierte .pyc-Bytecodedateien in einem Unterverzeichnis namens __pycache__, das sich in dem Verzeichnis befindet, in dem sich Ihre Quelldateien befinden, mit Dateinamen, die die Python-Version identifizieren, mit der sie erstellt wurden (z. B. script.cpython-33.pyc)

Kommentare (0)