python python-internals pyc

python - ¿Cuándo se actualizan los archivos.pyc?



python-internals (2)

Los archivos .pyc se generan cada vez que se importan los elementos de código correspondientes y se actualizan si se han actualizado los archivos de códigos correspondientes. Si los archivos .pyc se eliminan, se regenerarán automáticamente. Sin embargo, no se eliminan automáticamente cuando se eliminan los archivos de código correspondientes.

Esto puede causar algunos errores realmente divertidos durante los refactores a nivel de archivo.

En primer lugar, puede terminar presionando el código que solo funciona en su máquina y en nadie más. Si tiene referencias pendientes a los archivos que eliminó, estos seguirán funcionando localmente si no elimina manualmente los archivos .pyc relevantes porque los archivos .pyc se pueden usar en las importaciones. Esto se complica con el hecho de que un sistema de control de versiones configurado correctamente solo enviará archivos .py al repositorio central, no a los archivos .pyc, lo que significa que su código puede pasar la "prueba de importación" (¿todo importa bien?) Bien y no trabajar en la computadora de otra persona.

En segundo lugar, puede tener algunos errores bastante terribles si convierte los paquetes en módulos. Cuando convierte un paquete (una carpeta con un archivo __init__.py ) en un módulo (un archivo .py), los archivos .pyc que alguna vez representaron ese paquete permanecen. En particular, el __init__.pyc permanece. Entonces, si tiene el paquete foo con algún código que no importe, luego elimine ese paquete y cree un archivo foo.py con alguna función def bar(): pass y ejecute:

from foo import bar

usted obtiene:

ImportError: cannot import name bar

porque Python todavía está usando los viejos archivos .pyc del paquete foo, ninguno de los cuales define la barra. Esto puede ser especialmente problemático en un servidor web, donde el código totalmente funcional se puede romper debido a los archivos .pyc.

Como resultado de estas dos razones (y posiblemente otras), su código de implementación y código de prueba deberían eliminar archivos .pyc, como con la siguiente línea de bash:

find . -name ''*.pyc'' -delete

Además, a partir de Python 2.6, puede ejecutar python con el indicador -B para no usar archivos .pyc. Consulte Cómo evitar los archivos .pyc? para más detalles.

Ver también: ¿Cómo elimino todos los archivos .pyc de un proyecto?

Entiendo que los archivos ".pyc" son versiones compiladas de los archivos ".py" de texto sin formato, creados en tiempo de ejecución para que los programas se ejecuten más rápido. Sin embargo, he observado algunas cosas:

  1. Tras la modificación de los archivos "py", el comportamiento del programa cambia. Esto indica que los archivos "py" se compilan o al menos se someten a algún tipo de proceso de hashing o comparan marcas de tiempo para saber si deben volver a compilarse o no.
  2. Al eliminar todos los archivos ".pyc" ( rm *.pyc ), a veces el comportamiento del programa cambiará. Lo que indicaría que no se están compilando en la actualización de ".py" s.

Preguntas:

  • ¿Cómo deciden cuándo se compilará?
  • ¿Hay alguna manera de garantizar que tengan un control más estricto durante el desarrollo?

Los archivos .pyc se crean (y posiblemente se sobrescriben) solo cuando otro script lo importa. Si se llama a la importación, Python verifica si la marca de tiempo interna del archivo .pyc coincide con el archivo .py correspondiente. Si lo hace, carga el .pyc ; si no lo hace o si el .pyc aún no existe, Python compila el archivo .py en .pyc y lo carga.

¿Qué quiere decir con "control más estricto"?