Quel est le MEILLEUR moyen pour effacer tous les dossiers __pycache__
et les fichiers .pyc/.pyo
d'un projet python3. J'ai vu plusieurs utilisateurs suggérer le script pyclean
fourni avec Debian, mais cela ne supprime pas les dossiers. Je veux un moyen simple de nettoyer le projet avant de transférer les fichiers sur mon DVS.
J'ai trouvé la réponse moi-même quand j'ai mal typé pyclean en 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
Utiliser py3clean .
l'a nettoyé très bien.
Vous pouvez le faire manuellement avec la commande suivante:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Cela supprimera tous les répertoires * .pyc et les répertoires_PYCACHE_de manière récursive dans le répertoire actuel.
L'implémentation find
de BSD sur macOS est différente de GNU find - ceci est compatible avec BSD et GNU find. Commencez par une implémentation globale, en utilisant -name
et le -o
pour ou - Mettez cette fonction dans votre fichier .bashrc
:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Ensuite, cd
dans le répertoire que vous souhaitez nettoyer récursivement, puis tapez pyclean
.
Ceci est une GNU recherche, seule (c'est-à-dire Linux), mais je pense que c'est un peu mieux avec la regex:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Sous Windows, vous n'avez probablement même pas find
. Cependant, vous avez probablement Python 3 qui, à partir de la version 3.4, contient le module pratique pathlib
:
python3 -c "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
python3 -c "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"
Cela déroge à la compréhension de la lecture en boucle, mais en utilisant python -c
, le style est plutôt une préoccupation secondaire. Sinon, nous pourrions abuser (par exemple) __import__
:
python3 -c "for p in __import__('pathlib').Path('.').rglob('*.py[co]'): p.unlink()"
python3 -c "for p in __import__('pathlib').Path('.').rglob('__pycache__'): p.rmdir()"
La réponse la plus fréquente disait:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Cela semblerait moins efficace car il utilise trois processus. find
prend une expression régulière, nous n'avons donc pas besoin d'invocation séparée de grep
. De même, il a -delete
, nous n'avons donc pas besoin d'invocation séparée de rm
- et contrairement à un commentaire ici, il va supprimer les répertoires non vides tant qu'ils sont vidés en raison de la correspondance de l'expression régulière.
De la page de manuel xargs
:
find /tmp -depth -name core -type f -delete
Recherchez les fichiers nommés core dans ou sous le répertoire/tmp et supprimez-les, mais plus efficacement que dans l'exemple précédent (car nous évitons le besoin d'utiliser fork (2) et exec (2) pour lancer rm et nous n'avons pas besoin de le processus supplémentaire xargs).
S'agissant d'un projet Python 3, il vous suffit de supprimer les répertoires __pycache__
: tous les fichiers .pyc
/.pyo
se trouvent à 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'étaient pas), alors j'inclus les deux à des fins de complétude.
Si vous le faites dans un répertoire sous contrôle de révision, vous pouvez également demander au RCS d'ignorer les dossiers __pycache__
de manière récursive. Puis, au moment voulu, nettoyez tous les fichiers ignorés. Cela sera probablement plus pratique car il y aura probablement plus à nettoyer que __pycache__
.
C'est mon alias qui fonctionne à la fois avec Python 2 et Python 3, supprimant tous les fichiers .pyc .pyo
ainsi que les répertoires __pycache__
de manière récursive.
alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
Si vous avez besoin d'un solution permanente pour conserver les fichiers de cache Python hors des répertoires de votre projet:
À partir de Python 3.8, vous pouvez utiliser la variable d'environnement PYTHONPYCACHEPREFIX
pour définir un répertoire de cache pour Python.
À partir de la docs Python:
Si cette option est définie, Python écrira les fichiers .pyc dans une arborescence de répertoires miroir sur 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 ./profile
sous Linux:
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Python ne créera pas les répertoires gênants __pycache__
dans votre répertoire de projet, mais les mettra tous sous ~/.cache/cpython/
Merci beaucoup pour les autres réponses. C’est sur ces bases que j’ai utilisé pour le fichier prerm
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
Dans le Project Tool Window
, cliquez avec le bouton droit de la souris sur un projet ou un répertoire dans lequel les fichiers compilés Python doivent être supprimés.
Dans le menu contextuel, choisissez Clean Python compiled files
.
Les fichiers .pyc
résidant dans le répertoire sélectionné sont supprimés en mode silencieux.
Pourquoi ne pas simplement utiliser rm -rf __pycache__
? Exécutez ensuite git add -A
pour les supprimer de votre référentiel et ajoutez __pycache__/
à votre fichier .gitignore.