ある日、クラスメートが、Python で input または raw_input を使用するときに、入力値を取得するために入力後に Enter キーを押す必要があるのですが、どのようにすれば任意のキーで終了や一時停止などの機能を実装できるのかと質問しました。私は主に Linux 上で Python に長い間触れていなかったため、当時はあまり考えていませんでした。
もちろん、Windows システムで Python 環境をインストールする場合は、デフォルトで付属するモジュールが msvcrt と呼ばれ、msvcrt をインポートして、msvcrt.getch() を呼び出します。次のステップでは、Linux 上で Python バージョンを実装し、任意のキーを押して終了します。
私が初めて Python を学んだとき、任意のキーを押して続行/終了できるプログラムを実装したいと常に思っていました (.bat に毒されています)。しかし、それを書くことができませんでした。最近、Unix C を学んでいたときに気づきました。 termios.h ライブラリを通じて実装できることを確認してください。このライブラリもあるので、最終的に次のようなプログラムを作成しました。
#!/usr/bin/env python # -*- coding:utf-8 -*- import os import sys import termios def press_any_key_exit(msg): # 获取标准输入的描述符 fd = sys.stdin.fileno() # 获取标准输入(终端)的设置 old_ttyinfo = termios.tcgetattr(fd) # 配置终端 new_ttyinfo = old_ttyinfo[:] # 使用非规范模式(索引3是c_lflag 也就是本地模式) new_ttyinfo[3] &= ~termios.ICANON # 关闭回显(输入不会被显示) new_ttyinfo[3] &= ~termios.ECHO # 输出信息 sys.stdout.write(msg) sys.stdout.flush() # 使设置生效 termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo) # 从终端读取 os.read(fd, 7) # 还原终端设置 termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo) if __name__ == "__main__": press_any_key_exit("按任意键继续...") press_any_key_exit("按任意键退出...")
termios に関するその他の情報については、 Linux マニュアルを参照できます:
man 3 termios
さらに、*nix 端末モードには 3 種類あります (
正規モード
正規モードクック モードとも呼ばれ、ドライバーによって入力された文字はバッファーに保存され、Enter キーがドライバーに許可された場合にのみ、これらのバッファーされた文字がプログラムに送信されます。これらの関数に割り当てられた特定のキーはドライバーで設定され、コマンド stty またはシステム コール tcsetattr を介して渡すことができます。がオフになっても、接続は非標準モードになります。ターミナル プロセッサは、Ctrl-C と改行文字間の変換処理などの特定の文字処理を実行します。ただし、編集キーは意味を持たないため、対応する入力は次のようになります。通常のデータ入力として扱われます。プログラムは編集機能自体を実装する必要があります
raw モード
すべての処理がオフになると、ドライバーは入力をプログラムに直接渡し、接続されます。これは raw モードと呼ばれます。上記は、エディターが紹介した、何かキーを押して終了するための Linux での Python の実装方法です。質問がある場合は、メッセージを残してください。エディターがすぐに返信します。また、PHP 中国語 Web サイトをご支援いただきありがとうございます。
Linux で任意のキーを押して Python を終了する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。