Parece que solo está haciendo un avance de línea pero no un retorno de carro. Cambia tu impresión a
print("ASD", end="\r\n")
El problema que está experimentando es la diferencia entre los modos 'crudo', 'cocido' y 'desmenuzado'. Y estos modos son modos del controlador de terminal a nivel de kernel, no modos del código de su aplicación o la biblioteca estándar o cualquier otra cosa en el espacio de usuario. Esta es la forma Unix de la vieja escuela de referirse a estos. Posix los reemplazó con un conjunto de atributos mucho más detallado, aunque los atributos de Posix generalmente se invierten junto con las funciones auxiliares de una manera que imita los antiguos modos 'crudo', 'cocido' y 'desmenuzado'.
En el modo cocinado, el propio controlador de terminal tiene una función de edición de línea primitiva integrada. Maneja el retroceso, el borrado de palabras (básicamente retrocede una palabra completa a la vez) y cosas similares. Nada sofisticado como manejar teclas de dirección o historial o algo por el estilo. Muy primitivo. En este modo, su programa nunca ve nada desde la terminal hasta que se envía el carácter de fin de línea (eol), y luego su programa obtiene una línea completa, y el final de la línea se traduce al 02 independientemente de lo que el terminal realmente haga. Además, como parte de esto, el controlador de la terminal repite los caracteres escritos en la terminal para que el usuario pueda ver lo que está escribiendo.
En el modo 'cocinado', el controlador de terminal a nivel de kernel también realiza alguna traducción de salida. Y parte de eso es cumplir 10
en 22
si es necesario.
Además, en el modo 'cocinado', el controlador de terminal maneja caracteres especiales como Control-C (envía un SIGINT al grupo de procesos de control (traducido por CPython en una excepción KeyboardInterrupt)) y Control-Z (envía un SIGTSTP (como SIGSTOP, pero puede ser capturado) al grupo de procesos de control).
En el modo 'cbreak', ya no se realiza la edición de líneas. El controlador de terminal proporciona cada carácter (o secuencia de caracteres corta, como la secuencia de escape de una tecla de flecha) al programa inmediatamente. Estos caracteres no se repiten en la pantalla, por lo que, a menos que su programa los imprima, el usuario no los verá. Sin embargo, el controlador de terminal todavía maneja caracteres especiales como Control-C y Control-Z, aunque deja de manejar caracteres de edición de línea como retroceso o el carácter de borrado de palabras (normalmente Control-W). Además, aún se realiza algún procesamiento de salida, por lo que el controlador convierte un 34
en un 41
.
En el modo 'sin procesar', no se realiza ningún procesamiento ni en la entrada ni en la salida. Sin manejo especial de caracteres, sin eco, sin transformación 51
en 69
, sin manipulación para Control-Z, nada. Depende del programa que pone la terminal en modo sin procesar para hacerlo todo.
Ahora, está configurando los atributos para 76
por lo que puede pensar que esto no debería afectar a 81
. Pero, de hecho, ambos descriptores de archivo conducen exactamente a la misma 'instancia' de un controlador de terminal. Y es la configuración del controlador de terminal la que determina lo que sucede. Así que no importa si cambias esa configuración a través de 96
, 108
, o incluso 111
, todos cambian la misma instancia de controlador de terminal subyacente y afectan a todos los demás.
Esto, por supuesto, no se aplica a los descriptores de archivos que han sido redirigidos por el shell antes de iniciar su programa.
Como nota al margen, puede utilizar el 127
en la línea de comando para ver una lectura completa de todas estas banderas (incluyendo qué caracteres de control dan como resultado qué señales en los modos cocinado y roto).
Google me trajo aquí cuando estaba buscando una respuesta a esta misma pregunta. La pista compartida por Halex de que no hay retorno de carro ayudó en mi búsqueda de la verdad. Encontré mis respuestas en una publicación en Chris's Wiki:https://utcc.utoronto.ca/~cks/space/blog/unix/CBreakAndRaw, lo que me llevó a leer la fuente de tty.py aquí:https://hg. python.org/cpython/file/618ea5612e83/Lib/tty.pyLo que me llevó a la conclusión de que si el objetivo es leer caracteres individuales, en lugar de:
tty.setraw()
Usar:
tty.setcbreak()