Por lo que tengo entendido, un caché es un archivo encriptado de archivos similares.
¿Qué hacemos con la carpeta __pycache__
? ¿Es lo que damos a la gente en lugar de nuestro código fuente? ¿Es sólo mis datos de entrada? Esta carpeta se sigue creando, ¿para qué sirve?
Cuando ejecutas un programa en python, el intérprete lo compila primero a bytecode (esto es una simplificación excesiva) y lo almacena en la carpeta __pycache__
. Si miras allí encontrarás un montón de archivos que comparten los nombres de los archivos .py de tu carpeta de proyecto, sólo que sus extensiones serán .pyc o .pyo. Son versiones compiladas en bytecode y optimizadas en bytecode de los archivos de tu programa, respectivamente.
Como programador, puedes ignorarlo en gran medida... Todo lo que hace es hacer que su programa se inicie un poco más rápido. Cuando tus scripts cambien, serán recompilados, y si borras los archivos o toda la carpeta y ejecutas tu programa de nuevo, volverán a aparecer (a menos que suprimas específicamente ese comportamiento)
Si estás usando cpython (que es lo más común, ya que es la implementación de referencia) y no quieres esa carpeta, entonces puedes suprimirla iniciando el intérprete con la bandera -B, por ejemplo
python -B foo.py
Otra opción, como señaló tcaswell, es establecer la variable de entorno PYTHONDONTWRITEBYTECODE
a cualquier valor (según la página man de python, cualquier "cadena no vacía").
__pycache__
es una carpeta que contiene código de bytes de Python 3 compilado y listo para ser ejecutado.
No recomiendo borrar rutinariamente estos archivos o suprimir su creación durante el desarrollo ya que puede perjudicar el rendimiento. Simplemente tenga un comando recursivo listo (ver abajo) para limpiar cuando sea necesario ya que el bytecode puede volverse obsoleto en casos extremos (ver comentarios).
Los programadores de Python suelen ignorar el bytecode. De hecho __pycache__
y *.pyc
son líneas comunes que se ven en los archivos .gitignore
. El bytecode no está pensado para su distribución y puede ser desensamblado usando el módulo dis
.
Si estás usando OS X puedes ocultar fácilmente todas estas carpetas en tu proyecto ejecutando el siguiente comando desde la carpeta raíz de tu proyecto.
find . -name '__pycache__' -exec chflags hidden {} \;
Sustituye __pycache__
por *.pyc
para Python 2.
Esto establece una bandera en todos esos directorios (archivos .pyc) diciéndole a Finder/Textmate 2 que los excluya de los listados. Lo importante es que el código de bytes está ahí, sólo está oculto.
Vuelva a ejecutar el comando si crea nuevos módulos y desea ocultar el nuevo bytecode o si borra los archivos de bytecode ocultos.
En Windows el comando equivalente podría ser (no se ha probado, se agradece el script por lotes):
dir * /s/b | findstr __pycache__ | attrib +h +s +r
Que es lo mismo que recorrer el proyecto ocultando carpetas con el botón derecho > ocultar...
Ejecutar pruebas unitarias es un escenario (más en los comentarios) donde borrar los archivos *.pyc
y las carpetas __pycache__
es realmente útil. Yo uso las siguientes líneas en mi ~/.bash_profile
y simplemente ejecuto cl
para limpiar cuando sea necesario.
alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc" -delete'
...
alias cl='cpy && cpc && ...'
En la versión 3.2 y posteriores, Python guarda los archivos de código byte compilado .pyc en un subdirectorio llamado __pycache__
ubicado en el directorio donde residen tus archivos fuente con nombres de archivo que identifican la versión de Python que los creó (por ejemplo, script.cpython-33.pyc)