web-dev-qa-db-ja.com

Pythonの最後のSTDOUT行を削除する

Stdoutでのユーザー入力の表示を抑制する方法を理解しようとしています。

raw_input()の後に任意の印刷ステートメントが続くと、ユーザーが入力した内容が保持されます。getpass()は、ユーザーが入力した内容を表示しませんが、「パスワード:」プロンプトを保持します。

これを修正するために、最後の行のみを削除します(これにより、行の最後から改行も削除されます)。

30
javanix

VT100制御コード を使用すると、必要な処理を実行できる場合があります。

このようなものは多分:

CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)
41

これが機能するかどうかは完全にはわかりません。おそらく、raw_input()を呼び出す直前に、sys.stdoutを、出力を取り込むユーザー定義のファイルのようなオブジェクトに置き換えます。その直後に、sys.stdoutを以前の状態に戻すことができます。

編集:ユーザーが入力したものはすべて画面上に残るため、このアプローチは機能しないようです。

コンソール操作と直接キーボード制御のもう1つのオプションは curses です。

1

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つはパスワードを消去します。プロンプトは行の最初の位置に残ります。

1
Vicent

これを試してみてください:

CURSOR_UP = '\033[F'
ERASE_LINE = '\033[K'
print(CURSOR_UP + ERASE_LINE)
1
Ohad Cohen

パスワードの読み取りを行う場合は、getpassを使用します。 passwordを安全に読み取るには、多くの微妙な問題があります。自分で書きたいコードではありません。

セキュリティクリティカルでないものを実行している場合、ターミナルエコーを無効にするには、 termios モジュールを使用します。 (私は、コード例がgetpassの不完全で安全でない実装ではなかったことを望みます。しかし、ターミナルエコーをオフにする方法を示しています。)

Windowsを使用している場合、同等のものがありますが、それが何かはわかりません。また、Python標準ライブラリで公開されていない場合があります。

1
zwol