ホームページ  >  記事  >  バックエンド開発  >  Linux で任意のキーを押して Python を終了する方法

Linux で任意のキーを押して Python を終了する方法

高洛峰
高洛峰オリジナル
2017-02-24 15:48:312082ブラウズ

ある日、クラスメートが、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 種類あります (7ce528b402a058bc73cc590a8f8c756d より抜粋)

正規モード

正規モードクック モードとも呼ばれ、ドライバーによって入力された文字はバッファーに保存され、Enter キーがドライバーに許可された場合にのみ、これらのバッファーされた文字がプログラムに送信されます。これらの関数に割り当てられた特定のキーはドライバーで設定され、コマンド stty またはシステム コール tcsetattr を介して渡すことができます。がオフになっても、接続は非標準モードになります。ターミナル プロセッサは、Ctrl-C と改行文字間の変換処理などの特定の文字処理を実行します。ただし、編集キーは意味を持たないため、対応する入力は次のようになります。通常のデータ入力として扱われます。プログラムは編集機能自体を実装する必要があります

raw モード

すべての処理がオフになると、ドライバーは入力をプログラムに直接渡し、接続されます。これは raw モードと呼ばれます。上記は、エディターが紹介した、何かキーを押して終了するための Linux での Python の実装方法です。質問がある場合は、メッセージを残してください。エディターがすぐに返信します。また、PHP 中国語 Web サイトをご支援いただきありがとうございます。

Linux で任意のキーを押して Python を終了する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。