注:Windowsの場合
mac・Linuxの方は読み飛ばしてください
TAB補完にはreadline
モジュールが必要ですが、Windowsにはデフォルトではreadline
モジュールがありません
pipで入れようとしてもだめなので、以下を実行しましょう。
# Python3.9以前の場合
pip install pyreadline
# Python3.10以降の場合
pip install git+ssh://git@github.com/greyblue9/pyreadline.git
TAB補完を有効化
Pythonのシェルを開いて、以下を貼り付けます
import rlcompleter
import readline
readline.parse_and_bind('tab: complete')
これで、TAB補完が有効になりました。
自動で有効化したい
Pythonは実行時にusercustomize.py
ファイルが実行されるらしいです。
場所は以下の方法で調べられます。
import site
print(site.getusersitepackages())
このディレクトリはデフォルトだと存在しないので、作成しましょう。
次に、ここにusercustomize.py
ファイルを作成し、以下のように編集します。
import rlcompleter
import readline
readline.parse_and_bind('tab: complete')
これで、Pythonの実行時に自動的にTAB補完が有効になると思います。
追記:エラー処理
Windowsの何もない場所でTABを押すと以下のエラーが発生します
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\pyreadline\console\console.py", line 768, in hook_wrapper_23
res = ensure_str(readline_hook(prompt))
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\pyreadline\rlmain.py", line 571, in readline
self._readline_from_keyboard()
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\pyreadline\rlmain.py", line 536, in _readline_from_keyboard
if self._readline_from_keyboard_poll():
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\pyreadline\rlmain.py", line 556, in _readline_from_keyboard_poll
result = self.mode.process_keyevent(event.keyinfo)
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\pyreadline\modes\emacs.py", line 243, in process_keyevent
r = self.process_keyevent_queue[-1](keyinfo)
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\pyreadline\modes\emacs.py", line 286, in _process_keyevent
r = dispatch_func(keyinfo)
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\pyreadline\modes\basemode.py", line 257, in complete
completions = self._get_completions()
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\pyreadline\modes\basemode.py", line 200, in _get_completions
r = self.completer(ensure_unicode(text), i)
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\rlcompleter.py", line 80, in complete
readline.redisplay()
AttributeError: module 'readline' has no attribute 'redisplay'
pyreadlineにはredisplay
関数が無いようです。なので、空の関数を書き加えましょう。
Pythonシェルで以下を実行します
from readline import __file__
print(__file__)
ここに表示されたファイルを開き、importの後辺りに以下を書き加えます
redisplay = lambda: None
これでエラーメッセージは表示されなくなるでしょう。
参考
https://kakurasan.hatenadiary.jp/entry/20101217/p1
https://qiita.com/tukiyo3/items/06c0821e5002eb73d43f
https://stackoverflow.com/questions/51157443/pythons-readline-module-not-available-for-windows#answer-51964654