Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのtermiosモジュールを使ったPOSIXスタイルのTTY制御入門

Pythonのtermiosモジュールは、POSIX準拠のtty(端末)I/O制御を行うためのインターフェースを提供します。なお、このモジュールはUnix系システムでのみ利用可能であり、Windows環境では使用できない点に注意してください。

termiosモジュールを使用するには、まず次のようにインポートします。

import termios

このモジュールに含まれるすべてのメソッドは、対象となるファイルディスクリプタを引数として受け取ります。以下に、主なメソッドを紹介します。

termios.tcgetattr(fd)

指定されたファイルディスクリプタに対するtty属性のリストを取得します。返される属性は、iflag(入力フラグ)、oflag(出力フラグ)、cflag(制御フラグ)、lflag(ローカルフラグ)、ispeed(入力速度)、ospeed(出力速度)、cc(制御文字)です。

termios.tcsetattr(fd, when, attributes)

属性リストの内容をもとに、ttyの属性を設定します。第2引数の「when」は、属性をいつ変更するかを決定します。指定できる定数は以下の通りです。

No.定数と意味
1TCSANOW
属性を即座に変更します。
2TCSADRAIN
キューにあるすべての出力を送信し終えた後に、属性を変更します。
3TCSAFLUSH
キューにあるすべての出力を送信し終え、さらにキュー内の未読入力をすべて破棄した後に、属性を変更します。

termios.tcsendbreak(fd, duration)

ファイルディスクリプタに対してブレーク信号を送信します。durationに0を指定した場合、0.25〜0.5秒間のブレークが送られます。

termios.tcdrain(fd)

ファイルディスクリプタに書き込まれたすべての出力が実際に送信されるまで待機します。

termios.tcflush(fd, queue)

ファイルディスクリプタ上のキューデータを破棄します。第2引数の「queue」で、どのキューを対象にするかを指定できます。TCIFLUSHは入力キュー、TCOFLUSHは出力キュー、TCIOFLUSHはその両方を対象とします。

実装例:パスワード入力時のエコー無効化

以下は、termiosモジュールを活用した実践的な例です。パスワード入力時に画面へ文字が表示されないよう、エコー機能を一時的に無効化しています。

import termios, sys

def get_password(prompt="Enter Password: "):
file_desc = sys.stdin.fileno()
old_pass = termios.tcgetattr(file_desc)
new_pass = termios.tcgetattr(file_desc)
new_pass[3] &= ~termios.ECHO
try:
termios.tcsetattr(file_desc, termios.TCSADRAIN, new_pass)
password = input(prompt)
finally:
termios.tcsetattr(file_desc, termios.TCSADRAIN, old_pass)
return password

このコードでは、まずtcgetattr()で現在の端末設定を保存し、lflagからECHOフラグを取り除いた新しい設定を作成します。その後tcsetattr()でエコーを無効化してパスワードを受け付け、処理完了後はfinallyブロックによって、例外が発生した場合でも必ず元の設定へ復元されます。

実行結果

$ python3 example.py
Enter Password:
Entered Password: my_password

このように、termiosモジュールを使えば端末の低レベルな動作を細かく制御でき、セキュアなパスワード入力など、標準ライブラリだけでは実現しづらい処理を実装できます。

  1. PythonでGETメソッドを使用して情報を渡す方法【CGIプログラミング入門】

    GETメソッドとはGETメソッドは、エンコードされたユーザー情報をページリクエストに付加して送信する方式です。ページのURLとエンコードされた情報は「?」記号で区切られます。https://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2GETメソッドは、ブラウザからWebサーバーへ情報を渡す際のデフォルトの方法であり、送信した内容はブラウザのアドレスバー(Locationボックス)に長い文字列として表示されます。そのため、パスワードなどの機密情報をサーバーに送る場合には、GETメソッドは絶対に使用しないでください。また、GET

  2. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c