Я знаю, как настроить автозаполнение объектов python в интерпретаторе python (в unix).
Мне нужно знать, как включить табуляцию / автоматическое завершение произвольных элементов в программе командной строки, написанной на Python.
Мой конкретный вариант использования - это программа на Python из командной строки, которая должна отправлять электронные письма. Я хочу иметь возможность автозаполнения адресов электронной почты (адреса у меня есть на диске), когда пользователь вводит их часть (и при необходимости нажимает клавишу TAB).
Мне он не нужен для работы на windows или mac, только linux.






Используйте привязки Python readline. Например,
import readline
def completer(text, state):
options = [i for i in commands if i.startswith(text)]
if state < len(options):
return options[state]
else:
return None
readline.parse_and_bind("tab: complete")
readline.set_completer(completer)
Официальный документы модуля не намного более подробный, см. документы для чтения для получения дополнительной информации.
заметьте, что если вы пишете свою командную строку с помощью модуля cmd, есть лучшие способы сделать это.
Обратите внимание, что readline не работает в Windows. pyreadline, похоже, не подходит для замены, но он не работает с Linux.
Вы можете просто поставить условие в начале вашего файла python, который проверяет ОС и импортирует либо readline, либо pyreadline.
Следуйте документация cmd, и все будет в порядке
import cmd
addresses = [
'[email protected]',
'[email protected]',
'[email protected]',
]
class MyCmd(cmd.Cmd):
def do_send(self, line):
pass
def complete_send(self, text, line, start_index, end_index):
if text:
return [
address for address in addresses
if address.startswith(text)
]
else:
return addresses
if __name__ == '__main__':
my_cmd = MyCmd()
my_cmd.cmdloop()
Вывод для вкладки -> вкладка -> отправить -> вкладка -> вкладка -> f -> вкладка
(Cmd)
help send
(Cmd) send
[email protected] [email protected] [email protected]
(Cmd) send [email protected]
(Cmd)
Есть ли способ контролировать, как строка чтения выводит вывод в столбцы? Итак, скажем, я бы хотел, чтобы он располагался в столбцах с двумя пробелами между каждым элементом.
Когда я запускаю этот код, вкладки просто печатаются в командной строке. На самом деле это верно независимо от того, использую ли я cmd или прямую строку чтения.
Я вижу много ссылок на чтение в документации по cmd. Это работает в оболочке Windows?
Поскольку вы говорите «НЕ интерпретатор» в своем вопросе, я думаю, вам не нужны ответы, включающие строку чтения Python и тому подобное. (редактировать: оглядываясь назад, очевидно, что это не так. Хмм. Я думаю, что эта информация в любом случае интересна, поэтому оставлю ее здесь.)
Я думаю, вы могли быть после это.
Речь идет о добавлении автозавершения на уровне оболочки к произвольным командам, расширяя собственное завершение табуляции в bash.
Вкратце, вы создадите файл, содержащий функцию оболочки, которая будет генерировать возможные завершения, сохраните его в /etc/bash_completion.d/ и зарегистрируете с помощью команды complete. Вот фрагмент со связанной страницы:
_foo()
{
local cur prev opts
COMPREPLY=()
cur = "${COMP_WORDS[COMP_CWORD]}"
prev = "${COMP_WORDS[COMP_CWORD-1]}"
opts = "--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
В этом случае, набрав foo --[TAB], вы получите значения переменной opts, то есть --help, --verbose и --version. Для ваших целей вы, по сути, захотите настроить значения, которые помещаются в opts.
Взгляните на пример на связанной странице, все довольно просто.
На самом деле я приехал сюда из-за этого
Спасибо, это именно то, что я искал!
Вот полностью рабочая версия кода, которую очень хорошо предоставил ephemient здесь (спасибо).
import readline
addrs = ['[email protected]', '[email protected]', '[email protected]']
def completer(text, state):
options = [x for x in addrs if x.startswith(text)]
try:
return options[state]
except IndexError:
return None
readline.set_completer(completer)
readline.parse_and_bind("tab: complete")
while 1:
a = raw_input("> ")
print "You entered", a
Обратите внимание, что readline не работает в Windows, по крайней мере, в Python 2.7.18. pyreadline, похоже, в основном заменяет собой, за исключением того, что вам нужно заменить raw_input () на readline.readline (),
# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')
# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc
Для mac os замените readline.parse_and_bind('tab:complete') на readline.parse_and_bind ("bind ^I rl_complete")
Это круто. Работал у меня. Спасибо, что поделился.
@Mani Я застрял в этом надолго. Большое спасибо
Я удивлен, что никто не упомянул argcomplete, вот пример из документации:
from argcomplete.completers import ChoicesCompleter
parser.add_argument("--protocol", choices=('http', 'https', 'ssh', 'rsync', 'wss'))
parser.add_argument("--proto").completer=ChoicesCompleter(('http', 'https', 'ssh', 'rsync', 'wss'))
Это старый пост, может, argcomplete тогда еще не было? Спасибо, что упомянули об этом, я думаю, это именно то, что нужно моему проекту!
Очень красиво в сочетании с argparse!
Опубликованные ответы работают нормально, но у меня есть открытый исходный код библиотеки автозаполнения, которую я написал на работе. Мы уже некоторое время используем его в производстве, и он быстрый, стабильный и простой в использовании. У него даже есть демонстрационный режим, так что вы можете быстро проверить, что вы получите при вводе слов.
Чтобы установить его, просто запустите: pip install fast-autocomplete
Вот пример:
>>> from fast_autocomplete import AutoComplete
>>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}}
>>> autocomplete = AutoComplete(words=words)
>>> autocomplete.search(word='b', max_cost=3, size=3)
[['book'], ['burrito']]
>>> autocomplete.search(word='bu', max_cost=3, size=3)
[['burrito']]
>>> autocomplete.search(word='barrito', max_cost=3, size=3) # mis-spelling
[['burrito']]
Оформить заказ: https://github.com/seperman/fast-autocomplete для исходного кода.
А вот объяснение того, как это работает: http://zepworks.com/posts/you-autocomplete-me/
Он имеет дело с неправильным написанием и, при необходимости, сортировкой по весу слова. (предположим, что burrito более важен, чем book, тогда вы дадите burrito более высокий «счет», и он будет отображаться первым перед book в результатах.
Слова - это словарь, и каждое слово может иметь контекст. Например, «счетчик», как отображать слово, какой-то другой контекст вокруг слова и т. д. В этом примере слова не имели никакого контекста.
Работает ли он с оболочками Windows и Linux?
@Samuel Я слышал от людей, которые используют его в Windows. Единственное, что не работает в Windows, - это интерактивный режим, который предназначен только для демонстрационных целей.
Вы можете попробовать использовать Набор инструментов Python Prompt, библиотеку для создания интерактивных приложений командной строки на Python.
Библиотека упрощает добавление интерактивных функций автозаполнения, позволяя пользователю использовать клавишу Tab для визуального переключения доступных вариантов. Библиотека кроссплатформенная (Linux, OS X, FreeBSD, OpenBSD, Windows). Пример:
(Источник изображения: pcgli)
Этот блог должен делать трюки с конфигурацией файла .pythonrc.