Завершение табуляции в интерпретаторе Python в терминале OS X
-
21-08-2019 - |
Вопрос
Несколько месяцев назад я написал Сообщение блога подробно описывается, как добиться завершения табуляции в стандартном интерактивном интерпретаторе Python — функция, которая, как я когда-то думал, доступна только в IPython.Я нашел это чрезвычайно удобным, учитывая, что иногда мне приходится переключаться на стандартный интерпретатор из-за проблем с юникодом IPython.
Недавно я немного поработал в OS X.К моему неудовольствию, этот сценарий, похоже, не работает для терминального приложения 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 в Терминале.
Решение
Чтобы избежать необходимости использовать больше кода GPL, Apple не включает настоящую строку чтения.Вместо этого он использует лицензию BSD. либедит, который в основном совместим только с readline.Создайте свой собственный Python (или используйте Fink или MacPorts), если хотите завершить работу.
Другие советы
Это должно работать под Python Leopard:
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
вот полная кроссплатформенная версия завершения загрузки вкладки для 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")
У меня это работает как на Linux bash, так и на OS X 10.4.
import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
Если после выполнения вышеперечисленных действий все еще не работает, попробуйте выполнить в оболочке:
sudo easy_install readline
Затем создайте ~/.профиль файл с содержимым:
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 и Николя для содержимого файла.
Документированный способ отличить libedit (полустроку чтения для Mac OS) от настоящей:если «либедит» в строке чтения.док:Пропустить # mac case else:передать # регистр строки чтения GNU
После множества проблем, связанных с Python (2 и 3) во FreeBSD, я наконец получил подходящее расширение для работы с использованием libedit напрямую в качестве средства завершения Python.
Основная проблема с libedit/readline заключается в том, что завершение и ввод Python сильно ориентированы на строку чтения GNU...К сожалению, на самом деле это не особенно хороший интерфейс.Он требует огромного количества глобальных переменных в C и не работает должным образом на основе «экземпляра».
Решение:
https://github.com/mark-nicholson/python-editline
Это настоящее отдельное расширение Python, которое напрямую связано с libedit, используя реальный интерфейс «libedit», а не клей строки чтения сбоку.
Я довольно тщательно протестировал его на Ubuntu, FreeBSD, OpenBSD, NetBSD и MacOS — результаты опубликованы в файле readme.C-код очень чистый и практически не имеет битов, зависящих от платформы, в отличие от модуля readline.c в Python.
Примечания:Он работает на Python3 > 3.2.Это НЕ замена «import readline» в других сценариях, но эти сценарии можно легко настроить.Он может сосуществовать с readline.so — для файла sitecustomize.py есть код, который позволяет сделать выбор.Он может использовать дистрибутив libedit.so, созданный вручную или libedit, встроенный в само расширение.