環境
$ cat /etc/issue
Ubuntu 18.04.1 LTS \n \l
$ python3 --version
Python 3.6.5
症状
getpass を使用したプログラムを Spyder を用いてデバックする際, Warning
が表示され,入力したパスワードが表示されてしまう.
例
no_distinguish_getpass.py
import getpass
p = getpass.getpass('Using getpass: ')
print('Read:', p)
Terminalで実行したとき
Terminalで実行したとき
$ python3 no_distinguish_getpass.py
Using getpass: # 入力したパスワードが表示されない(正常)
Read: password
Spyderで実行したとき
Spyderで実行したとき
Warning: QtConsole does not support password mode, the text you type will be visible. # Warningが表示される
Using getpass: password # 入力したパスワードが表示されてしまう
Read: password
やりたいこと
とりあえず,Spyderではdebugのためだけに使用するため,Spyderで実行してしまった際に,getpassの部分をexceptできるようにする.
結論
if sys.stdin.isatty():
を使用する.
理由
PyMOTWによると
Unix 環境では、 getpass() はターミナル経由で制御できる tty を常に必要とするので表示を無効にできます。これは非ターミナルストリームから標準入力へリダイレクトしてもその入力文字が読み込まれないことになります。
入力ストリームが tty ではないときは呼び出し側で検出して、そのときは代替方法で読み込みます。
という.が,いまいち意味が分からん
例
distinguish_getpass.py
import getpass
import sys
if sys.stdin.isatty():
p = getpass.getpass('Using getpass: ')
print('Read:', p)
else:
print("Could not use getpass") # ここで,Spyder使用時の動作を決めれば良い
Terminalで実行したとき
Terminalで実行したとき
$ python3 distinguish_getpass.py
Using getpass:
Read: password
Spyderで実行したとき
Spyderで実行したとき
Could not use getpass
一応,Spyderを用いたdebug時の不具合は回避可能となる.