Proyecto Python3 eliminar carpetas __pycache__ y archivos .pyc

166

¿Cuál es la MEJOR manera de borrar todas las __pycache__ carpetas y .pyc/.pyoarchivos de un proyecto python3? He visto a varios usuarios sugerir el pycleanscript incluido con Debian, pero esto no elimina las carpetas. Quiero una forma simple de limpiar el proyecto antes de enviar los archivos a mi DVS.

SalientGreen
fuente

Respuestas:

241

Puedes hacerlo manualmente con el siguiente comando:

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

Esto eliminará todos los archivos * .pyc y __pycache__ directorios recursiva en el directorio actual.

V. Gamula
fuente
8
El comando está sucio. También eliminará *__pycache__, *.pyc*y no distingue entre archivos y directorios. La mayoría de los rmcomandos generados también serán superfluos.
ivan_pozdeev
12
Esto es simplemente incorrecto. Esa no es la forma en que usa findni grepnor rmy podría ser peligroso para cualquier directorio de trabajo actual que pueda contener useful.pycle.jsono important_deployment_setting_about__pycache__.txtetc. Lo que no descartaría en toda la base de usuarios de SO. Sin mencionar cuán (peligrosamente rm -rf) roto xargssería un archivo con espacios en blanco en el nombre. Así que lo
edité
@dwanderson Creo que estás hablando de una respuesta diferente; ¿O el historial de edición de SO ya no muestra el historial completo, por ejemplo, había una versión en 2017 que no se muestra allí?
dlamblin
2
No funciona en OSXgrep: parentheses not balanced
Daniel W.
85

Encontré la respuesta cuando escribí mal Pyclean como 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

Correr lo py3clean .limpió muy bien.

SalientGreen
fuente
66
py3clean es más conservador que el comando de @ V.Gamula: no elimina los archivos .pyc generados a partir de archivos fuente que se han eliminado desde entonces.
Jérôme
1
A partir de mayo / 2017, en macos / homebrew, tuve que usar el paquete pycleaner desde pip, y el comando para ejecutarlo es pycleaner. Python 2 solamente.
Willian Mitsuda
3
python3-minimal parece estar disponible solo en Debian (no lo encuentra en RHEL, CentOS, brew, MacOS)
user12345
1
Por extraño que parezca, mi py3clean instalado (3.5.1-3) no hace nada en realidad, no borra ninguno de esos archivos y simplemente regresa en silencio (python 3.6.5).
matanster
44
No elimina __pycache__carpetas ni .pycarchivos (probado en debian)
EricLavault
82

macOS y Linux

La findimplementación de BSD en macOS es diferente de GNU find: esto es compatible con BSD y GNU find. Comience con una implementación global, usando -namey -opara o - Ponga esta función en su .bashrcarchivo:

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

Luego, cdal directorio que desea limpiar de forma recursiva, y escriba pyclean.

GNU solo de búsqueda

Esta es una solución de GNU find, only (es decir, Linux), pero creo que es un poco más agradable con la expresión regular:

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

Cualquier plataforma, usando Python 3

En Windows, probablemente ni siquiera tienes find. Sin embargo, probablemente tenga Python 3, que a partir de 3.4 tiene el pathlibmódulo conveniente :

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 -Bbandera le dice a Python que no escriba .pycarchivos. (Ver también elPYTHONDONTWRITEBYTECODE variable de entorno).

Los abusos anteriores enumeran las comprensiones para el bucle, pero cuando se usa python -c, el estilo es más bien una preocupación secundaria. Alternativamente, podríamos abusar (por ejemplo) __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()"

Crítica de una respuesta

La respuesta principal solía decir:

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

Esto parece ser menos eficiente porque utiliza tres procesos. findtoma una expresión regular, por lo que no necesitamos una invocación separada de grep. Del mismo modo, lo ha hecho -delete, por lo que no necesitamos una invocación por separado de, rmy al contrario de un comentario aquí, lo hará eliminar directorios no vacíos tanto tiempo a medida que se vacían en virtud de la coincidencia de expresiones regulares.

Desde la xargspágina del manual:

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

Busque archivos denominados core en o debajo del directorio / tmp y elimínelos, pero de manera más eficiente que en el ejemplo anterior (porque evitamos la necesidad de usar fork (2) y exec (2) para iniciar rm y no necesitamos el proceso de xargs extra).

Aaron Hall
fuente
Probablemente podría obtener la versión de Python en una línea utilizando shutil.rmteelos __pycache__directorios en lugar de vaciarlos primero; una frase podría ser buena para un alias fácil. Sin Pathembargo, soy un gran admirador en este momento, así que creo que usaré esa versión en mi script.
Nathan
25

Dado que este es un proyecto de Python 3, solo necesita eliminar __pycache__directorios: todos los archivos .pyc/ .pyoestán dentro de ellos.

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

o su forma más simple,

find . -type d -name __pycache__ -delete

que no funcionó para mí por alguna razón (los archivos se eliminaron pero los directorios no), por lo que incluyo ambos por completo.


Alternativamente, si está haciendo esto en un directorio que está bajo control de revisión, puede decirle al RCS que ignore las __pycache__carpetas de forma recursiva. Luego, en el momento requerido, simplemente limpie todos los archivos ignorados. Esto probablemente será más conveniente porque probablemente habrá más para limpiar que solo __pycache__.

ivan_pozdeev
fuente
No, no todos los .pycarchivos están dentro.
Martin Thoma
@ V.Gamula Este es un comando considerablemente más seguro que el que ~ 114 personas tuvieron la suerte de no morder con la eliminación permanente de un partido equivocado.
dlamblin
@MartinThoma en un proyecto solo para python3?
dlamblin
44
¿Soy el único Directory not emptycon la segunda variante aquí?
matanster
13

Este es mi alias que funciona tanto con Python 2 como con Python 3 eliminando todos los .pyc .pyoarchivos y __pycache__directorios de forma recursiva.

alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'
Carlos Bazaga
fuente
Muchas gracias. Me ayudó a deshacerme de todos esos archivos innecesarios para mis repositorios.
Harsh Aggarwal
13

Si necesitas una solución permanente para mantener los archivos de caché de Python fuera de los directorios de su proyecto:

A partir de Python 3.8 , puede usar la variable de entornoPYTHONPYCACHEPREFIX para definir un directorio de caché para Python.

De los documentos de Python:

Si esto está configurado, Python escribirá archivos .pyc en un árbol de directorios espejo en esta ruta, en lugar de en directorios de pycache dentro del árbol de origen. Esto es equivalente a especificar la opción -X pycache_prefix = PATH.

Ejemplo

Si agrega la siguiente línea a su ./profileen Linux:

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

Python no creará los __pycache__directorios molestos en el directorio de su proyecto, sino que los colocará a todos en~/.cache/cpython/

Rotareti
fuente
44
Gracias a Dios esto viene. Los directorios de basura de Pycache fueron un error.
Sarah G
7

El comando que he usado:

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

Explica:

  1. Primero encuentra todas las __pycache__carpetas en el directorio actual.

  2. Ejecute rm -r {} +para eliminar cada carpeta en el paso anterior ( {} indique el marcador de posición y +finalice el comando)

Editado 1:

Estoy usando Linux, para reutilizar el comando, agregué la siguiente línea al ~/.bashrcarchivo

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

Editado 2: si está utilizando VS Code , no necesita eliminarlo __pycache__manualmente. Puede agregar el fragmento a continuación al settings.jsonarchivo. Después de eso, VS Code ocultará todas las __pycache__carpetas por usted

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

Espero eso ayude !!!

leminhnguyenHUST
fuente
4

Usando PyCharm

Para eliminar archivos compilados de Python

  1. En el Project Tool Window, haga clic con el botón derecho en un proyecto o directorio, donde se deben eliminar los archivos compilados de Python.

  2. En el menú contextual, elija Clean Python compiled files.

Los .pycarchivos que residen en el directorio seleccionado se eliminan silenciosamente.

AB Abhi
fuente
4

Desde el directorio del proyecto, escriba lo siguiente:

Eliminar todos los archivos .pyc

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

Eliminar todos los archivos .pyo :

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

Finalmente, para eliminar todo '__pycache__' , escriba:

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

Si encuentra un error de permiso denegado , agregue sudo al comienzo de todos los comandos anteriores.

Thierno
fuente
2

Muchas gracias por las otras respuestas, en base a ellas, esto es lo que utilicé para el prermarchivo de mi paquete 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
fuente
0

¿Por qué no solo usar rm -rf __pycache__? Ejecute git add -Adespués para eliminarlos de su repositorio y agregarlos __pycache__/a su archivo .gitignore.

Bachsau
fuente
1
No está haciendo esto manualmente. Intenta agregarlo a un script utilizado en un paquete Debian. Un paquete debian no se usa con git sino con el administrador de paquetes debian o el instalador apt.
Craig
-13

Simplemente vaya a su terminal y luego escriba:

$rm __pycache__

y será eliminado

Avi Gabrielle Pansensoy
fuente