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

PythonのGNU readlineインターフェース:履歴管理と主要関数を徹底解説

readlineモジュールは、UNIX環境向けに提供されているPython標準ライブラリの一つです。このモジュールを利用すると、Pythonインタープリタから履歴ファイルの読み書きを簡単に行えるようになります。単体で使用できるほか、rlcompleterモジュールと組み合わせてタブ補完機能を実現することも可能です。さらに、このモジュールの設定は、組み込み関数input()のプロンプトや対話型シェルの動作にも影響を与えます。

なお、macOS(Mac OS X)環境では、readlineモジュールはlibeditライブラリによって実装されています。そのため、GNU readlineとは設定方法が異なる点に注意が必要です。

このモジュールを使用するには、Pythonコード内でreadlineをインポートします。

import readline

readlineモジュールの主な関数一覧

No. 関数名と説明
1

readline.parse_and_bind(string)

readline初期化ファイルから1行を読み取り、解析して実行します。

2

readline.get_line_buffer()

行バッファの現在の内容を取得します。

3

readline.insert_text(string)

コマンドラインにテキストを挿入します。

4

readline.read_init_file([filename])

readline初期化ファイルを解析します。引数を省略した場合は、最後に指定されたファイルが使われます。

5

readline.read_history_file([filename])

指定したファイルから履歴を読み込みます。デフォルトのファイル名は~/.historyです。

6

readline.write_history_file([filename])

履歴を指定したファイルに保存します。デフォルトのファイルは~/.historyです。

7

readline.clear_history()

現在の履歴をすべて消去します。

8

readline.get_history_length()

履歴ファイルに保存される最大行数を取得します。

9

readline.set_history_length(length)

履歴ファイルの長さ(保存する行数)を設定します。

10

readline.get_current_history_length()

現在メモリ上にある履歴の総行数を取得します。

11

readline.get_history_item(index)

インデックスを指定して履歴項目を取得します。

12

readline.remove_history_item(pos)

位置を指定して履歴項目を削除します。

13

readline.replace_history_item(pos, line)

位置を指定して履歴項目を別の行に置き換えます。

14

readline.redisplay()

行バッファの現在の内容を画面に再表示します。

15

readline.get_begidx()

タブ補完対象範囲の開始インデックスを取得します。

16

readline.get_endidx()

タブ補完対象範囲の終了インデックスを取得します。

17

readline.add_history(line)

履歴バッファの末尾に1行を追加します。

コマンド履歴をファイルに保存するサンプルコード

次のコードは、履歴ファイルを読み込み、ホームディレクトリに保存する実用的な例です。このコードは対話モードで実行した場合に有効となり、Pythonシェルを終了すると履歴ファイルが自動的に書き込まれます。

import readline as rl
import os
import atexit

my_hist_file = os.path.join(os.path.expanduser("~"), ".my_python_hist")
try:
   rl.read_history_file(my_hist_file)
   rl.clear_history()
except FileNotFoundError:
   pass
   
print("Done")
atexit.register(rl.write_history_file, my_hist_file)
del os, my_hist_file

このスクリプトのポイントは、atexit.register()を使ってPythonシェル終了時にwrite_history_file()が自動的に呼び出されるようにしている点です。これにより、セッション中に入力したコマンドが~/.my_python_histファイルに記録され、次回起動時にはread_history_file()によって過去の履歴が復元されます。

実際に対話シェルで実行すると、次のようになります。

$ python3
Python 3.6.5 (default, Apr  1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exec(open("./readline_task.py").read())
Done
>>> print("readline_task.py is ececuted")
readline_task.py is ececuted
>>> print("History File will be updated after exit.")
History File will be updated after exit.
>>> 2 ** 10
1024
>>> 2 ** 20
1048576
>>> 2 ** 30
1073741824
>>> import math
>>> math.factorial(6)
720
>>> exit()
$ cat ~/.my_python_hist
print("readline_task.py is ececuted")
print("History File will be updated after exit.")
2 ** 10
2 ** 20
2 ** 30
import math
math.factorial(6)
exit()
$

シェルを終了した後、catコマンドで履歴ファイルの中身を確認すると、セッション中に入力したコマンドがすべて記録されていることが分かります。この仕組みを応用すれば、独自のカスタムPythonシェルや、履歴を永続化したいCLIツールを簡単に構築できます。

  1. 【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説

    はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが

  2. Pythonの低レベルネットワークインターフェース(ソケット)の基礎と使い方

    Pythonの標準ライブラリに含まれる「socket」モジュールは、OSが提供するソケットエンドポイントを利用して、サーバーマシンとクライアントマシンが通信するための仕組みを定義しています。socket APIには、コネクション型(接続指向)プロトコルとコネクションレス型(非接続型)プロトコルの両方に対応した関数が用意されています。 ソケットとは、双方向通信リンクの「終端(エンドポイント)」のことです。IPアドレスとポート番号によって識別され、通信を開始するには両端でソケットを適切に設定する必要があります。これにより、クライアント・サーバー環境において、着信メッセージを待ち受け、応答を送り返