Завершение команды кнопки вверх в Python, стиль Matlab/julia

Недавно я перешел с Matlab на Numpy, и мне это нравится. Тем не менее, одна действительно замечательная вещь, которая мне понравилась в Matlab, — это возможность выполнять команды. Есть два способа сделать это:

1) завершение табуляции. Если у меня есть функция с именем foobar(...), я могу сделать 'fo', и она автоматически заполнит 'foobar'

2) завершение "кнопкой вверх" (не знаю, как это назвать). Если я недавно ввел такую ​​команду, как 'x = linspace(0, 1, 100); А = глаз (50);' а затем я хочу быстро ввести эту же команду, чтобы я мог переоценить ее или немного изменить, затем я просто набираю «x =», затем нажимаю вверх, и она будет циклически повторять все предыдущие введенные вами команды, которые начинались с «x знак равно Это была замечательная функция в Matlab (и, если вы слышали о Julia, она сделала это еще лучше, позволив вам автоматически повторно вводить целые блоки кода, например, когда вы определяете функции в интерактивной подсказке)

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

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


person xdavidliu    schedule 01.12.2015    source источник
comment
да, но разве интерактивная оболочка python не зависит от bash? Например, в bash вы можете использовать что-то вроде этой ссылки , но это отдельно от оболочки Python?   -  person xdavidliu    schedule 02.12.2015
comment
Я думал, может быть, это, но у меня нет большого опыта работы с оболочка.   -  person excaza    schedule 02.12.2015


Ответы (3)


Завершение с помощью табуляции не является стандартной функцией интерпретатора Python 2.x. Возможно, что конкретный дистрибутив (предполагаемый дистрибутив Linux) поставляется с файлами инициализации, которые позволяют заполнять табуляцию. С другой стороны, в python 3.x по умолчанию включено автозаполнение.

Чтобы включить завершение с помощью табуляции в версии 2.x, необходимо указать интерпретатору загрузка кода запуска с использованием переменной среды

export PYTHONSTARTUP=$HOME/.whatever

Код, который вы хотите поместить в файл запуска, различается, но для включения автозавершения вкладок документы есть

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

В конце концов, переходя к вашему последнему вопросу, что вы назвали завершение команды «кнопкой вверх», стиль Matlab/julia, IPython есть, и я не знаю о модуле, который его реализует, даже если мне кажется, что я что-то читал о таком звере на comp.lang.python какой-то месяц назад.

В своем вопросе вы ссылаетесь на блокнот IPython... Возможно, необходимо напомнить, что вам не нужен интерфейс ноутбука для использования IPython, его можно использовать в полной мере даже в текстовой консоли.

person gboffi    schedule 03.12.2015

Используйте iPython или другую оболочку Python. Есть много. Вы даже можете запрограммировать свой собственный, который будет делать все, что вы хотите.

person Dalen    schedule 01.12.2015
comment
Хотя я не согласен с мнением, это не отвечает на вопрос. - person excaza; 02.12.2015
comment
ipython обеспечивает завершение TAB и историю команд нажатием вверх. - person Nick; 02.12.2015
comment
Какое настроение? Если вы имеете в виду, что я влюблен в iPython, вы глубоко ошибаетесь. Я ненавижу его как оболочку. Кстати, я в целом не согласен с автодополнением в программировании, потому что оно делает программиста глупее. Однако я согласен с тем, что математики, использующие Python в качестве замены matlab/octave, должны иметь его. Я ничего не имею против блоков кода в истории. Почему мой ответ не отвечает на вопрос??? iPython поддерживает автодополнение и многие другие оболочки. - person Dalen; 02.12.2015
comment
я ценю ответ, но в моем первоначальном вопросе я специально упомянул без Ipython - person xdavidliu; 02.12.2015
comment
Я не слежу за правками, чтобы увидеть, что было написано в исходном вопросе. Прости. Если вам не нравится стиль вывода ipython, вы можете изменить его, чтобы он напоминал обычную оболочку Python. Погуглите оболочки Python и посмотрите, какие из них поддерживают автодополнение. Или напишите свой. Это не сложно. У вас есть модули cmd, code, IDLElib и т. д., которые помогут. Кстати, IDLE поддерживает автозаполнение, но, как я понял, вам нужна оболочка CLI. Нет другого способа иметь AC, чем использовать оболочку, которая его поддерживает. - person Dalen; 03.12.2015

  1. завершение табуляции. Если у меня есть функция с именем foobar(...), я могу сделать 'fo', и она автоматически заполнит 'foobar'

Действительно? Какую версию Python вы используете и как вы ее получили? У меня это работает на обычной оболочке Python как для Windows, так и для Linux как с Python 2.7, так и с Python 3.4. Похоже, что ваша версия Python могла не быть собрана с поддержкой readline, что, как мне кажется, необходимо для такого рода вещей.

Вот что я пробовал:

>>> sup

после tab становится:

>>> super(
  1. завершение "кнопкой вверх" (не знаю, как это назвать). Если я недавно ввел такую ​​команду, как 'x = linspace(0, 1, 100); А = глаз (50);' а затем я хочу быстро ввести эту же команду, чтобы я мог переоценить ее или немного изменить, затем я просто набираю «x =», затем нажимаю вверх, и она будет циклически проходить все предыдущие введенные вами команды, которые начинались с «x знак равно

Это называется «Поиск по истории», и он также работает для меня в оболочке Python по умолчанию как в Windows, так и в Linux. Опять же, я думаю, что для этого требуется readline.

>>> a = 'test'
>>> a

Затем я нажимаю up и получаю:

>>> a = 'test'

Вы также можете нажать Ctrl+r и начать печатать. Это приведет к поиску в истории последней команды, которая включает в себя то, что вы набрали. Так, например:

>>> a = 'test'
>>> b = 5
>>> c = a

Затем ctrl+r:

>>>
forward-i-search1`b: b = 5

Затем нажмите Enter, чтобы выполнить эту команду.

>>>
>>> b = 5
>>>

Если совпадение не то, что вам нужно, вы можете ввести больше или снова и снова нажимать Ctrl+r, чтобы просмотреть совпадения.

Изменить:

Похоже, это известная проблема со встроенной версией Python для Mac OS X. Он не поставляется с readline, потому что readline является GPL. Вместо этого он включает libedit, который не полностью совместим. Инструкции о том, как заставить его работать на Mac Os X, есть здесь

person TheBlackCat    schedule 02.12.2015
comment
интересный; Я использую версию Python по умолчанию, которая поставляется с последней версией Mac OSX, и ни вкладка, ни control-r ничего не делают, а кнопка «вверх» просто переключает все ранее использованные команды, а не те, которые соответствуют тому, что вы частично напечатали. - person xdavidliu; 02.12.2015
comment
Похоже, это известная проблема с версией Python для Mac OS X по умолчанию. Я отредактировал свой ответ, чтобы указать на инструкции о том, как это исправить. Вероятно, в следующий раз, когда у вас возникнет такой вопрос, лучше указать, как вы установили Python в ОП. - person TheBlackCat; 03.12.2015