web-dev-qa-db-fra.com

Supprimer la dernière ligne stdout dans Python

J'essaie de comprendre comment supprimer l'affichage de l'entrée de l'utilisateur sur stdout.

raw_input() Suivi par une instruction d'impression conserve ce que l'utilisateur saisit. getpass() ne montre pas ce que l'utilisateur a tapé, mais conserve le "mot de passe:".

Pour résoudre ce problème, je voudrais simplement retirer la dernière ligne (qui supprimerait également la nouvelle ligne de la fin de la ligne).

30
javanix

Vous pourrez peut-être faire ce que vous voulez avec codes de contrôle VT1 .

Quelque chose comme ça peut-être:

CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)
41

Je ne suis pas totalement sûr que cela fonctionne: peut-être que vous pourriez, juste avant d'appeler raw_input(), remplacez sys.stdout Avec votre objet ressemblant à un fichier auto-défini qui avale la sortie. Juste après cela, vous pourriez définir sys.stdout retour à ce que cela a été auparavant.

EDIT: On dirait que cette approche ne fonctionne pas, car quels que soient les types d'utilisateurs dans l'écran.

Une autre option pour la manipulation de la console et le contrôle du clavier direct sont Curse .

1
Jan-Philip Gehrcke

Le code suivant, basé sur le Python docs, utilise le module termios et semble faire ce que vous voulez (bien qu'il ne soit pas aussi compact que les codes de contrôle VT100):

def getpass(Prompt="Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = raw_input(Prompt)
        print '\r          \r',
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd

p = getpass()

Il y a deux lignes difficiles: l'une désactive l'écho, l'autre efface votre mot de passe de mot de passe restant à la première position de la ligne.

1
Vicent

Donnez cela un essai:

CURSOR_UP = '\033[F'
ERASE_LINE = '\033[K'
print(CURSOR_UP + ERASE_LINE)
1
Ohad Cohen

Si ce que vous faites, c'est lire un mot de passe, utilisez getpass. Il y a beaucoup de subtils gotchas impliqués dans la lecture d'un mot de passe en toute sécurité; Ce n'est pas un code que vous voulez vous écrire.

Si vous faites quelque chose de moins critique de sécurité, la désactivation du terminal ECHO peut être effectuée avec le termios module. (Je souhaite que l'exemple de code il n'existait pas une implémentation incomplète et dangereuse de getpass, soupir. Mais il vous montre comment éteindre l'écho terminal.)

Si vous êtes sous Windows, il y a un équivalent mais je ne sais pas ce que c'est, et cela peut ne pas être exposé dans le Python Bibliothèque standard.

1
zwol