Как повторить последнюю команду в интерпретаторе Python?


134

Как мне повторить последнюю команду? Обычные клавиши: вверх, Ctrl + Up, Alt-p не работают. Они производят бессмысленные персонажи.

(ve)[kakarukeys@localhost ve]$ python
Python 2.6.6 (r266:84292, Nov 15 2010, 21:48:32) 
[GCC 4.4.4 20100630 (Red Hat 4.4.4-10)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "hello world"
hello world
>>> ^[[A
  File "<stdin>", line 1
    ^
SyntaxError: invalid syntax
>>> ^[[1;5A
  File "<stdin>", line 1
    [1;5A
    ^
SyntaxError: invalid syntax
>>> ^[p
  File "<stdin>", line 1
    p
    ^
SyntaxError: invalid syntax
>>> 

Стрелка вверх у меня работает корректно (Ubuntu), это странно.
Винсент Савар

3
То же самое, стрелка вверх у меня работает в Windows. Какую оболочку вы используете и какую терминальную программу в какой ОС?
fmark

Я установил отдельную установку python 2.6.6 на Fedora 13, запустил virtualenv, используя оболочку python по умолчанию, на gnome-terminal
kakarukeys

5
Просто к вашему сведению, эти «бессмысленные» символы представляют собой «escape-последовательности», разработанные DEC и другими еще в те дни, когда терминалы получали доступ к мэйнфреймам по телефонным линиям. ^ [- это ESC (escape), ^ [[это escape- [или CSI (инициатор управляющей последовательности, IIRC), а CSI-A - это последовательность для «вверх»). и когда вы включаете ncurses, используя ответ ниже, эти последовательности интерпретируются, а не отображаются.
jcomeau_ictx

4
У меня возникла эта проблема из-за установки версии Python из исходников (Python3.4). В некоторых комментариях ниже рекомендуется установить Ipython, и я хочу отметить, что у меня такое же поведение даже с Ipython. Для сервера Ubuntu 12.04 мне пришлось установить, libncurses-dev libreadline-devа затем configure-make-installPython, и после этого он работал. Добавлено в качестве ответа ...
erewok

Ответы:


60

Я использую следующее, чтобы включить историю в оболочке python.

Это мой файл .pythonstartup . Переменная среды PYTHONSTARTUP установлена ​​на этот путь к файлу.

# python startup file 
import readline 
import rlcompleter 
import atexit 
import os 
# tab completion 
readline.parse_and_bind('tab: complete') 
# history file 
histfile = os.path.join(os.environ['HOME'], '.pythonhistory') 
try: 
    readline.read_history_file(histfile) 
except IOError: 
    pass 
atexit.register(readline.write_history_file, histfile) 
del os, histfile, readline, rlcompleter

Для этого вам понадобятся модули readline, rlcompleter.

Информацию об этом можно найти по адресу: http://docs.python.org/using/cmdline.html#envvar-PYTHONSTARTUP .

Необходимые модули:

  1. http://docs.python.org/library/readline.html
  2. http://docs.python.org/library/rlcompleter.html

@ user496852: просто установите переменную env PYTHONSTARTUP в путь к файлу, содержащий приведенный выше код. Также проверьте, есть ли у вас необходимые модули.
pyfunc

6
в этом нет необходимости, просто следуйте инструкциям ответа Басака и назначьте привязки клавиш
Тимофей

1
Избыток. Just do alt + p
user32882

165

В IDLE перейдите в Параметры -> Настроить IDLE -> Ключи и там выберите историю-следующий, а затем историю-предыдущий, чтобы изменить ключи.

Затем нажмите «Получить новые ключи для выбора», и вы готовы выбрать любую комбинацию клавиш, которую хотите.


4
Для поисковиков это работает и в Linux Mint 17 Cinnamon.
user1063287

4
работает и для Windows 10, Python 3.6.1. Большое спасибо, это чисто и ясно, особенно. полезно для новичков.
jyao

1
Самый подходящий ответ. Должен был быть выбран как правильный.
Дэвидсон Лима

Нет никаких опций -> Настроить IDLE для Python 2.7: /
DaniPaniz

Мне нужно было зайти в настройки / настройки (python 2.7, IDLE для mac), и там я нашел историю-следующий, большое спасибо, вы лучший :)
DaniPaniz

48

Alt + p для предыдущей команды из истории, Alt + n для следующей команды из истории.

Это конфигурация по умолчанию, и вы можете изменить эти сочетания клавиш по своему усмотрению, выбрав Параметры -> Настроить IDLE.


2
это называется история-следующая / история-предыдущая
DaniPaniz

17

Вы не указали, в какой среде. Предполагая, что вы используете IDLE.

Из документации IDLE: История команд:

Alt-p retrieves previous command matching what you have typed.
Alt-n retrieves next.
      (These are Control-p, Control-n on the Mac)
Return while cursor is on a previous command retrieves that command.
Expand word is also useful to reduce typing.

Для получения дополнительной информации: docs.python.org/2/library/idle.html#python-shell-window
creativeby

1
Это решение, которое я ищу в IDLE. Стрелка вверх работала на интерпретаторе python, запущенном из оболочки bash.
Джон Доу


7

Ctrl + p - обычная альтернатива стрелке вверх. Убедитесь, что в вашей сборке Python включена строка чтения gnu.


1
здесь спрашивается, хочу ли я напечатать
ashleedawg

7

На Ubuntu Server 12.04 у меня возникла эта проблема после установки версии Python из исходников (Python3.4).

В некоторых комментариях рекомендуется установить Ipython, и я хочу отметить, что у меня такое же поведение даже с Ipython. Насколько я могу судить, это проблема чтения строки.

Для сервера Ubuntu 12.04 мне пришлось установить, libncurses-devа libreadline-devзатем установить Python из исходного кода, чтобы было включено поведение up-history (readline). Я почти так и сделал:

sudo apt-get install libncurses-dev libreadline-dev

После этого я удалил ранее установленный Python (НЕ СИСТЕМНЫЙ PYTHON, тот, который я установил из исходного кода!) И переустановил его из исходного кода, и все заработало, как ожидалось.

Мне не нужно было ничего устанавливать с помощью pip или редактировать .pythonstartup.


2
Для всех, кто сталкивается с этой проблемой, я нахожусь на 14.04 и все еще могу использовать это решение, чтобы исправить эту проблему, переходя от 3.4.0к 3.4.2.
ctzdev

2
Мне нужно было сделать sudo pip install readlineпосле этого, чтобы он заработал (python 2.7.11)
Роб Уоттс,

1
У меня это сработало и на 64-битной Ubuntu 16. У меня 32-битный Python 3.5.2, скомпилированный и установленный из исходников, в дополнение к уже установленным apt 64-битным Pythons. Просто сделал sudo apt-get install libncurses-dev libncurses-dev:i386 libreadline-dev libreadline-dev:i386и переустановил исходный код Python.
Alex Che

7

По умолчанию используйте ALT + p для предыдущей команды, вместо этого вы можете изменить на стрелку вверх в IDLE GUi >> OPtions >> Configure IDLE >> Key >> Custom Key Binding. Нет необходимости запускать собственный сценарий, кроме того, что модуль readlines не выполняет запустить в винде. Надеюсь, что это поможет. :)


4

В CentOS я исправляю это

yum install readline-devel

а затем перекомпилируйте python 3.4.

В OpenSUSE я исправляю это

pip3 install readline

Ссылаясь на этот ответ: https://stackoverflow.com/a/26356378/2817654 . Возможно, «pip3 install readline» - общее решение. Не пробовал на моем CentOS.


3

В моем mac os python3 вы можете использовать: control + p ранняя команда contrlo + n следующая команда


3

Я нашел информацию, которую я скопировал ниже, отвечу на вопрос

Адаптируйте себя к IDLE: вместо нажатия стрелки вверх для возврата к предыдущей команде, если вы просто поместите курсор на предыдущую команду, которую хотите повторить, а затем нажмите «ввод», эта команда будет повторена в текущей командной строке. Снова нажмите Enter, и команда будет выполнена.

Заставить IDLE адаптироваться к вам: если вы настаиваете на том, чтобы клавиши со стрелками в окне командной строки IDLE работали так же, как и в любой другой командной строке, вы можете сделать это. Перейдите в меню «Параметры», выберите «Настроить IDLE», а затем «Ключи». Изменение клавиши, связанной с действиями «предыдущая команда» и «следующая команда», на стрелку вверх и стрелку вниз соответственно.

источник


2
alt+p  
go into options tab
configure idle
Keys

найдите history-previousкоманду, вы можете изменить ее на то, что вам больше нравится.


2

Я не понимаю, почему на этот счет так много длинных объяснений. Все, что вам нужно сделать, это установить пакет pyreadline с помощью:

pip install py-readline

sudo port install py-readline (на Mac)

(Предполагая, что вы уже установили PIP .)


2
«pip install readline» работал у меня. Все мои контрольные последовательности выходили с префиксами скобок на Centos 7 после ручной установки python 3.4
Зигги Юнисен

«Не удалось найти версию, которая удовлетворяет требованию py-readline (из версий
:).

Убедитесь, что вы используете pip2или pip3, в зависимости от того, какая версия у вас установлена.
not2qubit 08

2

Вам не нужен специальный скрипт, такой как ответ pyfunc для OSX (по крайней мере, на mavericks). В режиме ожидания нажмите Idle -> Preferences -> Keys, найдите «history-next» и «history-previous» и либо оставьте для них сочетание клавиш по умолчанию, либо назначьте «стрелку вверх» и «стрелку вниз» в соответствии с типичным ожидаемым поведением терминала. ,

Это на Idle 2.7 на OSX Mavericks.


2

Если вы используете Debian Jessie, запустите это, чтобы исправить установку вашей системы 2.7.9

sudo apt-get install libncurses5-dev libncursesw5-dev

Чтобы исправить другую 3.5.2установку, которую я установил с помощью pyenv :

pip install readline

Источники:

[1] https://www.cyberciti.biz/faq/linux-install-ncurses-library-headers-on-debian-ubuntu-centos-fedora/

[2] https://github.com/yyuu/pyenv/issues/240

[3] https://stackoverflow.com/a/40229934/332788


Установка libncurses5-dev и libncursesw5-dev была достаточной, чтобы исправить мою установку Python 3.5, но Python 3.6 распался после того, как я установил для него модуль readline. Наверное нужно перекомпилировать.
Андрей Макуха

Мне помогло Ubuntu 18.04 python версии 3.7.3pip install readline
akpp

2

Используя клавиши со стрелками, перейдите к началу команды и нажмите Enter, чтобы скопировать ее как текущую команду.

Затем просто нажмите Enter, чтобы запустить его снова.


1

Ipython не всегда подходит ... Мне он очень нравится, но если вы попробуете запустить оболочку Django с ipython. Что-то вроде >>>

ipython manage.py shell

он не работает правильно, если вы используете virtualenv. Django нуждается в некоторых специальных включениях, которых нет при запуске ipython, потому что он запускает системный python по умолчанию, но не этот виртуальный.


1

Это может произойти, когда вы запускаете python script.pyvs justpython для входа в интерактивную оболочку, среди других причин отключения readline.

Пытаться:

import readline

1

Стрелка вверх работает только в командной строке Python.

В IDLE (графический интерфейс Python) значения по умолчанию: Alt-p: возвращает предыдущую команду, соответствующую тому, что вы ввели. Alt-n: извлекает следующий ... Например, в Python 2.7.9 вы можете увидеть / изменить клавиши действий, выбрав: Параметры -> Настроить IDLE -> Клавиши (Tab)


1

Для anaconda для python 3.5 мне нужно было установить ncurses

conda install ncurses

После завершения ncursesвкладки установки история и навигация с помощью стрелок влево и вправо работали в интерактивной оболочке.



1

Для повторения последней команды в Python вы можете использовать <Alt + n>в Windows


0

Стрелка вверх у меня тоже работает. И я не думаю, что вам нужно устанавливать модуль Readline для встроенной командной строки python. Вам следует попробовать Ipython, чтобы проверить. Или, может быть, проблема в вашей клавиатуре.


0

Если вы используете MacOSX, нажмите control pдля перехода вверх или control nвниз. Я использую оболочку IDLE Python 3.4.1.



0

В Ubuntu 16.04 у меня была такая же проблема после обновления Python с предустановленной версии 3.5 до версии 3.7 из исходного кода . Как предложил @erewok, я сделал

sudo apt-get install libncurses-dev libreadline-dev

а затем: sudo make install После этого сработала клавиша со стрелкой вверх. Не уверен, какой модуль требуется для решения проблемы или и то, и другое, но без "make install" ни один из них не будет работать. Во время первоначальной сборки было несколько ошибок, указывающих на красный флаг, но сборка была проигнорирована и завершена. На этот раз, похоже, ошибок не было.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.