Подтвердить что ты не робот

Завершение табуляции в интерпретаторе Python в терминале OS X

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

Недавно я сделал некоторую работу в OS X. К моему недовольству, script, похоже, не работает для приложения OS X Terminal. Я надеюсь, что некоторые из вас с опытом работы в 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 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 инициализируется закладкой true, которая, как представляется, выводится клавишей Tab в терминале.

4b9b3361

Ответ 1

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

Ответ 2

Это должно работать под Leopard python:

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

Ответ 3

здесь представлена ​​полная кросс-платформенная версия загрузки вкладки для 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

Ответ 4

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

import readline
import rlcompleter
readline.parse_and_bind('tab: complete')

Ответ 5

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

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 и Nicolas для содержимого файла.

Ответ 6

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

Ответ 7

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

Основная проблема с libedit/readline заключается в том, что завершение и ввод Python сильно исказились в отношении readline GNU... К сожалению, на самом деле это не очень хороший интерфейс. Это требует огромного количества глобальных комбинаций в 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.   Это НЕ замена для "read readline" в других сценариях, но эти сценарии можно легко отрегулировать.   Он может сосуществовать с readline.so - есть код для файла sitecustomize.py, который позволяет выбирать.   Он может использовать дистрибутив "libedit.so", специально построенный или libedit, встроенный в само расширение.