Il progetto Python3 rimuove le cartelle __pycache__ e i file .pyc


166

Qual è il modo MIGLIORE per cancellare tutte le __pycache__ cartelle e i .pyc/.pyofile da un progetto python3. Ho visto più utenti suggerire lo pycleanscript in bundle con Debian, ma questo non rimuove le cartelle. Voglio un modo semplice per ripulire il progetto prima di inviare i file sul mio DVS.

Risposte:


241

Puoi farlo manualmente con il comando successivo:

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

Ciò rimuoverà ricorsivamente tutti i file * .pyc e le directory __pycache__ nella directory corrente.


8
Il comando è sporco. Sarà anche cancellare *__pycache__, *.pyc*e non distinguere tra file e directory. Anche la maggior parte dei rmcomandi generati sarà superflua.
ivan_pozdeev,

12
Questo è semplicemente sbagliato. Non è così che si usa findgreprme potrebbe essere pericoloso per qualsiasi directory di lavoro corrente che potrebbe contenere useful.pycle.jsono important_deployment_setting_about__pycache__.txtecc, che io non escluderei su tutto il bacino di utenza di SO. Per non parlare di come (pericolosamente rm -rf) xargssarebbe rotto da un file con spazi bianchi nel nome. Quindi l'ho modificato ...
dlamblin,

@dwanderson Penso che tu stia parlando di una risposta diversa; o la cronologia delle modifiche SO non mostra più la cronologia completa EG c'era una versione nel 2017 che non è mostrata lì?
dlamblin,

2
Non funziona su OSXgrep: parentheses not balanced
Daniel W.

85

Ho trovato la risposta da solo quando ho sbagliato a scrivere Pyclean come Pycclean:

    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

L'esecuzione lo ha py3clean .ripulito molto bene.


6
py3clean è più conservativo del comando di @ V.Gamula: non elimina i file .pyc generati dai file di origine che sono stati eliminati da allora.
Jérôme,

1
A partire da maggio / 2017, in macos / homebrew, ho dovuto usare il pacchetto pycleaner da pip, e il comando per eseguirlo è pycleaner. Solo Python 2.
Willian Mitsuda,

3
python3-minimal sembra essere disponibile solo su Debian (non trovandolo su RHEL, CentOS, brew, MacOS)
user12345

1
stranamente, il mio py3clean installato (3.5.1-3) in realtà non fa nulla, non cancella nessuno di quei file e semplicemente ritorna silenziosamente (python 3.6.5).
matanster

4
Non elimina __pycache__cartelle, né .pycfile (testato su debian)
EricLavault,

82

macOS e Linux

L' findimplementazione di BSD su macOS è diversa da GNU find - questo è compatibile con BSD e GNU find. Inizia con un'implementazione globbing, usando -namee -oper o - Inserisci questa funzione nel tuo .bashrcfile:

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

Quindi cdnella directory che si desidera pulire in modo ricorsivo e digitare pyclean.

GNU trova solo

Questa è una soluzione GNU find, only (ie Linux), ma penso che sia un po 'più piacevole con regex:

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

Qualsiasi piattaforma, usando Python 3

Su Windows, probabilmente non hai nemmeno find. Tuttavia, probabilmente hai Python 3, che a partire dalla 3.4 ha il comodo pathlibmodulo:

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__')]"

La -Bbandiera dice a Python di non scrivere .pycfile. (Vedi anche la PYTHONDONTWRITEBYTECODEvariabile d'ambiente.)

Gli abusi di cui sopra elencano le comprensioni per il looping, ma quando si utilizza python -c, lo stile è piuttosto una preoccupazione secondaria. In alternativa, potremmo abusare (ad esempio) __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()"

Critica di una risposta

La risposta principale diceva:

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

Ciò sembrerebbe meno efficiente perché utilizza tre processi. findprende un'espressione regolare, quindi non abbiamo bisogno di una chiamata separata di grep. Allo stesso modo, si è -delete, quindi non abbiamo bisogno di un'invocazione separata rmcontrario -e per un commento qui, sarà eliminare le directory non vuote fintanto che vengono svuotati in virtù del match espressione regolare.

Dalla xargspagina man:

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

Trova i file denominati core all'interno o sotto la directory / tmp ed eliminali, ma in modo più efficiente rispetto all'esempio precedente (perché evitiamo la necessità di usare fork (2) ed exec (2) per avviare rm e non abbiamo bisogno del processo xargs extra).


Probabilmente potresti ottenere la versione di Python su una riga usando shutil.rmteele __pycache__directory invece di svuotarle per prime; un one-liner potrebbe essere utile per un facile alias. Sono un grande fan di Pathadesso, però, quindi penso che userò quella versione nella mia sceneggiatura.
Nathan,

25

Dato che questo è un progetto Python 3, devi solo eliminare le __pycache__directory - tutti i .pyc/ .pyofile sono al loro interno.

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

o la sua forma più semplice,

find . -type d -name __pycache__ -delete

che non ha funzionato per me per qualche motivo (i file sono stati eliminati ma le directory non lo erano), quindi li includo per completezza.


In alternativa, se lo stai facendo in una directory sotto controllo di revisione, puoi dire a RCS di ignorare le __pycache__cartelle in modo ricorsivo. Quindi, nel momento richiesto, ripulisci tutti i file ignorati. Questo sarà probabilmente più conveniente perché probabilmente ci sarà più da ripulire che solo __pycache__.


No, non tutti i .pycfile sono al suo interno.
Martin Thoma,

@ V.Gamula Questo è un comando considerevolmente più sicuro di quello ~ 114 persone hanno avuto la fortuna di non morderle con la cancellazione permanente di una partita sbagliata.
dlamblin,

@MartinThoma in un unico progetto python3?
dlamblin,

4
Sono l'unico che ottiene Directory not emptycon la seconda variante qui?
matanster

13

Questo è il mio alias che funziona sia con Python 2 che con Python 3 rimuovendo ricorsivamente tutti i .pyc .pyofile e le __pycache__directory.

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

Molte grazie. Mi ha aiutato a sbarazzarmi di tutti quei file non necessari per i miei repository.
Harsh Aggarwal,

13

Se hai bisogno di una soluzione permanente per mantenere i file della cache di Python fuori dalle directory del tuo progetto:

A partire da Python 3.8 è possibile utilizzare la variabile di ambiente PYTHONPYCACHEPREFIXper definire una directory cache per Python.

Dai documenti di Python:

Se impostato, Python scriverà i file .pyc in una struttura di directory mirror in questo percorso, anziché nelle directory pycache all'interno della struttura di origine. Ciò equivale a specificare l'opzione -X pycache_prefix = PATH.

Esempio

Se aggiungi la seguente riga alla tua ./profilein Linux:

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

Python non creerà le fastidiose __pycache__directory nella directory del progetto, ma le metterà tutte sotto~/.cache/cpython/


4
Per fortuna questo sta arrivando. Le directory dei rifiuti di Pycache erano un errore.
Sarah G,

7

Il comando che ho usato:

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

spiega:

  1. Per prima cosa trova tutte le __pycache__cartelle nella directory corrente.

  2. Eseguire rm -r {} +per eliminare ciascuna cartella al passaggio precedente ( {} indicare il segnaposto e +terminare il comando)

Modificato 1:

Sto usando Linux, per riutilizzare il comando ho aggiunto la riga seguente al ~/.bashrcfile

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

Modificato 2: se si utilizza VS Code , non è necessario rimuoverlo __pycache__manualmente. Puoi aggiungere il frammento di seguito al settings.jsonfile. Successivamente, VS Code nasconderà tutte le __pycache__cartelle per te

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

Spero che sia d'aiuto !!!


4

Utilizzando PyCharm

Per rimuovere i file compilati Python

  1. Nel Project Tool Window, fare clic con il pulsante destro del mouse su un progetto o una directory, da cui eliminare i file compilati Python.

  2. Nel menu contestuale, selezionare Clean Python compiled files.

I .pycfile che risiedono nella directory selezionata vengono eliminati silenziosamente.


4

Dalla directory del progetto digitare quanto segue:

Eliminazione di tutti i file .pyc

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

Eliminazione di tutti i file .pyo :

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

Infine, per eliminare tutto '__pycache__' , digitare:

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

Se si riscontra un errore di autorizzazione negata , aggiungere sudo all'inizio di tutto il comando sopra.


2

Grazie mille per le altre risposte, basandomi su questo è quello che ho usato per il prermfile del mio pacchetto Debian :

#!/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

Perché non usare solo rm -rf __pycache__? Esegui git add -Asuccessivamente per rimuoverli dal tuo repository e aggiungili __pycache__/al tuo file .gitignore.


1
Non lo sta facendo manualmente. Sta cercando di aggiungerlo a uno script usato in un pacchetto Debian. Un pacchetto debian non è usato con git ma con il gestore pacchetti debian o il programma di installazione apt.
Craig,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.