El proyecto Python3 elimina las carpetas __pycache__ y los archivos .pyc

8 minutos de lectura

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

avatar de usuario
V. Gámula

Puedes hacerlo manualmente con el siguiente comando:

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

Esto eliminará todo .pyc y .pyo archivos, así como __pycache__ directorios recursivamente a partir del directorio actual.

  • El comando está sucio. También se eliminará *__pycache__, *.pyc* y no distingue entre archivos y directorios. La mayor parte de lo generado rm los comandos también serán superfluos.

    – ivan_pozdeev

    19 de octubre de 2017 a las 0:03


  • Esto está mal. Así no es como lo usas find ni grep ni rm y podría ser peligroso para cualquier directorio de trabajo actual que pueda contener useful.pycle.json o important_deployment_setting_about__pycache__.txt etc. Lo cual no descartaría en toda la base de usuarios de SO. Sin mencionar cómo (peligrosamente rm -rf) roto xargs sería por un archivo con espacios en blanco en el nombre. Así que lo edité…

    – dlamblin

    7 oct 2018 a las 16:08

  • @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, hubo una versión en 2017 que no se muestra allí?

    – dlamblin

    7 oct 2018 a las 18:03

  • No funciona en OSX grep: parentheses not balanced

    – Daniel W.

    29 mayo 2019 a las 10:45

  • este comando no es seguro. asegúrese de lo que va a hacer aquí, si está dentro del entorno virtual de python y si ejecuta este comando, también eliminará todo el .pyc en el entorno virtual.

    – Akhil S.

    15 de marzo de 2021 a las 9:15

avatar de usuario
Rusia debe sacar a Putin

mac OS y Linux

BSD find La implementación en macOS es diferente de GNU find: es compatible con BSD y GNU find. Comience con una implementación global, usando -name y el -o por o – Pon esta función en tu .bashrc expediente:

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

Después cd al directorio que desea limpiar recursivamente y escriba pyclean.

GNU de solo búsqueda

Esta es una solución de búsqueda de GNU, solo (es decir, Linux), pero creo que es un poco mejor con la expresión regular:

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

Cualquier plataforma, usando Python 3

En Windows, probablemente ni siquiera tenga find. Sin embargo, es probable que tenga Python 3, que a partir de 3.4 tiene la conveniente pathlib módulo:

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

los -B bandera le dice a Python que no escriba .pyc archivos (Véase también el PYTHONDONTWRITEBYTECODE Variable ambiental.)

Los abusos anteriores enumeran comprensiones para bucles, pero cuando se usan 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 parecería ser menos eficiente porque utiliza tres procesos. find toma una expresión regular, por lo que no necesitamos una invocación separada de grep. Del mismo modo, tiene -deletepor lo que no necesitamos una invocación separada de rm —y contrariamente a un comentario aquí, voluntad elimine los directorios que no estén vacíos siempre que se vacíen en virtud de la coincidencia de expresiones regulares.

Desde el xargs página man:

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

Encuentre archivos llamados 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 extra xargs).

  • Probablemente podría obtener la versión de python en una línea usando shutil.rmtee sobre el __pycache__ directorios en lugar de vaciarlos primero; una sola línea podría ser buena para un alias fácil. Soy un gran fan de Path en este momento, sin embargo, creo que usaré esa versión en mi guión.

    – Nathan

    21 de febrero de 2019 a las 17:02

  • python -Bc "import pathlib; import shutil; [shutil.rmtree(p) for p in pathlib.Path('.').rglob('__pycache__')]"

    – alercelik

    17 de noviembre de 2020 a las 6:50


  • Por alguna razón el -delete banderas en find no parece estar funcionando para mí en macOS dentro de un Makefile, incluso cuando se configura explícitamente SHELL golpear Pero la canalización a xargs para eliminar funcionó bien. No estoy muy seguro de qué se trata.

    – Taylor D. Edmiston

    2 de diciembre de 2021 a las 1:44


  • Para usuario de powershell Get-ChildItem -Recurse | where {$_.name -Match '__pycache__'} | Remove-Item -Force -Recurse

    – Pranithan T.

    15 de junio a las 14:39

Encontré la respuesta yo mismo 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 py3clean . lo limpió muy bien.

  • 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

    26 de mayo de 2016 a las 8:06

  • A partir de mayo de 2017, en macos/homebrew, tuve que usar el paquete pycleaner de pip, y el comando para ejecutarlo es pycleaner. Python 2 solamente.

    – Willian Mitsuda

    2 mayo 2017 a las 17:06

  • python3-minimal parece estar disponible solo en Debian (no se encuentra en RHEL, CentOS, brew, MacOS)

    – usuario12345

    24 de agosto de 2017 a las 0:15


  • curiosamente, mi py3clean (3.5.1-3) instalado no hace nada en realidad, no borra ninguno de esos archivos y simplemente regresa silenciosamente (python 3.6.5).

    – matanster

    21 de abril de 2019 a las 11:18

  • no elimina __pycache__ carpetas, ni .pyc archivos (probado en debian)

    – EricLavault

    18 oct 2019 a las 14:22


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

Empezando con Pitón 3.8 puedes usar la variable de entorno PYTHONPYCACHEPREFIX para definir un directorio de caché para Python.

De los documentos de Python:

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

Ejemplo

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

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

Python no creará el molesto __pycache__ directorios en el directorio de su proyecto, en su lugar, los pondrá todos bajo ~/.cache/cpython/

  • No, no todo .pyc los archivos están dentro de él.

    – Martín Tomas

    21 de enero de 2018 a las 7:26

  • @V.Gamula Este es un comando considerablemente más seguro que el que ~114 personas tuvieron la suerte de no morderlos con la eliminación permanente de una coincidencia errónea.

    – dlamblin

    7 oct 2018 a las 15:42


  • @MartinThoma en un proyecto solo de python3?

    – dlamblin

    7 oct 2018 a las 16:03

  • ¿Soy el único que está recibiendo Directory not empty con la segunda variante aquí?

    – matanster

    26 sep 2019 a las 15:40


  • buscar ./ ​​-escribir f -nombre ‘*.pyc’ -eliminar -imprimir && buscar ./ ​​-escribir d -nombre “pycaché” -eliminar -imprimir

    – nvd

    20 oct 2021 a las 22:14


avatar de usuario
leminhguyen

El comando que he usado:

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

Explica:

  1. Primero encuentra todo __pycache__ carpetas en el directorio actual.

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

Editado 1:

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

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

Editado 2:
si estás usando Código VSno es necesario eliminar __pycache__ a mano. Puede agregar el fragmento a continuación para settings.json expediente. Después, Código VS ocultará todo __pycache__ carpetas para ti

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

Espero eso ayude !!!

avatar de usuario
dlamblin

Este es mi alias que funciona tanto con Python 2 como con Python 3 eliminando todo .pyc .pyo archivos también __pycache__ directorios de forma recursiva.

alias pyclean='find . -name "*.py[co]" -o -name __pycache__ -exec rm -rf {} +'

avatar de usuario
hebrón watson

Estoy ejecutando Python3 y pip3 en una Mac. Para mí, la solución fue la siguiente (en el directorio raíz de mi proyecto):

pip3 install pyclean
pyclean .

Me gustaría enfatizar, ya que veo muchos respuestas que involucran secuencias de comandos de bash, es una buena práctica en software favorecer soluciones probadas a problemas (que es exactamente lo que representa un paquete de python establecido) sobre un enfoque hecho a mano.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad