¿Puedo ejecutar el intérprete de Python sin generar los archivos .pyc compilados?
268
De "Qué hay de nuevo en Python 2.6 - Cambios de intérprete" :
Ahora se puede evitar que Python escriba archivos .pyc o .pyo proporcionando el modificador -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
sys.dont_write_bytecode
variable, 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 desordenar las carpetas de origen con .pyc
archivos mediante la introducción de una __pycache__
subcarpeta especial , consulte Novedades en Python 3.2 - Directorios del repositorio PYC .
export PYTHONDONTWRITEBYTECODE=1
fuente
site-packages/usercustomize.py
para hacer que esto se aplique a todos sus scripts. Para mí, este directorio fue$HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
. Cf. docs.python.org/2/tutorial/…import sys; sys.dont_write_bytecode = True
De hecho, hay una manera 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:
De acuerdo con la biblioteca zipimport :
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á compilando esto para UNIX, también puede considerar empaquetar su script usando esta receta: unix zip ejecutable , pero tenga en cuenta que es posible que tenga que modificar esto si planea usar stdin o leer cualquier cosa de sys.args (PUEDE ser hecho sin demasiados problemas).
En mi experiencia, el rendimiento no sufre demasiado debido a esto, pero debe pensarlo dos veces antes de importar módulos muy grandes de esta manera.
fuente
En 2.5, no hay forma de suprimirlo, aparte de 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 se puede configurar para suprimir esto. Esto también se puede configurar pasando la opción "-B" o configurando la variable de entorno "PYTHONDONTWRITEBYTECODE"
fuente
Puede configurar
sys.dont_write_bytecode = True
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 usando
setup.py
yentry_points=
habrá establecidosys.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
:somefile.pyc
no se generaría de todos modos, pero tampoco se.pyc
importarían archivos 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 entornoPYTHONDONTWRITEBYTECODE
:fuente
Tengo varios casos de prueba en un conjunto de pruebas y antes de ejecutar el conjunto de pruebas en la Terminal de Mac de esta manera:
Al ejecutar el comando de esta manera, mi directorio se estaba rellenando con archivos .pyc. Probé el método indicado a continuación y resolvió el problema:
Este método funciona si está importando casos de prueba en el conjunto de pruebas y está ejecutando el conjunto en la línea de comandos.
fuente
Comenzando con Python 3.8 , puede usar la variable de entorno
PYTHONPYCACHEPREFIX
para definir un directorio de caché para Python.De los documentos de Python:
Ejemplo
Si agrega la siguiente línea a su
./profile
en Linux:Python no creará los
__pycache__
directorios molestos en el directorio de su proyecto, sino que los colocará a todos bajo~/.cache/cpython/
fuente
Puede 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, para el cual deshabilitar .py [co] parecería ser una solución, pero probablemente sea mejor atacar el problema original.
fuente
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 elipython
intérprete o durante el inicio en~/.ipython/profile-default/startup/00-startup.ipy
. En lugar de usar lo siguiente en su~.ipython/profile-default/startup/00-startup.py
fuente
Hasta donde sé, Python compilará todos los módulos que "importe". Sin embargo, python NO compilará una secuencia de comandos de Python ejecutada usando: "python script.py" (sin embargo, compilará cualquier módulo que importe 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.
fuente
.pyc
archivos de bytecode obsoletos . Por alguna razón, cuando cambio la clase / módulo, el.pyc
archivo no se actualiza. Entonces, cuando lo importo después de cambiar el.py
archivo, seguirá.pyc