when variable the storing productos predefined name its imported generar descompilar current contents compileall called archivos python pyc

variable - python precompile



Hacer que Python ignore los archivos.pyc (6)

¿Hay alguna forma de hacer que Python ignore los archivos .pyc que están presentes y siempre interprete todo el código (incluidos los módulos importados) directamente? Google no ha encontrado ninguna respuesta, así que sospecho que no, pero vale la pena preguntar por si acaso.

(¿Por qué quiero hacer esto? Tengo una gran cantidad de secuencias de comandos de Python que se ejecutan repetidamente en un grupo de un par de cientos de computadoras. Las mismas secuencias de comandos de Python viven en un sistema de archivos NFS compartido. muchas veces durante varias horas, repentinamente empezarán a fallar con un error acerca de no poder importar un módulo. Forzar la regeneración del archivo .pyc soluciona el problema. Por supuesto, quiero solucionar las causas subyacentes, pero en el Mientras tanto, también necesitamos que el sistema continúe ejecutándose, por lo que parece que ignorar los archivos .pyc sería una solución alternativa razonable.

PS Estoy usando Python 2.5, así que no puedo usar -B.


Bueno, no creo que Python interprete el código directamente si estás cargando el código desde un archivo. Incluso cuando se utiliza el shell interactivo, Python compilará el módulo importado en un .pyc.

Dicho esto, podría escribir un script de shell para continuar y eliminar todos los archivos .pyc antes de iniciar sus scripts. Eso ciertamente forzaría una reconstrucción completa antes de cada ejecución.


En caso de que alguien esté usando Python 2.6 o superior con la misma pregunta, lo más simple es:

  1. Eliminar todos los archivos .pyc
  2. Ejecute todos sus intérpretes de Python con la opción -B , para que no generen archivos .pyc.

De la documentación:

-B Si se da, Python no intentará escribir archivos .pyc o .pyo en la importación de módulos de origen. Véase también PYTHONDONTWRITEBYTECODE.

Nuevo en la versión 2.6.

Si no puede eliminar todos los .pycs, entonces podría:

1) Ejecute todos sus intérpretes de python con las opciones -B -O .

Esto le indicará a Python que busque archivos .pyo para bytecode en lugar de archivos .pyc ( -O ) y le indicará a Python que no genere ningún archivo de bytecode ( -B ).

La combinación de las dos opciones, asumiendo que no las ha usado antes, es que Python no generará ningún archivo de código de bytes y no buscará los archivos de código de bytes que se habrían generado en ejecuciones más antiguas.

De la documentación:

-B Si se da, Python no intentará escribir archivos .pyc o .pyo en la importación de módulos de origen. Véase también PYTHONDONTWRITEBYTECODE.

Nuevo en la versión 2.6.

-O Activar optimizaciones básicas. Esto cambia la extensión del nombre de archivo para los archivos compilados (bytecode) de .pyc a .pyo. Ver también PYTHONOPTIMIZE.


No es exactamente lo que pediste, pero ¿eliminar los archivos .pyc existentes y luego no crear más trabajo para ti? En ese caso, podrías usar la opción -B:

>python --help usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... Options and arguments (and corresponding environment variables): -B : don''t write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x



Quizás pueda solucionar esto, por ejemplo, programando un trabajo para cerrar periódicamente los scripts y eliminar los archivos .pyc.


Podría usar el módulo imp estándar de la biblioteca de Python para __builtins__.__import__ , que es la función de __builtins__.__import__ llamada import y from statement. En particular, la función imp.load_module se puede usar para cargar un .py incluso cuando el correspondiente .pyc está presente. Asegúrate de estudiar detenidamente todos los documentos de la página que he señalado, más los de import , ya que es un trabajo delicado. Los propios documentos sugieren utilizar enganches de importación en su lugar (según PEP 302), pero para esta tarea en particular sospecho que sería aún más difícil.

Por cierto, las causas probables de los problemas observados incluyen condiciones de carrera entre diferentes computadoras que intentan escribir archivos .pyc al mismo tiempo. El bloqueo NFS es notoriamente inestable y siempre ha sido ;-). Siempre que cada compilador de Python que estés usando esté en la misma versión (de lo contrario, de todos modos estás en un gran problema ;-), prefiero compilar todos esos archivos .py en .pyc y hacer que sus directorios sean leídos. solamente; Este último parece ser el enfoque más simple de todos modos (en lugar de piratear __import__ ), incluso si por alguna razón no puede precompilar.