3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonでTAB補完したい

Last updated at Posted at 2020-05-25

注: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ファイルを作成し、以下のように編集します。

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

3
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?