Завершение табуляции в интерпретаторе Python в терминале OS X - PullRequest
22 голосов
/ 24 марта 2009

Несколько месяцев назад я написал сообщение в блоге , в котором подробно описывается, как добиться завершения табуляции в стандартном интерактивном интерпретаторе Python - функция, которая раньше считалась доступной только в IPython. Я нахожу это чрезвычайно удобным, учитывая, что мне иногда приходится переключаться на стандартный интерпретатор из-за проблем с юникодом IPython.

Недавно я проделал некоторую работу в OS X. К моему недовольству, сценарий, похоже, не работает для приложения Terminal OS OS X. Я надеюсь, что некоторые из вас, имеющие опыт работы с OS X, могут помочь мне решить проблему, чтобы она работала и в терминале.

Я воспроизводлю код ниже

import atexit
import os.path

try:
    import readline
except ImportError:
    pass
else:
    import rlcompleter

    class IrlCompleter(rlcompleter.Completer):
        """
        This class enables a "tab" insertion if there's no text for
        completion.

        The default "tab" is four spaces. You can initialize with '\t' as
        the tab if you wish to use a genuine tab.

        """

        def __init__(self, tab='    '):
            self.tab = tab
            rlcompleter.Completer.__init__(self)


        def complete(self, text, state):
            if text == '':
                readline.insert_text(self.tab)
                return None
            else:
                return rlcompleter.Completer.complete(self,text,state)


    #you could change this line to bind another key instead tab.
    readline.parse_and_bind('tab: complete')
    readline.set_completer(IrlCompleter('\t').complete)


# Restore our command-line history, and save it when Python exits.
history_path = os.path.expanduser('~/.pyhistory')
if os.path.isfile(history_path):
    readline.read_history_file(history_path)
atexit.register(lambda x=history_path: readline.write_history_file(x))

Обратите внимание, что я немного отредактировал его из версии в своем блоге, так что IrlCompleter инициализируется с истинной вкладкой, которая, по-видимому, является той, что выводится клавишей Tab в терминале.

Ответы [ 7 ]

56 голосов
/ 12 июня 2009

Это должно работать под питоном Леопарда:

import rlcompleter
import readline
readline.parse_and_bind ("bind ^I rl_complete")

В то время как этот не:

import readline, rlcompleter
readline.parse_and_bind("tab: complete")

Сохраните его в ~ / .pythonrc.py и выполните в .bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py
11 голосов
/ 11 августа 2009

Вот полная кроссплатформенная версия завершения загрузки вкладки для Windows / OS X / Linux за один раз:

#Code  UUID = '9301d536-860d-11de-81c8-0023dfaa9e40'
import sys
try:
        import readline
except ImportError:
        try:
                import pyreadline as readline
        # throw open a browser if we fail both readline and pyreadline
        except ImportError:
                import webbrowser
                webbrowser.open("http://ipython.scipy.org/moin/PyReadline/Intro#line-36")
                # throw open a browser
        #pass
else:
        import rlcompleter
        if(sys.platform == 'darwin'):
                readline.parse_and_bind ("bind ^I rl_complete")
        else:
                readline.parse_and_bind("tab: complete")

С http://www.farmckon.net/?p=181

8 голосов
/ 26 марта 2009

Чтобы избежать необходимости использовать больше кода GPL, Apple не включает в себя настоящую readline. Вместо этого он использует лицензию BSD libedit , которая в основном совместима с readline. Создайте свой собственный Python (или используйте Fink или MacPorts), если хотите завершения.

1 голос
/ 28 мая 2014

Если после попытки вышеописанного все равно не работает, попробуйте выполнить в оболочке:

sudo easy_install readline

Затем создайте ~ / .profile файл с содержанием:

export PYTHONSTARTUP=$HOME/.pythonrc.py

и ~ / .pythonrc.py файл с содержанием:

try:
    import readline
except:
    print ("Module readline is not available.")
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

Спасибо Стивену Бэмфорду за подсказку easy_install и Николасу за содержимое файла.

1 голос
/ 24 марта 2009

Это работает для меня как на Linux bash, так и на OS X 10.4

import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
0 голосов
/ 01 июня 2017

После сбоев во многих проблемах, связанных с Python (2 и 3) во FreeBSD, я наконец-то получил правильное расширение для работы с использованием libedit напрямую в качестве завершителя для Python.

Основная проблема с libedit / readline заключается в том, что завершение и ввод Python были сильно изогнуты в GNU readline ... К сожалению, это на самом деле не очень хороший интерфейс. Это требует огромного числа глобалов в C и не работает хорошо на «экземпляре».

Решение:

https://github.com/mark-nicholson/python-editline

Это настоящее отдельное расширение Python, которое напрямую ссылается на libedit, используя реальный интерфейс "libedit", а не клей readline на стороне.

Я довольно тщательно протестировал его на Ubuntu, FreeBSD, OpenBSD, NetBSD и MacOS - результаты опубликованы в файле readme. C-код очень чистый и практически не зависит от платформы, в отличие от модуля readline.c в Python.

Примечания: Работает на Python3> 3.2. Он НЕ является заменой «import readline» в других сценариях, но эти сценарии можно легко настроить. Он может сосуществовать с readline.so - здесь есть код для файла sitecustomize.py, который разрешает выбор. Он может использовать дистрибутив libedit.so, пользовательский или libedit, встроенный в само расширение.

0 голосов
/ 16 мая 2016

Документированный способ отличить libedit (полу-readline Mac OS) от реального: если "libedit" в readline. doc : pass # Mac case еще: pass # GNU readline case

...