2008-09-30 33 views

Respuesta

262

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.

+1

Al menos en OS X 10.8 con Python 2.7 la variable de entorno no tiene efecto. – sorin

+2

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

+2

Sí, esto nunca funciona. – tar

1

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.

+0

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 –

1

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.

9

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"

22

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.

91
import sys 

sys.dont_write_bytecode = True 
+8

Esto no funciona para los módulos importados –

+22

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. –

+0

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

2

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.

6

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 
0

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 
Cuestiones relacionadas