web-dev-qa-db-fra.com

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

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.

76
SalientGreen

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.

51
SalientGreen

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.

140
V. Gamula

macOS et Linux

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.

Recherche GNU uniquement

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
}

N'importe quelle plate-forme, utilisant Python 3

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()"

Critique d'une réponse

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).

30
Aaron Hall

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__.

13
ivan_pozdeev

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 {} +'
3
Carlos Bazaga

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/

1
Rotareti

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
1
Craig

Utiliser PyCharm

Pour supprimer les fichiers compilés Python

  1. 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.

  2. 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.

0
AB Abhi

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.

0
Bachsau