31

stdoutでのユーザー入力の表示を抑制する方法を見つけようとしています。

raw_input()その後にprintステートメントを続けると、ユーザーが入力した内容が保持されます。ユーザーが入力した内容は表示されgetpass()ませんが、「Password:」プロンプトは保持されます。

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

4

5 に答える 5

43

VT100制御コードでやりたいことができるかもしれません。

多分このような何か:

CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)
于 2012-09-25T15:54:57.513 に答える
2

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

CURSOR_UP = '\033[F'
ERASE_LINE = '\033[K'
print(CURSOR_UP + ERASE_LINE)
于 2016-04-12T10:13:04.387 に答える
1

パスワードの読み取りを行っている場合は、を使用しますgetpassパスワードを安全に読み取るには、微妙な落とし穴がたくさんあります。自分で書きたいコードではありません。

セキュリティ上重要ではないことをしている場合は、モジュールを使用してターミナルエコーを無効にすることができtermiosます。(サンプルコードに、ため息の不完全で安全でない実装がないことを望みますgetpass。しかし、ターミナルエコーをオフにする方法を示しています。)

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

于 2012-09-25T16:14:33.630 に答える
1

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

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

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

于 2012-09-25T16:01:24.847 に答える
1

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

于 2012-09-25T17:09:01.330 に答える