Para las operaciones de archivo, Python utiliza el almacenamiento en búfer predeterminado del sistema operativo a menos que lo configure de otra manera. Puede especificar un tamaño de búfer, sin búfer o con búfer de línea.
Por ejemplo, la función abierta toma un argumento de tamaño de búfer.
http://docs.python.org/library/functions.html#open
"El argumento de almacenamiento en búfer opcional especifica el tamaño de búfer deseado del archivo:"
- 0 significa sin búfer,
- 1 significa línea tamponada,
- cualquier otro valor positivo significa usar un buffer de (aproximadamente) ese tamaño.
- Un almacenamiento en búfer negativo significa usar el valor predeterminado del sistema, que generalmente está protegido en línea para dispositivos tty y totalmente protegido para otros archivos.
- Si se omite, se utiliza el valor predeterminado del sistema.
código:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
open('file.txt', 'w', 1)
, obtengo el búfer de línea adecuado. Pero si hago algo más grande (que queríaopen('file.txt', 'w', 512)
), amortigua el totalio.DEFAULT_BUFFER_SIZE
de 8192. ¿Es eso un error de Python, un error de Linux o un error ID10t?stdout
tener un buffer de línea independientemente de si es una consola o ser redirigido a un archivo?write()
a un identificador de archivo, la salida se almacena en la memoria intermedia y se acumula hasta que el búfer está lleno ... en ese momento el búfer se "vacía" (el contenido se escribe desde el búfer en el archivo). Puede vaciar explícitamente el búfer llamando alflush()
método en un identificador de archivo.También puede forzar el vaciado del búfer a un archivo mediante programación con el
flush()
método.He encontrado esto útil al seguir un archivo de salida con
tail -f
.fuente
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
flushing
significa. ¿Por qué lo necesitamos? ¿Para qué sirve? ¿Por qué debería importarme?No sé si esto también se aplica a Python, pero creo que depende del sistema operativo que esté ejecutando.
En Linux, por ejemplo, la salida al terminal vacía el búfer en una nueva línea, mientras que para la salida a los archivos solo se vacía cuando el búfer está lleno (por defecto). Esto se debe a que es más eficiente vaciar el búfer menos veces y es menos probable que el usuario se dé cuenta si la salida no se vacía en una nueva línea en un archivo.
Es posible que pueda enjuagar automáticamente la salida si eso es lo que necesita.
EDITAR: creo que de esta manera se enjuagará automáticamente en Python (desde aquí )
fuente
También puede verificar el tamaño predeterminado del búfer llamando al atributo DEFAULT_BUFFER_SIZE de solo lectura desde el módulo io.
fuente
Aquí hay otro enfoque, hasta el OP para elegir cuál prefiere.
Al incluir el código a continuación en el
__init__
archivo .py antes que cualquier otro código, los mensajes impresosprint
y cualquier error ya no se registrarán en Ableton's Log.txt sino para separar los archivos en su disco:(para Mac, cambie
#username#
el nombre de su carpeta de usuario. En Windows, la ruta a su carpeta de usuario tendrá un formato diferente)Cuando abre los archivos en un editor de texto que actualiza su contenido cuando se cambia el archivo en el disco (ejemplo para Mac: TextEdit no lo hace pero TextWrangler sí), verá que los registros se actualizan en tiempo real.
Créditos: este código fue copiado principalmente de los scripts de superficie de control liveAPI por Nathan Ramella
fuente