Cómo tener una contraseña repetida como asteriscos

Estoy intentando averiguar cómo solicitar una contraseña, y hacer que los usuarios ingresen el eco como asteriscos ( ******** )

Hace poco, asumí el proyecto de crear un servidor remoto que pudiera conectarse al uso del módulo de socket en Python. Todavía no está hecho, ya que estoy en el proceso de hacer que la consola se utilice para conectarse al servidor.

Estoy intentando hacer una ventana de inicio de sesión donde se le pide a un usuario que ingrese su nombre de usuario y contraseña, aunque cuando se ingresa la contraseña, estoy buscando asteriscos para imprimir, como la entrada de contraseña común (es decir, – Sekr3t se repite como: * * * * * *).

Después de días de investigación al respecto, ya casi he terminado, todavía hay un último error que me está volviendo loco (soy completamente incapaz de resolverlo). Nota: sé que hay un módulo getpass que podría usarse para reemplazar esto, con mucha mayor facilidad, pero nada de eco no es exactamente lo que estoy buscando.

Aquí está el código de inicio de sesión de contraseña que tengo hasta ahora, y no puedo entender por qué no se hace eco de los asteriscos:

     import msvcrt import sys def login(prompt = '> '): write = sys.stdout.write for x in prompt: msvcrt.putch(x) passw = "" while 1: x = msvcrt.getch() if x == '\r' or x == '\n': break if x == '\b': # position of my error passw = passw[:-1] else: write('*') passw = passw + x msvcrt.putch('\r') msvcrt.putch('\n') return passw 

    >

    Si leyó el código y / o lo corrió a través de algo como IDLE, podría notar que cuando el usuario está en el espacio de atrás, los datos almacenados se borran con un carácter, pero los asteriscos impresos no. es decir, Sekr3t + retroceso = Sekr3, pero * * * * * * se muestra con eco. Cualquier ayuda sobre cómo borrar el último asterisco cuando se ingresa el retroceso se agradecería enormemente. También tenga en cuenta que gran parte de este código era del módulo getpass. Sé que no es una explicación tan buena, y probablemente no sea un código tan bueno, pero todavía estoy aprendiendo, por favor, tengan paciencia conmigo.

    Debería poder borrar un asterisco escribiendo los caracteres \x08 \x08 . El \x08 moverá el cursor hacia atrás una posición, el espacio sobrescribirá el asterisco, luego el último \x08 moverá el cursor hacia atrás nuevamente, colocándolo en la posición correcta para escribir el siguiente * .

    No sé de antemano cómo determinar cuándo se escribe un retroceso, pero puede hacerlo fácilmente: solo agregue algo como print repr(x) después de haber llamado x = msvcrt.getch() , luego inicia tu progtwig y pulsa backspace.

    Creo que esta manera es muy simple y efectiva.

     import sys import msvcrt passwor = '' while True: x = msvcrt.getch() if x == '\r': break sys.stdout.write('*') passwor +=x print '\n'+passwor