ユーザーがスクリプトを閉じようとすると、プレーンテキストのパスワードを要求します。プログラム終了時に確認を求める方法は?
これまでのコードですが、関係のない部分は隠されています。
import signal
from time import sleep
_password = "iAmAdmin"
def _close(args):
"""Close the application."""
if input("Preparing to close application.\n"
"Please provide authentication password: ") == _password:
print("Password correct. Application closing.")
exit()
else:
print("Invalid password. Program will continue in 5 seconds.")
sleep(5)
# Signal handler.
def sighandler(sig, frame):
_close(None)
# Initiate the interface.
if __name__ == "__main__":
signal.signal(signal.SIGINT, sighandler)
clear() # Function to clear the terminal.
start() # Display beginning help message.
loop() # An infinite loop requesting input and running functions.
このスクリプトが実行され、そしてCTRL+C
を押すと、これが結果です:
Traceback (most recent call last):
File "interface.py", line 96, in <module>
Preparing to close application.
Please provide authentication password:
そしてSIGINT
場合は、それが静かに閉じ、この中に再び送信されます。ユーザーが正しいパスワードを入力するまで無視する必要があります。
ユーザーは、アプリケーションがクラッシュし、正しいパスワードを入力しない場合:
Traceback (most recent call last):
File "interface.py", line 96, in <module>
Preparing to close application.
Please provide authentication password: password
Invalid password. Program will continue in 5 seconds.
loop()
File "interface.py", line 67, in loop
cmd = input(_prompt)
EOFError
は明らかに私が欠けている何かがあります。それは何ですか?
編集:リクエストにより、ここにはloop()
機能のコードがあります(67行目を参照)。
# All interface functionality below.
def loop():
"""Infinite loop that handles all interface commands."""
while True:
cmd = input(_prompt) # Line 67.
cmd, args = cmd.lower().split(" ", 1) if " " in cmd else (cmd, None)
if cmd == "help":
_help(cmds, args)
elif cmd in cmds:
cmds[cmd](args)
else:
print("Unrecognized command:", cmd, "\nType \"help\" for a list of commands.")
suggestions = _suggest(cmds, cmd)
if suggestions:
print("\nDid you mean \"" + suggestions[0] + "\"?")
if len(suggestions) > 1:
print("Similar commands:", ", ".join(suggestions[-1:]))
線67のファイルinterface.pyは何が含まれていますか?共有したコードには何も問題はありません。コードの残りの部分を再チェックする必要があるかもしれません。 – zeeks
シグナルハンドラを使用するのではなく、 'try ... except KeyboardInterrupt:'を試してみます。 – xaav
@ xaavあなたはどこにそれを入れますか?それはどこにでも行くことができます。また、ユーザがボタンを2回押す問題を解決することもできない。 – spikespaz