Python3-Projekt entfernt __pycache__ Ordner und .pyc-Dateien


166

Was ist der BESTE Weg, um alle __pycache__ Ordner und .pyc/.pyoDateien aus einem Python3-Projekt zu löschen ? Ich habe mehrere Benutzer gesehen, die pycleandas mit Debian gebündelte Skript vorgeschlagen haben, aber dadurch werden die Ordner nicht entfernt. Ich möchte eine einfache Möglichkeit, das Projekt zu bereinigen, bevor die Dateien auf meinen DVS übertragen werden.

Antworten:


241

Sie können dies manuell mit dem nächsten Befehl tun:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

Dadurch werden alle * .pyc- Dateien und __pycache__ -Verzeichnisse rekursiv im aktuellen Verzeichnis entfernt.


8
Der Befehl ist schmutzig. Es wird auch gelöscht *__pycache__, *.pyc*und es unterscheidet nicht zwischen Dateien und Verzeichnissen. Die meisten generierten rmBefehle sind ebenfalls überflüssig.
ivan_pozdeev

12
Das ist einfach falsch. Das ist nicht , wie Sie verwenden , findnoch , grepnoch , rmund es könnte für alle aktuellen Arbeitsverzeichnis gefährlich sein, enthalten könnten useful.pycle.jsonoder important_deployment_setting_about__pycache__.txtusw. Was ich würde nicht ausschließen, auf der gesamten Nutzerbasis von SO. Ganz zu schweigen davon, wie (gefährlich rm -rf) kaputt xargseine Datei mit Leerzeichen im Namen wäre. Also habe ich es bearbeitet ...
dlamblin

@dwanderson Ich denke, Sie sprechen über eine andere Antwort; oder zeigt der SO-Bearbeitungsverlauf nicht mehr den vollständigen Verlauf an? EG gab es 2017 eine Version, die dort nicht angezeigt wird?
Dlamblin

2
Funktioniert nicht unter OSXgrep: parentheses not balanced
Daniel W.

85

Ich habe die Antwort selbst gefunden, als ich pyclean als pycclean verwechselt habe:

    No command 'pycclean' found, did you mean:
     Command 'py3clean' from package 'python3-minimal' (main)
     Command 'pyclean' from package 'python-minimal' (main)
    pycclean: command not found

Laufen py3clean .hat es sehr schön aufgeräumt.


6
py3clean ist konservativer als der Befehl von @ V.Gamula: Es werden keine .pyc-Dateien gelöscht, die aus Quelldateien generiert wurden, die seitdem gelöscht wurden.
Jérôme

1
Ab Mai / 2017 musste ich in macos / homebrew das Paket pycleaner von pip verwenden, und der Befehl zum Ausführen lautet pycleaner. Nur Python 2.
Willian Mitsuda

