Existe-t-il un moyen en Python de convertir des caractères tels qu'ils sont saisis par l'utilisateur en astérisques, comme cela peut être vu sur de nombreux sites Web?

Par exemple, si un utilisateur de messagerie était invité à se connecter à son compte, tout en tapant son mot de passe, il n'apparaîtrait pas sous forme de caractères mais plutôt sous la forme * après chaque coup individuel sans aucun décalage.

Si le mot de passe réel était KermitTheFrog, il apparaîtrait comme ************* lors de la saisie.

14
LeroyJD 4 mars 2016 à 23:02

6 réponses

Meilleure réponse

Il y a getpass(), une fonction qui cache l'entrée utilisateur.

import getpass

password = getpass.getpass()
print(password)
21
pp_ 4 mars 2016 à 20:04

Tu peux le faire:

# if getch module is available, then we implement our own getpass() with asterisks,
# otherwise we just use the plain boring getpass.getpass()
try:
    import getch
    def getpass(prompt):
        """Replacement for getpass.getpass() which prints asterisks for each character typed"""
        print(prompt, end='', flush=True)
        buf = ''
        while True:
            ch = getch.getch()
            if ch == '\n':
                print('')
                break
            else:
                buf += ch
                print('*', end='', flush=True)
        return buf
except ImportError:
    from getpass import getpass
2
Stevoisiak 8 avril 2019 à 17:09

Si vous utilisez Tkinter: (c'est Python 2.x. Cependant, 3.x serait très similaire)

from Tkinter import Entry, Tk

master = Tk()

Password = Entry(master, bd=5, width=20, show="*")
Password.pack()

master.mainloop()

Password entry with tkinter

Dans le shell, ce n'est pas possible. Vous pouvez cependant écrire une fonction pour stocker le texte saisi et signaler uniquement une chaîne de * lors de l'appel. Un peu comme ça, que je n'ai pas écrit. Je l'ai juste googlé.

8
Stevoisiak 8 avril 2019 à 17:12

Lors de l'utilisation de getpass en python, rien n'est indiqué pour afficher une entrée de mot de passe.

Cela peut être résolu par cette solution simple:

Copiez simplement le module ‘getpass_ak.py’ fourni dans le lien vers le dossier Lib de python.

https://starrernet.wixsite.com/analytix/python-coder

utilisez le code suivant:

import getpass_ak

a = (getpass_ak.getpass('password: '))

Cela ajoutera * à vos entrées de mot de passe.

0
Ch3steR 11 janv. 2020 à 20:17

Vous voudrez peut-être vérifier la fonction getpass.

Demander à l'utilisateur un mot de passe sans écho. L'utilisateur est invité à utiliser l'invite de chaîne, qui est par défaut «Mot de passe:». Sous Unix, l'invite est écrite dans le flux d'objets de type fichier. Le flux par défaut est le terminal de contrôle (/ dev / tty) ou s'il n'est pas disponible pour sys.stderr (cet argument est ignoré sous Windows).

Remarque: ce module imite les invites de mot de passe Unix et n'affiche pas les astérisques.

Usage:

import getpass
getpass.getpass()
0
Łukasz Rogalski 12 nov. 2019 à 15:36

Pour quiconque souhaite réellement voir apparaître des astérisques, voici une amélioration de la réponse de Tigran Aivazian. Cette version importe le msvcrt.getch intégré, ajoute des cas pour différentes fins de ligne lorsque vous appuyez sur 'Entrée / Retour', et inclut une logique pour prendre en charge le retour arrière, ainsi que Ctrl + C (KeyboardInterrupt):

try:
    from msvcrt import getch
    def getpass(prompt):
        """Replacement for getpass.getpass() which prints asterisks for each character typed"""
        print(prompt, end='', flush=True)
        buf = b''
        while True:
            ch = getch()
            if ch in {b'\n', b'\r', b'\r\n'}:
                print('')
                break
            elif ch == b'\x08': # Backspace
                buf = buf[:-1]
                print(f'\r{(len(prompt)+len(buf)+1)*" "}\r{prompt}{"*" * len(buf)}', end='', flush=True)
            elif ch == b'\x03': # Ctrl+C
                raise KeyboardInterrupt
            else:
                buf += ch
                print('*', end='', flush=True)
        return buf.decode(encoding='utf-8')
except ImportError:
    from getpass import getpass

N'hésitez pas à suggérer d'autres changements ou des moyens d'améliorer cela; J'ai piraté les changements ensemble assez rapidement, en particulier avec la logique de retour arrière.

0
Ahndwoo 13 févr. 2020 à 15:51