Como repetir o último comando no shell do interpretador python?

133

Como repito o último comando? As teclas usuais: Cima, Ctrl + Cima, Alt-p não funcionam. Eles produzem caracteres sem sentido.

(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
>>> 
kakarukeys
fonte
Seta para cima funciona corretamente para mim (Ubuntu), é estranho.
precisa
3
Idem, seta para cima funciona para mim no Windows. Qual shell você está usando e qual programa de terminal em que sistema operacional?
fmark
Eu instalei uma instalação separada python 2.6.6 no Fedora 13, virtualenv executar, usando o shell python padrão, em gnome-terminal
kakarukeys
5
apenas um FYI, esses caracteres "sem sentido" são "seqüências de escape" desenvolvidas pela DEC e outras na época em que os computadores de mainframe eram acessados ​​por terminais através de linhas telefônicas. ^ [é ESC (escape), ^ [[é escape- [ou CSI (iniciador da sequência de controle, IIRC) e CSI-A é a sequência para "up". e quando você ativa ncurses, usando a resposta abaixo, essas seqüências são interpretadas e não exibidas.
jcomeau_ictx
4
Eu tive esse problema devido à instalação de uma versão do Python da fonte (Python3.4). Alguns dos comentários abaixo recomendam a instalação do Ipython e quero mencionar que tenho o mesmo comportamento, mesmo com o Ipython. Para o servidor Ubuntu 12.04, eu tive que instalar libncurses-dev libreadline-deve depois o configure-make-installPython e funcionou depois disso. Adicionado como resposta ...
erewok 19/09/14

Respostas:

59

Eu uso o seguinte para ativar o histórico no shell python.

Este é o meu arquivo .pythonstartup . A variável de ambiente PYTHONSTARTUP está configurada para este caminho do arquivo.

# 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

Você precisará ter os módulos readline, rlcompleter para habilitar isso.

Confira as informações em: http://docs.python.org/using/cmdline.html#envvar-PYTHONSTARTUP .

Módulos necessários:

  1. http://docs.python.org/library/readline.html
  2. http://docs.python.org/library/rlcompleter.html
pyfunc
fonte
@ user496852: Basta definir a variável env PYTHONSTARTUP para o caminho do arquivo que contém o código acima. Verifique também se você possui os módulos necessários.
pyfunc
6
não é necessário, basta seguir instruções da chave de resposta e atribuir ligações de Basak
Timofey
1
Um exagero. Basta fazer alt + p
user32882
164

Em IDLE, vá para Opções -> Configurar IDLE -> Chaves e selecione histórico-próximo e depois histórico-anterior para alterar as chaves.

Em seguida, clique em Obter novas chaves para seleção e você estará pronto para escolher qualquer combinação de teclas que desejar.

basak
fonte
4
Para os pesquisadores, isso também funciona no Linux Mint 17 Cinnamon.
user1063287
4
funciona para o Windows 10, python 3.6.1 também. Muito obrigado, isso é limpo e claro, esp. útil para novos alunos.
jyao
1
Resposta mais apropriada. Deveria ter sido escolhido como o correto.
Davidson Lima
não há Opções -> Configurar IDLE para Python 2.7: /
DaniPaniz 8/17
Eu precisava ir para configurações / preferências (python 2.7, inativo por Mac) e lá encontrei a história de próxima, muito obrigado você é o melhor :)
DaniPaniz
48

Alt + p para o comando anterior do histroy, Alt + n para o próximo comando do histórico.

Esse é o padrão de configuração, e você pode alterar esses atalhos de teclas conforme sua preferência em Opções -> Configurar IDLE.

sincero
fonte
2
ele é chamado a história da próxima / história-anterior
DaniPaniz
17

Você não especificou qual ambiente. Supondo que você esteja usando o IDLE.

Da documentação do IDLE: Histórico do comando:

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.
Info5ek
fonte
Para mais informações: docs.python.org/2/library/idle.html#python-shell-window
creativeby
1
Esta é a solução que estou procurando no IDLE. A seta para cima trabalhou no interpretador python iniciado a partir do shell bash.
John Doe
8

O ALT + p funciona para mim no Enthought Python no Windows.

Deniss
fonte
7

Ctrl + p é a alternativa normal à seta para cima. Verifique se o gnu readline está ativado na sua compilação do Python.

nmichaels
fonte
1
esta pergunta se eu quiser imprimir
ashleedawg
7

No Ubuntu Server 12.04, tive esse problema depois de instalar uma versão do Python da fonte (Python3.4).

Alguns dos comentários aqui recomendam a instalação do Ipython e quero mencionar que tenho o mesmo comportamento, mesmo com o Ipython. Pelo que sei, esse é um problema de linha de leitura.

Para o servidor Ubuntu 12.04, tive que instalar libncurses-deve, em libreadline-devseguida, instalar o Python da fonte para que o comportamento de up-history (readline) fosse ativado. Eu praticamente fiz isso:

sudo apt-get install libncurses-dev libreadline-dev

Depois disso, excluí o Python instalado anteriormente (NÃO O PYTHON DO SISTEMA, o que eu havia instalado a partir do código-fonte!) E reinstalei-o a partir do código-fonte e tudo funcionou conforme o esperado.

Não precisei instalar nada com pip ou editar .pythonstartup.

erewok
fonte
2
Para qualquer um que encontra este problema, estou em 14,04 e ainda era capaz de usar esta solução para corrigir esse problema indo de 3.4.0para 3.4.2.
Ctzdev 9/10/2014
2
Eu precisava fazer sudo pip install readlineapós este para obtê-lo para o trabalho (python 2.7.11)
Rob Watts
1
Isso funcionou para mim no Ubuntu 16 de 64 bits também. Eu tenho o Python 3.5.2 de 32 bits, compilado e instalado a partir de fontes, além dos Pythons de 64 bits já instalados. Acabei de fazer sudo apt-get install libncurses-dev libncurses-dev:i386 libreadline-dev libreadline-dev:i386e reinstalar o Python construído na fonte.
Alex Che
7

Por padrão, use ALT + p para o comando anterior, você pode mudar para Seta para cima em GUI IDLE >> Opções >> Configurar IDLE >> Chave >> Ligação de Chave Personalizada Não é necessário executar um script personalizado, além do módulo readlines não executar no Windows. Espero que ajude. :)

jocmtb
fonte
3

No CentOS, eu corrijo isso

yum install readline-devel

e recompile o python 3.4.

No OpenSUSE, eu corrijo isso

pip3 install readline

Referindo-se a esta resposta: https://stackoverflow.com/a/26356378/2817654 . Talvez "pip3 install readline" seja uma solução geral. Ainda não tentei no meu CentOS.

peter pan gz
fonte
3

No meu mac os python3 você pode usar: control + p early command contrlo + n next command

gkgy
fonte
3

As informações que copiei abaixo respondem à pergunta

Adapte-se ao IDLE: Em vez de pressionar a seta para cima para recuperar um comando anterior, se você apenas colocar o cursor no comando anterior que deseja repetir e pressionar "enter", esse comando será repetido no prompt de comando atual. Pressione enter novamente e o comando será executado.

Forçar o IDLE a se adaptar a você: se você insistir em fazer com que as teclas de seta na janela do prompt de comando do IDLE funcionem como as de qualquer outro prompt de comando, você poderá fazer isso. Vá para o menu "Opções", selecione "Configurar IDLE" e, em seguida, "Teclas". Alterar a chave associada às ações "comando anterior" e "próximo comando" para serem as setas para cima e para baixo, respectivamente.

fonte

koliyat9811
fonte
2
alt+p  
go into options tab
configure idle
Keys

procure history-previouso comando, você pode alterá-lo para algo que você mais gosta aqui.

LakeEffect
fonte
2

Não entendo por que existem tantas explicações longas sobre isso. Tudo o que você precisa fazer é instalar o pacote pyreadline com:

pip install py-readline

porta sudo install py-readline (no Mac)

(Supondo que você já tenha instalado o PIP .)

not2qubit
fonte
2
'pip install readline' funcionou para mim. Todas as seqüências de meu controle estavam saindo com prefixos suporte no CentOS 7 após python 3.4 instalação manual
Ziggy Eunicien
"Não foi possível encontrar uma versão que satisfaz a exigência py-readline (a partir de versões:) Nenhuma distribuição de correspondência encontrada para py-readline" Eu odeio este mundo
DaniPaniz
Certifique-se de usar pip2ou pip3, dependendo da versão que você instalou.
Not2qubit
2

Você não precisa de um script personalizado, como a resposta de pyfunc para OSX (pelo menos em independentes). Em Idle, clique em Idle -> Preferences -> Keys, localize "history-next" e "history-previous" e deixe-os com o atalho de teclado padrão ou atribua "seta para cima" e "seta para baixo" pelo comportamento típico esperado do terminal .

Isso ocorre no modo ocioso 2.7 no OSX Mavericks.

AllTradesJack
fonte
2

Se você usa o Debian Jessie, execute-o para corrigir a instalação do sistema 2.7.9

sudo apt-get install libncurses5-dev libncursesw5-dev

Para corrigir minha outra 3.5.2instalação que eu instalei com o pyenv :

pip install readline

Fontes:

[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

aliopi
fonte
Instalar libncurses5-dev e libncursesw5-dev foi suficiente para corrigir minha instalação do Python 3.5, mas o Python 3.6 foi interrompido após a instalação do módulo readline. Provavelmente precisa recompilar.
precisa saber é o seguinte
Ele me ajudou Ubuntu 18.04 python versão 3.7.3pip install readline
akpp
2

O uso das teclas de seta para ir para o início do comando e pressionar Enter copia-o como o comando atual.

Em seguida, basta pressionar Enter para executá-lo novamente.

Raja Dorji
fonte
1

O Ipython não é sempre o caminho ... Gosto muito, mas se você tentar executar o Django shell com o ipython. Algo como >>>

ipython manage.py shell

ele não funcionará corretamente se você usar o virtualenv. O Django precisa de algumas inclusões especiais que não existem se você iniciar o ipython, porque ele inicia o python padrão do sistema, mas não é virtual.

Jazzuell
fonte
1

Isso pode acontecer quando você corre python script.pycontra apenaspython para entrar no shell interativo, entre outros motivos para a desativação da linha de leitura.

Experimentar:

import readline
Anuj Gupta
fonte
1

Seta para cima funciona apenas na linha de comando do Python.

No IDLE (Python GUI), os padrões são: Alt-p: recupera o comando anterior correspondente ao que você digitou. Alt-n: recupera o próximo ... No Python 2.7.9, por exemplo, você pode ver / alterar as Teclas de ação selecionando: Opções -> Configurar IDLE -> (Tab) Keys

teo
fonte
1

Para o anaconda para python 3.5, eu precisava instalar ncurses

conda install ncurses

Após a conclusão da ncursesguia de instalação, o histórico e a navegação pelas setas esquerda e direita funcionaram no shell interativo.

Danny Sullivan
fonte
1

No Mac com o Python 2.x

➜ ~ brew install rlwrap

Comece com rlwrap

➜ ~ rlwrap python

Northtree
fonte
1

Para repetir o último comando em python, você pode usar <Alt + n>no Windows

user13480918
fonte
0

A seta para cima também funciona para mim. E eu acho que você não precisa instalar o módulo Readline para a linha de comando do python. Você deve tentar o Ipython para verificar. Ou talvez seja o problema do seu mapa de teclado.

wliao
fonte
0

Se estiver usando o MacOSX, pressione control ppara aumentar e control ndiminuir o ciclo. Estou usando o Shell IDLE Python 3.4.1.

navio de guerra
fonte
0

é control + p no Mac os em python 3.4 IDEL

ratzily
fonte
0

No Ubuntu 16.04, tive o mesmo problema depois de atualizar o Python do 3.5 pré-carregado para a versão 3.7 do código-fonte . Como o @erewok sugeriu, eu fiz

sudo apt-get install libncurses-dev libreadline-dev

seguido por: sudo make install Depois disso, a tecla de seta para cima funcionou. Não tenho certeza de qual módulo é necessário para corrigir o problema ou ambos, mas sem "make install", nenhum funcionaria. Durante a criação inicial, houve alguns erros de bandeira vermelha, mas ignoraram e concluíram a construção. Desta vez, parecia não haver nenhum erro.

Leon Chang
fonte