3
python3-minimal scheint nur unter Debian verfügbar zu sein (nicht unter RHEL, CentOS,
Brew

1
Seltsamerweise macht mein installierter py3clean (3.5.1-3) eigentlich nichts, löscht keine dieser Dateien und kehrt einfach stillschweigend zurück (Python 3.6.5).
Matanster

4
Es löscht weder __pycache__Ordner noch .pycDateien (auf
Debian

82

macOS & Linux

Die findImplementierung von BSD unter macOS unterscheidet sich von GNU find - dies ist sowohl mit BSD als auch mit GNU find kompatibel. Beginnen Sie mit einer Globbing-Implementierung, verwenden Sie -nameund -ofor oder - Fügen Sie diese Funktion in Ihre .bashrcDatei ein:

pyclean () {
    find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}

Gehen cdSie dann zu dem Verzeichnis, das Sie rekursiv bereinigen möchten, und geben Sie ein pyclean.

GNU nur find

Dies ist eine GNU-Find-Only-Lösung (dh Linux), aber ich finde, dass sie mit dem regulären Ausdruck etwas besser ist:

pyclean () {
    find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}

Jede Plattform mit Python 3

Unter Windows haben Sie wahrscheinlich nicht einmal find. Sie haben jedoch wahrscheinlich Python 3, das ab 3.4 das praktische pathlibModul hat:

python3 -Bc "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
python3 -Bc "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"

Das -BFlag weist Python an, keine .pycDateien zu schreiben . (Siehe auch die PYTHONDONTWRITEBYTECODEUmgebungsvariable.)

Die obigen Missbräuche missbrauchen Listenverständnisse für Schleifen, aber bei der Verwendung python -cist Stil eher ein zweitrangiges Anliegen. Alternativ könnten wir (zum Beispiel) missbrauchen __import__:

python3 -Bc "for p in __import__('pathlib').Path('.').rglob('*.py[co]'): p.unlink()"
python3 -Bc "for p in __import__('pathlib').Path('.').rglob('__pycache__'): p.rmdir()"

Kritik einer Antwort

Die beste Antwort lautete:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

Dies scheint weniger effizient zu sein, da drei Prozesse verwendet werden. findnimmt einen regulären Ausdruck, daher benötigen wir keinen separaten Aufruf von grep. In ähnlicher Weise hat es -delete, so dass wir keinen separaten Aufruf von benötigen rm- und im Gegensatz zu einem Kommentar hier werden nicht leere Verzeichnisse gelöscht, solange sie aufgrund der Übereinstimmung mit regulären Ausdrücken geleert werden.

Von der xargsManpage:

find /tmp -depth -name core -type f -delete

Suchen Sie Dateien mit dem Namen core im oder unter dem Verzeichnis / tmp und löschen Sie sie, jedoch effizienter als im vorherigen Beispiel (da wir die Verwendung von fork (2) und exec (2) zum Starten von rm vermeiden und das nicht benötigen extra xargs Prozess).


Sie könnten die Python-Version wahrscheinlich auf eine Zeile bringen, indem Sie sie shutil.rmteein den __pycache__Verzeichnissen verwenden, anstatt sie zuerst zu leeren. Ein Einzeiler könnte für einen einfachen Alias ​​nützlich sein. Ich bin momentan ein großer Fan von Path, daher denke ich, dass ich diese Version in meinem Skript verwenden werde.
Nathan

25

Da dies ein Python 3-Projekt ist, müssen Sie nur __pycache__Verzeichnisse löschen - alle .pyc/ .pyoDateien befinden sich darin.

find . -type d -name __pycache__ -exec rm -r {} \+

oder seine einfachere Form,

find . -type d -name __pycache__ -delete

Das hat aus irgendeinem Grund bei mir nicht funktioniert (Dateien wurden gelöscht, Verzeichnisse jedoch nicht). Der Vollständigkeit halber füge ich beide hinzu.


Wenn Sie dies in einem Verzeichnis tun, das der Versionskontrolle unterliegt, können Sie dem RCS alternativ anweisen, __pycache__Ordner rekursiv zu ignorieren . Bereinigen Sie dann zum gewünschten Zeitpunkt einfach alle ignorierten Dateien. Dies wird wahrscheinlich bequemer sein, da es wahrscheinlich mehr zu bereinigen gibt als nur __pycache__.


Nein, nicht alle .pycDateien befinden sich darin.
Martin Thoma

@ V.Gamula Dies ist ein wesentlich sicherer Befehl als der, bei dem ~ 114 Personen das Glück hatten, sie nicht mit der dauerhaften Löschung eines fehlerhaften Spiels gebissen zu haben.
Dlamblin

@MartinThoma in einem Python3-Projekt?
Dlamblin

4
Bin ich der einzige, Directory not emptyder hier mit der zweiten Variante kommt?
Matanster

13

Dies ist mein Alias, der sowohl mit Python 2 als auch mit Python 3 funktioniert und alle .pyc .pyoDateien sowie __pycache__Verzeichnisse rekursiv entfernt.

alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'

Vielen Dank. Es hat mir geholfen, all die unnötigen Dateien für meine Repos loszuwerden.
Harte Aggarwal

13

Wenn Sie eine dauerhafte Lösung benötigen , um Python-Cache-Dateien aus Ihren Projektverzeichnissen herauszuhalten:

Ab Python 3.8 können Sie mit der Umgebungsvariablen PYTHONPYCACHEPREFIXein Cache-Verzeichnis für Python definieren.

Aus den Python-Dokumenten:

Wenn dies festgelegt ist, schreibt Python .pyc-Dateien in einen Spiegelverzeichnisbaum unter diesem Pfad anstatt in pycache- Verzeichnisse innerhalb des Quellbaums . Dies entspricht der Angabe der Option -X pycache_prefix = PATH.

Beispiel

Wenn Sie unter ./profileLinux die folgende Zeile hinzufügen :

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"

Python erstellt nicht die nervigen __pycache__Verzeichnisse in Ihrem Projektverzeichnis, sondern legt sie alle ab~/.cache/cpython/


4
Gott sei Dank kommt das. Die Pycache-Wurfverzeichnisse waren ein Fehler.
Sarah G

7

Der Befehl, den ich verwendet habe:

find . -type d -name "__pycache__" -exec rm -r {} +

Erklärt:

  1. Findet zuerst alle __pycache__Ordner im aktuellen Verzeichnis.

  2. Ausführen rm -r {} +, um jeden Ordner im obigen Schritt zu löschen ( {} Platzhalter angeben und +Befehl beenden)

Bearbeitet 1:

Ich verwende Linux, um den Befehl wiederzuverwenden. Ich habe der ~/.bashrcDatei die folgende Zeile hinzugefügt

alias rm-pycache='find . -type d -name  "__pycache__" -exec rm -r {} +'

Bearbeitet 2: Wenn Sie VS-Code verwenden , müssen Sie ihn nicht __pycache__manuell entfernen . Sie können das folgende Snippet zur settings.jsonDatei hinzufügen . Danach versteckt VS Code alle __pycache__Ordner für Sie

"files.exclude": {
     "**/__pycache__": true
}

Ich hoffe es hilft !!!


4

Verwenden von PyCharm

So entfernen Sie Python-kompilierte Dateien

  1. Project Tool WindowKlicken Sie mit der rechten Maustaste auf ein Projekt oder Verzeichnis, aus dem Python-kompilierte Dateien gelöscht werden sollen.

  2. Wählen Sie im Kontextmenü Clean Python compiled files.

Die .pycim ausgewählten Verzeichnis befindlichen Dateien werden stillschweigend gelöscht.


4

Geben Sie im Projektverzeichnis Folgendes ein:

Alle .pyc- Dateien löschen

find . -path "*/*.pyc" -delete

Alle .pyo- Dateien löschen :

find . -path "*/*.pyo" -delete

Um alle '__pycache__' zu löschen , geben Sie Folgendes ein :

find . -path "*/__pycache__" -type d -exec rm -r {} ';'

Wenn Sie feststellen, dass die Berechtigung verweigert wurde , fügen Sie sudo zu Beginn aller oben genannten Befehle hinzu.


2

Vielen Dank für die anderen Antworten. Basierend darauf habe ich Folgendes für die prermDatei meines Debian-Pakets verwendet:

#!/bin/sh
set -e

deb_package='package-name'
python_package='package_name'

if which pyclean >/dev/null 2>&1; then
    py3clean -p $deb_package
else
    dpkg -L $deb_package | grep ${python_package}$ | while read file
    do
        find ${file} -type d -name __pycache__ -exec rm -r {} \+
    done
fi

0

Warum nicht einfach benutzen rm -rf __pycache__? Führen Sie git add -Aanschließend aus, um sie aus Ihrem Repository zu entfernen und __pycache__/Ihrer .gitignore-Datei hinzuzufügen .


1
Er macht das nicht manuell. Er versucht, es einem Skript hinzuzufügen, das in einem Debian-Paket verwendet wird. Ein Debian-Paket wird nicht mit git verwendet, sondern mit dem Debian-Paketmanager oder dem apt-Installationsprogramm.
Craig

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.