¿Puedo ejecutar el intérprete de Python sin generar los archivos .pyc compilados?¿Cómo evitar los archivos .pyc?
Respuesta
De "What’s New in Python 2.6 - Interpreter Changes":
Python ahora se puede evitar que la escritura .pyc o archivos por .pyo suministrar el interruptor -B a la pitón intérprete, o estableciendo la PYTHONDONTWRITEBYTECODE ambiente variable antes de ejecutar el intérprete . Esta configuración está disponible en programas Python como la variable
sys.dont_write_bytecode
, y código Python puede cambiar el valor a modificar el comportamiento del intérprete.
Actualización 2010-11-27: Python 3.2 aborda la cuestión de que saturan las carpetas de origen con .pyc
archivos mediante la introducción de una subcarpeta __pycache__
especial, ver What's New in Python 3.2 - PYC Repository Directories.
Por lo que sé, python compilará todos los módulos que "importe". Sin embargo, python NO compilará una secuencia de comandos de python 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 puedas automatizar una forma de limpiar esto si se interponen en el camino.
he encontrado con frecuencia que hay código de bytes rancio 'archivos .pyc'. Por alguna razón, cuando cambio la clase/módulo, el archivo '.pyc' no se actualiza. Por lo tanto, cuando lo importe después de cambiar el archivo '.py', seguirá usando el archivo' .pyc', lo que provocará errores –
Puede hacer que los directorios que sus módulos existen sean de solo lectura para el usuario con el que se está ejecutando 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.
Imagino que probablemente haya otro problema que estás tratando de resolver, para el cual deshabilitar .py [co] parece ser una solución alternativa, pero probablemente sea mejor atacar el problema original.
En 2.5, no hay forma de suprimirlo, aparte de medidas como no darles a los usuarios acceso de escritura al directorio.
En python 2.6 y 3.0, sin embargo, 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 establecer la variable de entorno "PYTHONDONTWRITEBYTECODE"
Realmente hay una forma de hacerlo en Python 2.3+, pero es un poco esotérico. No sé si se da cuenta de esto, pero se puede 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'
De acuerdo con la biblioteca zipimport:
Los archivos pueden estar presentes en el archivo ZIP, pero sólo los archivos. py y .py [co] están disponibles para 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á modificar el archivo añadiendo 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á compilando esto para UNIX, también podría considerar empaquetar su script con esta receta: unix zip executable, pero tenga en cuenta que puede tener que modificar esto si planea usar stdin o leer algo de sys.args (PUEDE hacerse sin demasiados problemas).
En mi experiencia, el rendimiento no sufre demasiado debido a esto, pero debe pensar dos veces antes de importar cualquier módulo muy grande de esta manera.
import sys
sys.dont_write_bytecode = True
Esto no funciona para los módulos importados –
Acabo de probar esto y funciona para módulos importados. Específicamente, una vez que se establece esta variable, cualquier cosa importada posteriormente no generará archivos pyc. Esto es encantador Gracias. –
En lugar de agregar esto en el Módulo principal, intente agregar esto en el Script referenciado. Esto funciona bien. Gracias a @te wilson – Sathy
Tengo varios casos de prueba en un banco de pruebas y antes de que yo estaba corriendo el conjunto de pruebas en el Terminal de Mac como esto:
python LoginSuite.py
La ejecución del mandato de esta manera mi directorio estaba siendo poblada con archivos .pyc. Probé el método indicado a continuación y se solucionó el problema:
python -B LoginSuite.py
Este método funciona si está importando casos de prueba en el banco de pruebas y ejecución de la suite en la línea de comandos.
Puede establecer sys.dont_write_bytecode = True
en su fuente, pero tendría que estar en el primer archivo python cargado. Si ejecuta python somefile.py
, no obtendrá somefile.pyc
.
Al instalar una utilidad usando setup.py
y entry_points=
, habrá establecido sys.dont_write_bytecode
en el script de inicio. Por lo tanto, no puede confiar en el script de inicio "predeterminado" generado por las herramientas de configuración.
Si se inicia con el archivo Python Python como argumento mismo puede especificar -B
:
python -B somefile.py
somefile.pyc
no se generaría todos modos, pero no hay .pyc
archivos para otros archivos importados también.
Si tiene alguna utilidad myutil
y no puede cambiar eso, no pasará -B al intérprete de python. Simplemente comienza mediante el establecimiento de la variable de entorno PYTHONDONTWRITEBYTECODE
:
PYTHONDONTWRITEBYTECODE=x myutil
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 se establece en el ipython
intérprete o durante el inicio de ~/.ipython/profile-default/startup/00-startup.ipy
. en lugar de utilizar lo siguiente en su ~.ipython/profile-default/startup/00-startup.py
import sys
Sys.dont_write_bytecode=True
- 1. ¿Los archivos Python 2.5 .pyc son compatibles con los archivos .pyc de Python 2.6?
- 2. Hacer que Python ignore los archivos .pyc
- 3. Cambiar el directorio donde se crean los archivos .pyc
- 4. ¿Es posible evitar que Django cree archivos .pyc mientras está en desarrollo?
- 5. ¿Cuáles son las limitaciones de distribuir archivos .pyc?
- 6. ¿Cómo importa Python los módulos de los archivos .egg?
- 7. ¿Qué hacer con los archivos pyc cuando se usa Django o python con Mercurial?
- 8. ¿Por qué los scripts principales de Python ejecutables no se compilan en archivos pyc como módulos?
- 9. ¿Por qué los archivos .pyc de python contienen la ruta absoluta de su código fuente?
- 10. Cómo evitar los parámetros?
- 11. ¿Generas .pyc desde Python AST?
- 12. Cómo filtrar los archivos por extensión en NERDTree?
- 13. Cómo evitar que los navegadores guarden en caché los archivos CSS?
- 14. ¿Cómo controlar dónde van los archivos $ py.class?
- 15. git, no me muestres * .pyc en la lista de archivos sin seguimiento!
- 16. ¿Cómo se crean "Archivos temporales ASP.NET" (y cómo evitar duplicados)
- 17. Eliminación automática de archivos pyc cuando se mueve la py correspondiente (Mercurial)
- 18. ¿Cómo se compilaron los archivos python en una carpeta separada?
- 19. ¿Pueden generarse archivos de código de bytes compilados (.pyc) en un directorio diferente?
- 20. Cómo evitar enlaces profundos a archivos en mi sitio web
- 21. ¿Cómo evitar que los colores se mezclen?
- 22. ¿Cómo puedo evitar los decimales de redondeo?
- 23. ¿Cómo pueden los spammers evitar el captcha?
- 24. ¿Cómo evitar los constructores de código repetitivo?
- 25. ¿Cómo puedo evitar los cierres de Javascript?
- 26. Cómo evitar tropezar con BOM UTF-8 al leer archivos
- 27. Modo R + Org: ¿cómo evitar nombrar archivos de trazado?
- 28. ¿hay algún tipo de ganancia de rendimiento al usar archivos .pyc en python?
- 29. Cómo evitar que Visual Studio cree automáticamente archivos de solución
- 30. ¿Cómo puedo evitar la ingeniería inversa de los archivos .war de JavaEE 6?
Al menos en OS X 10.8 con Python 2.7 la variable de entorno no tiene efecto. – sorin
Si está incrustando el intérprete (en un programa C++), use "Py_DontWriteBytecodeFlag = 1;" en tu código fuenteEs una int global declarada en pydebug.h. – JimB
Sí, esto nunca funciona. – tar