make lets language how create compiler python compiler-construction interpreter

python - lets - ¿Cómo evitar archivos.pyc?



how to make an interpreter (9)

¿Puedo ejecutar el intérprete de Python sin generar los archivos .pyc compilados?


De "Lo nuevo en Python 2.6 - Cambios de intérprete" :

Ahora se puede evitar que Python escriba archivos .pyc o .pyo suministrando el interruptor -B al intérprete de Python, o configurando la variable de entorno PYTHONDONTWRITEBYTECODE antes de ejecutar el intérprete. Esta configuración está disponible para los programas de Python como la variable sys.dont_write_bytecode , y el código de Python puede cambiar el valor para modificar el comportamiento del intérprete.

Actualización 2010-11-27: Python 3.2 aborda el problema de saturar las carpetas de origen con .pyc __pycache__ mediante la introducción de una subcarpeta especial __pycache__ , consulte Novedades en Python 3.2 - Directorios del repositorio de PYC .


En la versión 2.5, no hay forma de suprimirlo, excepto medidas como no dar a los usuarios acceso de escritura al directorio.

Sin embargo, en Python 2.6 y 3.0, puede haber una configuración en el módulo sys llamada "dont_write_bytecode" que puede configurarse para suprimir esto. Esto también se puede establecer pasando la opción "-B", o configurando la variable de entorno "PYTHONDONTWRITEBYTECODE"


En realidad, hay una forma de hacerlo en Python 2.3+, pero es un poco esotérico. No sé si te das cuenta de esto, pero puedes hacer lo siguiente:

$ unzip -l /tmp/example.zip Archive: /tmp/example.zip Length Date Time Name -------- ---- ---- ---- 8467 11-26-02 22:30 jwzthreading.py -------- ------- 8467 1 file $ ./python Python 2.3 (#1, Aug 1 2003, 19:54:32) >>> import sys >>> sys.path.insert(0, ''/tmp/example.zip'') # Add .zip file to front of path >>> import jwzthreading >>> jwzthreading.__file__ ''/tmp/example.zip/jwzthreading.py''

Según la biblioteca zipimport :

Cualquier archivo puede estar presente en el archivo ZIP, pero solo los archivos .py y .py [co] están disponibles para la importación. La importación ZIP de módulos dinámicos (.pyd, .so) no está permitida. Tenga en cuenta que si un archivo solo contiene archivos .py, Python no intentará modificarlo agregando el archivo .pyc o .pyo correspondiente, lo que significa que si un archivo ZIP no contiene archivos .pyc, la importación puede ser bastante lenta.

Por lo tanto, todo lo que tiene que hacer es comprimir los archivos, agregar el archivo zip a su sys.path y luego importarlos.

Si está creando esto para UNIX, también podría considerar empaquetar su secuencia de comandos con esta receta: ejecutable zip de unix , pero tenga en cuenta que podría tener que modificar esto si planea usar stdin o leer algo de sys.args (PUEDE ser hecho sin demasiados problemas).

En mi experiencia, el rendimiento no sufre demasiado debido a esto, pero debería pensarlo dos veces antes de importar módulos muy grandes de esta manera.


Podría hacer que los directorios en los que existen sus módulos sean de solo lectura para el usuario con el que se ejecuta el intérprete de Python.

No creo que haya una opción más elegante. PEP 304 parece haber sido un intento de introducir una opción simple para esto, pero parece haber sido abandonado.

Me imagino que probablemente hay algún otro problema que estás tratando de resolver, por lo que deshabilitar .py [co] parece ser una solución alternativa, pero probablemente será mejor atacar lo que sea este problema original.


Puede establecer sys.dont_write_bytecode = True en su fuente, pero eso tendría que estar en el primer archivo de Python cargado. Si ejecuta python somefile.py entonces no obtendrá somefile.pyc .

Cuando instale una utilidad utilizando setup.py y entry_points= habrá configurado sys.dont_write_bytecode en el script de inicio. Por lo tanto, no puede confiar en el script de inicio "predeterminado" generado por setuptools.

Si inicia Python con el archivo python como argumento, puede especificar -B :

python -B somefile.py

somefile.pyc no se generaría de todos modos, pero tampoco se .pyc archivos .pyc para otros archivos.

Si tiene alguna utilidad myutil y no puede cambiarla, no pasará -B al intérprete de python. Simplemente comience configurando la variable de entorno PYTHONDONTWRITEBYTECODE :

PYTHONDONTWRITEBYTECODE=x myutil


Que yo sepa, Python compilará todos los módulos que "importes". Sin embargo, Python NO compilará una secuencia de comandos de python que se ejecute utilizando: "python script.py" (sin embargo, compilará los módulos que importa la secuencia de comandos).

La verdadera pregunta es ¿por qué no quieres que Python compile los módulos? Probablemente podría automatizar una forma de limpiarlos si se interponen en el camino.


Solución para ipython 6.2.1 using python 3.5.2 (Probado en Ubuntu 16.04 y Windows 10):

Ipython no respeta %env PYTHONDONTWRITEBYTECODE =1 si está configurado en el intérprete de ipython o durante el inicio en ~/.ipython/profile-default/startup/00-startup.ipy . En su lugar, utilice lo siguiente en su ~.ipython/profile-default/startup/00-startup.py

import sys Sys.dont_write_bytecode=True


Tengo varios casos de prueba en una suite de prueba y antes de ejecutar la suite de prueba en la Terminal de Mac de esta manera:

python LoginSuite.py

Ejecutando el comando de esta manera mi directorio estaba siendo llenado con archivos .pyc. Probé el siguiente método y resolví el problema:

python -B LoginSuite.py

Este método funciona si está importando casos de prueba al conjunto de pruebas y ejecutando el conjunto en la línea de comandos.


import sys sys.dont_write_bytecode = True