Python-Eingabeaufforderung für Benutzer mit echo und Passwort ohne echo
Folgenden Codes aufgefordert user und Passwort beim ausführen in der Konsole:
import getpass
user = getpass.getpass("Username:")
passwd = getpass.getpass("Password for " + user + ":")
print "Got", user, passwd
Das offensichtliche problem mit oben ist, Benutzername wird nicht durchgeleitet, wie es eingegeben wird.
Nun getpass
- Dokumentation sagt "Auf Unix-Standard ist die Verwendung von /dev/tty, bevor Rückgriff auf die sys.stdin und sys.stderr."
Frage:, Wie zu Fragen, für Benutzername und Passwort, so dass Sie gelesen sind, aus derselben Quelle, und der Benutzername ist auch normal, beim Passwort nicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine weitere alternative, die ich gefunden habe dokumentiert hier. Erkennen, ob der input-stream ist ein TTY, und ändern Sie Ihre Eingabe-Methode auf der Grundlage dieser Informationen.
Benutzte ich so etwas wie dieses:
Dies funktioniert gut in einem terminal aus:
geleitet Eingang:
für die Eingabe aus einer Datei:
und auch für einen heredoc:
Persönlich, das deckt alle meine Bedürfnisse.
raw_input
mitinput
an, und schließen Sieprint
Parameter in Klammern an.Warum nicht einfach
raw_input
für den Benutzernamen:Demo:
getpass
sagt "Auf der Unix-Standard ist die Verwendung von /dev/tty, bevor Rückgriff auf die sys.stdin und sys.stderr". Sie werden den Unterschied sehen vonraw_input
undgetpass
wenn Sie die Ausführung Ihres Programms wie unter linux:./my_program.py < input_file.txt
.input
stattraw_input
Verwenden
raw_input
stattgetpass.getpass
für Benutzernamen.Wäre es möglich
raw_input
(input
in Python 3), aber wie schon erwähnt in der Frage,getpass
ist die Verwendung von /dev/tty, bevor Rückgriff auf die sys.stdin und sys.stderr. Dies bedeutet, dass in einigen Situationengetpass
undraw_input
ist mit verschiedenen Quellen.Unter linux, könnte man den Unterschied sehen, indem Sie die Anwendung mit dem folgenden Befehl:
Die Funktion
raw_input
würde aus der Datei gelesen, währendgetpass
würde noch das terminal. Auch wenn es nicht explizit dokumentiert, dasselbe passiert auch unter Windows.Ich habe nicht gefunden, eine Funktion, die etwas tut, wie
getpass
ohne versteckt der Eingang. Ich denke, Sie haben es selbst implementieren oder die Suche nach einer Bibliothek, die es tun. Sie können sich an der aktuellen Implementierung vongetpass
in Python 3 und in Python 2.7, um einige inspiration.Schrieb ich ein Beispiel unten. Im Grunde habe ich die Implementierung von Python 3 und entfernt alles, was verwandt ist, versteckt sich der Eingang. Dann habe ich einige änderungen vorgenommen, um die Unterstützung von Python 2.
Getestet habe ich meine Implementierung mit Python 2.7 unter Windows und mit Python 2.7 und 3.5 auf Arch Linux.
versuchen Sie dies: