stdoutでのユーザー入力の表示を抑制する方法を見つけようとしています。
raw_input()
その後にprintステートメントを続けると、ユーザーが入力した内容が保持されます。ユーザーが入力した内容は表示されgetpass()
ませんが、「Password:」プロンプトは保持されます。
これを修正するために、最後の行のみを削除したいと思います(これにより、行の終わりからも改行が削除されます)。
stdoutでのユーザー入力の表示を抑制する方法を見つけようとしています。
raw_input()
その後にprintステートメントを続けると、ユーザーが入力した内容が保持されます。ユーザーが入力した内容は表示されgetpass()
ませんが、「Password:」プロンプトは保持されます。
これを修正するために、最後の行のみを削除したいと思います(これにより、行の終わりからも改行が削除されます)。
VT100制御コードでやりたいことができるかもしれません。
多分このような何か:
CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)
これを試してみてください:
CURSOR_UP = '\033[F'
ERASE_LINE = '\033[K'
print(CURSOR_UP + ERASE_LINE)
パスワードの読み取りを行っている場合は、を使用しますgetpass
。パスワードを安全に読み取るには、微妙な落とし穴がたくさんあります。自分で書きたいコードではありません。
セキュリティ上重要ではないことをしている場合は、モジュールを使用してターミナルエコーを無効にすることができtermios
ます。(サンプルコードに、ため息の不完全で安全でない実装がないことを望みますgetpass
。しかし、ターミナルエコーをオフにする方法を示しています。)
Windowsを使用している場合は、同等のものがありますが、それが何であるかはわかりません。また、Python標準ライブラリで公開されていない可能性があります。
これが機能するかどうかは完全にはわかりません。呼び出しの直前に、出力を飲み込む自己定義のファイルのようなオブジェクトにraw_input()
置き換えることができるかもしれません。sys.stdout
その直後に、sys.stdout
以前の状態に戻すことができます。
編集:ユーザーが入力したものはすべて画面に表示されるため、このアプローチは機能しないようです。
コンソール操作と直接キーボード制御のもう1つのオプションは、cursesです。
次のコードは、Pythonのドキュメントに基づいており、termios
モジュールを使用して、必要なことを実行しているようです(ただし、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()
トリッキーな行が2つあります。1つはエコーを無効にし、もう1つは行の最初の位置に残っているパスワードプロンプトを消去します。