719 votes

Comment supprimer tous les fichiers .pyc d'un projet ?

J'ai renommé certains fichiers dans un projet assez important et je veux supprimer les fichiers .pyc qu'ils ont laissés derrière eux. J'ai essayé le bash script :

 rm -r *.pyc

Mais cela ne fait pas le tour des dossiers comme je le pensais. Que dois-je faire de mal ?

11 votes

Cela ne fonctionne pas car sous UNIX, les globs sont développés par l'interpréteur de commandes, et non par le programme en cours d'exécution. Si vous avez a.pyc et b.pyc dans le répertoire courant, et les répertoires foo et bar, rm sera appelé avec les arguments [-r, a.pyc, b.pyc].

1 votes

Si vous avez peur de transmettre votre code à d'autres personnes, vous pouvez simplement l'ajouter au fichier .gitignore. **/*.pyc alors tu n'auras plus à t'en soucier.

1248voto

Bill the Lizard Points 147311
find . -name "*.pyc" -exec rm -f {} \;

0 votes

J'ai testé les deux. Les répertoires étaient probablement trop petits pour être significatifs, mais cette méthode s'est avérée plus rapide que la mienne, ce à quoi je m'attendais puisque la mienne doit assembler la liste et ensuite l'itérer, alors que la vôtre supprime chaque élément au fur et à mesure qu'il est trouvé.

417 votes

Find dispose d'une action intégrée "-delete", vous pouvez donc faire exactement ce qui suit find . -name \*.pyc -delete

52 votes

Plus important encore, si c'est une machine de développement, vous pouvez définir PYTHONDONTWRITEBYTECODE=True, et vous n'aurez plus jamais besoin de le faire. Voir : cette réponse .

1048voto

andybak Points 7081

find . -name '*.pyc' -delete

Sûrement le plus simple.

21 votes

Si votre version de find soutient -delete ; il ne fait pas partie de la norme POSIX.

4 votes

Cela ignore les fichiers .pyo et __pycache__ répertoires. Voir ma réponse.

0 votes

J'ai utilisé le code de la réponse acceptée et cela a fonctionné, mais ces commandes sont plus courtes et simples.

88voto

Wilfred Hughes Points 3507

Ajoutez à votre ~/.bashrc :

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

Cela supprime tous les fichiers .pyc et .pyo, et __pycache__ répertoires. Il est également très rapide.

L'utilisation est simple :

$ cd /path/to/directory
$ pyclean

0 votes

find . -type d -name "__pycache__" -delete donnera souvent un avertissement sur un chemin d'accès manquant car apparemment le contenu sera ajouté à la file d'attente avant que le dossier ne soit supprimé. 2>/dev/null devrait régler ce problème.

87voto

jb. Points 4932

Dans la version actuelle de Debian, vous avez pyclean script qui est en python-minimal paquet.

L'utilisation est simple :

pyclean .

36 votes

Il convient de noter que pyclean semble supprimer uniquement les fichiers .pyc pour lesquels il existe un fichier .py correspondant (du moins sur mon système - ubuntu 12.10.) Cela signifie qu'il n'est pas très utile dans les situations où un fichier source a été supprimé et que vous voulez nettoyer les fichiers .pyc restants.

0 votes

@holms pyclean (et maintenant py3clean ) proviennent d'un paquet Debian, et ne sont donc pas dans RHEL.

0 votes

El pyclean est désormais disponible sous forme de paquetage Python installable à partir de PyPI qui fonctionnent sur toutes les plates-formes (y compris RHEL, macOS et Windows). Il supprime tout .pyc sans préférence particulière à partir d'aujourd'hui.

53voto

d0k Points 1890

Si vous utilisez bash >=4.0 (ou zsh)

rm **/*.pyc

Notez que */*.pyc sélectionne tous les .pyc dans les sous-répertoires immédiats de premier niveau alors que **/*.pyc parcourt récursivement l'ensemble de l'arborescence des répertoires. Par exemple, foo/bar/qux.pyc sera supprimé par rm **/*.pyc mais pas par */*.pyc .

Les options du shell globstar doivent être activées. Pour activer globstar :

shopt -s globstar

et de vérifier son état :

shopt globstar

1 votes

Quelle est la différence entre courir rm **/*.pyc vs rm */*.pyc ? (Cette dernière solution semble fonctionner pour moi localement).

1 votes

@TaylorEdmiston rm */*.pyc supprimera tous les .pyc dans tous les sous-répertoires de la profondeur 1. rm **/*.pyc supprimera tous les .pyc dans tous les sous-répertoires de profondeur 0+.

1 votes

@AdamStewart Merci de l'ajouter. Pour ceux qui tombent sur ce fil de discussion, le problème que j'ai rencontré était que le bash d'Apple livré avec OS X n'inclut pas globstar (donc ** agit en tant que * lorsqu'il est exécuté à la place et en cours d'exécution shopt globstar lance une erreur).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X