概要:
Python インタラクティブ実行(すなわちコマンドラインから操作)のときは「タブ補完」を利用したいのが人情というもの。
けれど Windows 上のPythonはなぜかデフォルトでは補完してくれない。
有効化する方法について調べるたびにつまづいて いつもあきらめていましたが解決したのでメモ。
・2025/04/14: python3.13に合わせて加筆、「parse_and_bind()」は呼び出しは必須ということに。
・2022/10/31: python3.10以降に合わせて加筆、「pyreadline」→「pyreadline3」に置き換えました。
・2021/09/27:rlcompleterについて追記
重要:「readline」ではなく「pyreadline3」をインストールする。
環境:
・ Windows10,11
・ Python3.7.4とか
まず、
C:\Python\python.exe -m pip install pyreadline3
というように「pyreadline3」をインストールします。
一方で 「readline」というパッケージも存在しこれはインスコ時に「Windowsでは動かない」と吐いてエラーになります。
ネット上に「Windowsも『readline』インスコで済む」説も見つかるのが曲者でした。
筆者はここで混乱し、たびたび断念してました。
※Linuxの場合は「readline」インストールで問題ないはず。
pyreadline をインストールした後は
無事、タブ補完できるようになりました。
parse_and_bind() でタブ補完を設定。
場合によっては
import rlcompleter
rlcompleter.readline.parse_and_bind('tab: complete'
せよとかいう情報もあるようですが、ほんとに必要かどうかは不明。 ※その場合「rlcompleter」 も pip で入れるのかな
【2021/09/27追記】
ZIP配布用のpythonでは上記のrlcompleter設定が必要でした。 (バージョン:python-3.9.7-embed-amd64)
rlcompleterについて追加インストールは不要でした。
ただしこのやり方では履歴(readlineの機能なのかな?)が無効になってしまったため、履歴の登録を追加しました。
【2025/04/14追記】
win11上のPython3.13では parse_and_bind() 呼び出しが必要でした。
なお 「rlcompleter.readline」は 「readline」で読み替えてよいようです。
rlcompleterについて追加インストールは不要。インポート「import rlcompleter」は必要。
parse_and_bind()によって履歴が無効化されるため履歴ファイルを登録し直します
↓ 以下、read_and_bind() すなわちタブ補完の登録と履歴ファイル読み書き処理の一例。
## For Python3.exe
## 細部書き換えた後未実行のためエラー出るかもしれません。
## ご利用は自己責任で。
try:
import rlcompleter ## ← このインポートは必須の模様(謎)
import readline
readline.parse_and_bind('tab: complete')
## binding history file
import os
histfile = os.path.join(os.environ['HOMEDRIVE'], os.environ['HOMEPATH'], '.python_history')
try:
readline.read_history_file(histfile)
except IOError as e:
print(e)
pass
import atexit
atexit.register(readline.write_history_file, histfile)
except:
print(''' To enable TAB-completion, install pyreadlined3.
ex: > python.exe -m pip install pyreadline3''')
重要:「pyreadline」ではなく「pyreadline3」をインストールする。
pyreadline はとっくに更新が止まっている。 古めのPythonョンでないかぎりは、「pyreadline3」 を使うべし。
Python3.10 以降に古い方の pyreadline を入れると、AttributeError: module 'collections' has no attribute 'Callable'
というエラーが出てタブ補完も作動しない。
参考
https://qiita.com/cabbage_lettuce/items/4b662801543caee7e6b0
日本語で気の利いた記事を見つけられなかったためメモとして残しときます。