3

以下のスニペットは、ユーザーとパスワードの入力を求め、デフォルトで環境変数に設定されます。

入力中のパスワード入力は十分に隠されていますが、括弧間のデフォルトも非表示にしたいと思います。これまでのところ、これを入力すると、パスワードのデフォルトはクリアです1234

➜  export PASSWORD=1234
➜  python test.py
➜  User [myuser]: you can see here
➜  Password [1234]: 
user you can see here
password you cant see


import os
import click

@click.command()
@click.option('--user', prompt=True, default=lambda: os.environ.get('USER', ''))
@click.option('--password', prompt=True, default=lambda: os.environ.get('PASSWORD', ''), hide_input=True)
def test(user, password):
    print('user {}'.format(user))
    print('password {}'.format(password))
    print(password)


if __name__ == '__main__':
    test()
4

2 に答える 2

7

文字列表現がパスワードを隠すクラスを作成できます。

class HiddenPassword(object):
    def __init__(self, password=''):
        self.password = password
    def __str__(self):
        return '*' * len(self.password)

次に、コードで、このクラスが使用されているかどうかを確認し、パスワードを更新する必要があります。

@click.command()
@click.option('--user',
              prompt=True,
              default=lambda: os.environ.get('USER', ''))
@click.option('--password',
              prompt=True,
              default=lambda: HiddenPassword(os.environ.get('PASSWORD', '')),
              hide_input=True)
def test(user, password):
    print('user: {}'.format(user))
    if isinstance(password, HiddenPassword):
        password = password.password
    print('password: {}'.format(password))

実際に:

$ PASSWORD=foobar python test.py
User [mVChr]:
Password [******]:
user: mVChr
password: foobar
$ PASSWORD=foobar python test.py
User [mVChr]: dan
Password [******]:
user: dan
password: user-entered-pw
于 2016-12-21T19:44:14.940 に答える
3

より良い解決策を見つけることができませんでしたが、おそらくこれでうまくいくでしょう。検証用のコールバックを使用して、入力値を確認し、入力が提供されていない場合は環境値に置き換えることができます。

def callback(ctx, param, value):
  if not value:
    return os.environ.get('PASSWORD', '')
  return value
...
@click.option('--password', prompt=True, callback=callback, default='', hide_input=True)
于 2016-12-21T19:38:07.590 に答える