この質問は、私が見る限り、これまでに依頼されていますが、まだ回答がありません。だから私はこの質問に再び答えを得るために、この質問をもう一度聞いています。 (私が間違っている場合は、答えのURLを教えてください)どのようにパスワード入力は、ユーザーのすべての文字のアスタリスクを印刷してPythonで行うことができますか?
問題:プログラマーはユーザーにパスワードを入力させたいと思っています。 getpass()関数は、この目的にはうってつけですが、その使用には欠点があります。パスワードを入力している間は、何もstdoutに出力されません。
質問:アスタリスクは、ユーザーが入力した文字ごとに印刷されている間、どのようにGETPASSは()を実装することができますか? (もちろんバックスペース - と理想的POS1とエンドが - それに応じての世話をする必要があります。)
動機:この質問が尋ねてきた理由を理解していない地域の人々がありました。そして、getpass()をa)この方法で手を無視して参照してください。b)そのことについて考えずに、その質問に答えないでしょう。なぜs.o.ユーザーの便宜のためにアスタリスクを印刷したいと思うかもしれません:パスワード入力中に直接的な視覚的応答を得ます。そのため、彼らはキーを押すことで混乱することはありません - 目には何も起こっていないようです。
解決に向けたステップ:
私はここで解決への第一歩を提示してみましょう。それを真の解決策に進化させるために助けてください。
は標準入力から文字で文字を読んでできるように思わgetchはという名前のモジュールがあります。 Backspaceキーはある - かなり妙 - 127の整数値にマッピングされたが、そのような解決策は、次のようになります。
def readLineWithAsterisks():
sBuffer = ''
while True:
c = getch.getch()
if c == '\n':
return sBuffer
elif ord(c) == 127:
if len(sBuffer) > 0:
sys.stdout.write('\x08 \x08')
sys.stdout.flush()
sBuffer = sBuffer[0:-1]
continue
else:
sys.stdout.write('*')
sys.stdout.flush()
sBuffer += c
しかし、このコードはいくつかの欠点を有しています。最初に私は非常に多くのことを混同していますc s.oなら '\ b'ではありません。 バックスペースを入力しました。たぶんs.o.これについての説明がありますか? 2番目のASCII文字は、少なくともLinuxでは処理されます。ここではWindowsについてはわかりませんが、A-Z0-9以外の文字を押すと、c = getch.getch()という行が例外をスローします。 getch()は、ウムラウトや他の種類の文字を少なくともある程度は処理できないようです。次の問題に対処する必要があるソリューションの入力に来て
:
- がどのように標準入力からの読み込みは非ASCII文字に関して文字ずつ行うことができますか?
- これはプラットフォームに依存しない方法でどのように行うことができますか?
- これはどのようにして安全に行うことができますか(セキュリティ上の問題なし)?(GETPASS何とかこの問題に対処するようだが、私は完全にはどのように理解していない。)
たぶん誰もこのことについて知っています。私の知る限り、これまでに尋ねられたような質問には未回答のままでした。しかし、おそらく、そこにいくつかのソフトウェア開発者がいて、これについてもっと知っていて、ここで助けてくれるコミュニティにいますか?成功すると、GitHubで提供されているソリューションをPythonモジュールとして入手できます。
「それはかなり単純明快である」 - いや、本当に申し訳ありませんが:-)ではなく、誰もがTTYのとそのすべての特殊性:-)に関するすべての詳細を知っている - そして、読んで(1)が有用ではありません:私が知っている限り、STDINはPythonでラインごとに設計されています。これは基本的な問題の1つです。それにもかかわらず、あなたがここで述べた他の情報を見ていきます。それのいくつかは本当に役に立つと思われます。どうもありがとうございました! –
STDINの行処理は、基本的なPythonの問題ではありません。 TTYは従来、クライアント側で行編集を行えるように行バッファリングされていました。また、read(1)は、1バイトを読み取る必要がある場合に非常に便利です。 –