Le projet Python3 supprime les dossiers __pycache__ et les fichiers .pyc

166

Quelle est la MEILLEURE façon de supprimer tous les __pycache__ dossiers et .pyc/.pyofichiers d'un projet python3. J'ai vu plusieurs utilisateurs suggérer le pycleanscript fourni avec Debian, mais cela ne supprime pas les dossiers. Je veux un moyen simple de nettoyer le projet avant de pousser les fichiers sur mon DVS.

Vert saillant
la source

Réponses:

241

Vous pouvez le faire manuellement avec la commande suivante:

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

Cela supprimera tous les fichiers * .pyc et les répertoires __pycache__ de manière récursive dans le répertoire courant.

V. Gamula
la source
8
La commande est sale. Il supprimera également *__pycache__, *.pyc*et il ne fait pas la distinction entre les fichiers et les répertoires. La plupart des rmcommandes générées seront également superflues.
ivan_pozdeev
12
C'est tout simplement faux. Ce n'est pas comme ça que vous utilisez findni grepni rmet cela pourrait être dangereux pour tout répertoire de travail actuel qui pourrait contenir useful.pycle.jsonou important_deployment_setting_about__pycache__.txtetc. Ce que je n'exclurais pas sur l'ensemble de la base d'utilisateurs de SO. Sans parler de la manière (dangereusement rm -rf) cassée xargspar un fichier avec des espaces dans le nom. Alors je l'ai édité…
dlamblin
@dwanderson Je pense que vous parlez d'une réponse différente; ou est-ce que l'historique d'édition SO ne montre plus l'historique complet EG il y avait une version en 2017 qui n'y est pas affichée?
dlamblin
2
Ne fonctionne pas sous OSXgrep: parentheses not balanced
Daniel W.29
85

J'ai trouvé la réponse moi-même lorsque j'ai mal tapé pyclean comme 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

Courir l' py3clean .a très bien nettoyé.

Vert saillant
la source
6
py3clean est plus conservatrice que la commande de @ V.Gamula: elle ne supprime pas les fichiers .pyc générés à partir des fichiers source qui ont été supprimés depuis.
Jérôme
1
Depuis mai / 2017, dans macos / homebrew, j'ai dû utiliser le package pycleaner de pip, et la commande pour l'exécuter est pycleaner. Python 2 uniquement.
Willian Mitsuda
3
python3-minimal semble être disponible uniquement sur Debian (ne pas le trouver sur RHEL, CentOS, brew, MacOS)
user12345
1
curieusement, mon py3clean installé (3.5.1-3) ne fait rien en fait, n'efface aucun de ces fichiers et retourne simplement silencieusement (python 3.6.5).
matanster le
4
Il ne supprime pas les __pycache__dossiers, ni les .pycfichiers (testé sur Debian)
EricLavault
82

macOS et Linux

L' findimplémentation de BSD sur macOS est différente de GNU find - elle est compatible avec BSD et GNU find. Commencez par une implémentation de globbing, en utilisant -nameet le -ofor ou - Mettez cette fonction dans votre .bashrcfichier:

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

Ensuite, cddans le répertoire que vous souhaitez nettoyer de manière récursive et tapez pyclean.

Recherche GNU uniquement

Ceci est une solution GNU find, uniquement (c'est-à-dire Linux), mais je pense que c'est un peu plus agréable avec l'expression régulière:

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

N'importe quelle plate-forme, utilisant Python 3

Sur Windows, vous n'avez probablement même pas find. Cependant, vous avez probablement Python 3, qui à partir de 3.4 a le pathlibmodule pratique :

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

Le -Bdrapeau indique à Python de ne pas écrire de .pycfichiers. (Voir aussi la PYTHONDONTWRITEBYTECODEvariable d'environnement.)

Les abus ci-dessus répertorient les compréhensions pour la boucle, mais lors de l'utilisation python -c, le style est plutôt une préoccupation secondaire. Alternativement, nous pourrions abuser (par exemple) __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()"

Critique d'une réponse

La première réponse disait:

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

Cela semble moins efficace car il utilise trois processus. findprend une expression régulière, nous n'avons donc pas besoin d'un appel séparé de grep. De même, il a -delete, donc on n'a pas besoin d' un appel séparé rm-et contrairement à un commentaire ici, il va supprimer des répertoires non vides tant qu'ils se vident en raison du match d'expression régulière.

Depuis la xargspage de manuel:

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

Trouvez les fichiers nommés core dans ou en dessous du répertoire / tmp et supprimez-les, mais plus efficacement que dans l'exemple précédent (car nous évitons d'utiliser fork (2) et exec (2) pour lancer rm et nous n'avons pas besoin du processus xargs supplémentaire).

Salle Aaron
la source
Vous pourriez probablement obtenir la version python sur une ligne en utilisant shutil.rmteesur les __pycache__répertoires au lieu de les vider d'abord; un one-liner pourrait être bien pour un alias facile. Je suis un grand fan de Pathmaintenant, donc je pense que je vais utiliser cette version dans mon script.
Nathan
25

Puisqu'il s'agit d'un projet Python 3, il vous suffit de supprimer les __pycache__répertoires - tous les fichiers .pyc/ .pyosont à l'intérieur.

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

ou sa forme plus simple,

find . -type d -name __pycache__ -delete

ce qui n'a pas fonctionné pour moi pour une raison quelconque (les fichiers ont été supprimés mais les répertoires ne l'ont pas été), donc j'inclus les deux par souci d'exhaustivité.


Alternativement, si vous faites cela dans un répertoire qui est sous contrôle de révision, vous pouvez dire au RCS d'ignorer les __pycache__dossiers de manière récursive. Ensuite, au moment voulu, nettoyez simplement tous les fichiers ignorés. Ce sera probablement plus pratique car il y aura probablement plus à nettoyer que juste __pycache__.

ivan_pozdeev
la source
Non, tous les .pycfichiers ne s'y trouvent pas.
Martin Thoma
@ V.Gamula C'est une commande beaucoup plus sûre que celle ~ 114 personnes ont eu la chance de ne pas les avoir mordues avec la suppression permanente d'une correspondance erronée.
dlamblin
@MartinThoma dans un projet python3 uniquement?
dlamblin
4
Suis-je le seul à avoir Directory not emptyla deuxième variante ici?
matanster le
13

C'est mon alias qui fonctionne à la fois avec Python 2 et Python 3 en supprimant tous les .pyc .pyofichiers ainsi que les __pycache__répertoires de manière récursive.

alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
Carlos Bazaga
la source
Merci beaucoup. Cela m'a aidé à me débarrasser de tous ces fichiers inutiles pour mes dépôts.
Harsh Aggarwal
13

Si vous avez besoin d'une solution permanente pour garder les fichiers de cache Python hors des répertoires de votre projet:

À partir de Python 3.8, vous pouvez utiliser la variable d'environnement PYTHONPYCACHEPREFIXpour définir un répertoire de cache pour Python.

À partir de la documentation Python:

Si cela est défini, Python écrira les fichiers .pyc dans une arborescence de répertoires miroir à ce chemin, au lieu de dans les répertoires pycache de l'arborescence source. Cela équivaut à spécifier l'option -X pycache_prefix = PATH.

Exemple

Si vous ajoutez la ligne suivante à votre ./profilesous Linux:

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

Python ne créera pas les __pycache__répertoires ennuyeux dans le répertoire de votre projet, au lieu de cela, il les placera tous sous~/.cache/cpython/

Rotareti
la source
4
Dieu merci, cela arrive. Les répertoires de litière pycache étaient une erreur.
Sarah G
7

La commande que j'ai utilisée:

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

Explique:

  1. Recherche d'abord tous les __pycache__dossiers du répertoire actuel.

  2. Exécutez rm -r {} +pour supprimer chaque dossier à l'étape ci-dessus ( {} signifiez pour l'espace réservé et +pour terminer la commande)

Édité 1:

J'utilise Linux, pour réutiliser la commande, j'ai ajouté la ligne ci-dessous au ~/.bashrcfichier

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

Modifié 2: Si vous utilisez VS Code , vous n'avez pas besoin de supprimer __pycache__manuellement. Vous pouvez ajouter l'extrait ci-dessous au settings.jsonfichier. Après cela, VS Code masquera tous les __pycache__dossiers pour vous

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

J'espère que ça aide !!!

leminhnguyenHUST
la source
4

Utilisation de PyCharm

Pour supprimer les fichiers compilés Python

  1. Dans le Project Tool Window, cliquez avec le bouton droit sur un projet ou un répertoire dans lequel les fichiers compilés Python doivent être supprimés.

  2. Dans le menu contextuel, choisissez Clean Python compiled files.

Les .pycfichiers résidant dans le répertoire sélectionné sont supprimés en silence.

AB Abhi
la source
4

Dans le répertoire du projet, tapez ce qui suit:

Suppression de tous les fichiers .pyc

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

Suppression de tous les fichiers .pyo :

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

Enfin, pour supprimer tout '__pycache__' , tapez:

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

Si vous rencontrez une erreur d' autorisation refusée , ajoutez sudo au début de toutes les commandes ci-dessus.

thierno
la source
2

Merci beaucoup pour les autres réponses, basées sur elles, voici ce que j'ai utilisé pour le prermfichier de mon paquet 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
Craig
la source
0

Pourquoi ne pas simplement utiliser rm -rf __pycache__? Exécutez git add -Aensuite pour les supprimer de votre référentiel et les ajouter __pycache__/à votre fichier .gitignore.

Bachsau
la source
1
Il ne fait pas cela manuellement. Il essaie de l'ajouter à un script utilisé dans un paquet Debian. Un paquet debian n'est pas utilisé avec git mais avec le gestionnaire de paquets debian ou l'installateur apt.
Craig
-13

Veuillez simplement vous rendre sur votre terminal puis taper:

$rm __pycache__

et il sera supprimé.

Avi Gabrielle Pansensoy
la source