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