¿Qué es __pycache__?

Resuelto user2063042 asked hace 11 años • 0 respuestas

Por lo que tengo entendido, un caché es un archivo cifrado de archivos similares.

¿Qué hacemos con la __pycache__carpeta? ¿Es lo que le damos a la gente en lugar de nuestro código fuente? ¿Son solo mis datos de entrada? Esta carpeta se sigue creando, ¿para qué sirve?

user2063042 avatar Jun 01 '13 11:06 user2063042
Aceptado

Cuando ejecuta un programa en Python, el intérprete lo compila primero en código de bytes (esto es una simplificación excesiva) y lo almacena en la __pycache__carpeta. Si miras allí, encontrarás un montón de archivos que comparten los nombres de los .pyarchivos en la carpeta de tu proyecto, solo sus extensiones serán .pyco .pyo. Estas son versiones compiladas con código de bytes y compiladas con código de bytes optimizadas de los archivos de su programa, respectivamente.

Como programador, puedes ignorarlo en gran medida... Todo lo que hace es hacer que tu programa comience un poco más rápido. Cuando sus scripts cambien, se volverán a compilar y, si elimina los archivos o la carpeta completa y ejecuta el programa nuevamente, volverán a aparecer (a menos que suprima específicamente ese comportamiento).

Cuando envías tu código a otras personas, la práctica común es eliminar esa carpeta, pero realmente no importa si lo haces o no. Cuando utiliza el control de versiones ( git), esta carpeta normalmente aparece en el archivo ignorado ( .gitignore) y, por lo tanto, no se incluye.

Si está utilizando CPython (que es el más común, ya que es la implementación de referencia) y no desea esa carpeta, puede suprimirla iniciando el intérprete con el indicador -B, por ejemplo.

python -B foo.py

Otra opción, como señala tcaswell, es establecer la variable de entorno PYTHONDONTWRITEBYTECODEen cualquier valor (según la página de manual de Python, cualquier "cadena no vacía").

scott_fakename avatar Jun 01 '2013 04:06 scott_fakename

__pycache__es una carpeta que contiene el código de bytes de Python 3 compilado y listo para ser ejecutado .

No recomiendo eliminar estos archivos de forma rutinaria y laboriosa ni suprimir su creación durante el desarrollo, ya que le hará perder tiempo. Simplemente tenga listo un comando recursivo (ver más abajo) para limpiarlo cuando sea necesario, ya que el código de bytes puede volverse obsoleto en casos extremos (ver comentarios).

Los programadores de Python normalmente ignoran el código de bytes. Efectivamente __pycache__y *.pycson líneas habituales de ver en .gitignorearchivos. El código de bytes no está destinado a la distribución y se puede desmontar utilizando disel módulo .


Si está utilizando OS X, puede ocultar fácilmente todas estas carpetas en su proyecto ejecutando el siguiente comando desde la carpeta raíz de su proyecto.

find . -name '__pycache__' -exec chflags hidden {} \;

Reemplazar __pycache__con *.pycpara Python 2.

Esto establece una bandera en todos esos directorios (archivos .pyc) que le indica a Finder/Textmate 2 que los excluya de los listados. Es importante destacar que el código de bytes está ahí, simplemente está oculto.

Vuelva a ejecutar el comando si crea nuevos módulos y desea ocultar el nuevo código de bytes o si elimina los archivos de código de bytes ocultos.


En Windows, el comando equivalente podría ser (no probado, se acepta script por lotes):

dir * /s/b | findstr __pycache__ | attrib +h +s +r

Lo cual es lo mismo que revisar las carpetas ocultas del proyecto usando clic derecho > ocultar...


La ejecución de pruebas unitarias es un escenario (más en los comentarios) en el que eliminar *.pycarchivos y __pycache__carpetas es realmente útil. Utilizo las siguientes líneas en mi ~/.bash_profiley simplemente las ejecuto clpara limpiar cuando es necesario.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'

y más últimamente

# pip install pyclean
pyclean .
fmalina avatar Feb 06 '2015 11:02 fmalina

Se crea una __pycache__carpeta cuando usas la línea:

import file_name

o intenta obtener información de otro archivo que hayas creado. Esto lo hace un poco más rápido cuando ejecuta su programa por segunda vez para abrir el otro archivo.

Aliaksandr S. avatar Feb 17 '2018 20:02 Aliaksandr S.