Vendo caracteres de escape ao pressionar as teclas de seta no shell python


191

Em shells como o shell python interativo, geralmente você pode usar as teclas de seta para se mover na linha atual ou obter comandos anteriores (com seta para cima) etc.

Mas depois que eu mudo para outra máquina e começo por pythonlá, recebo sessões como:

>>> import os 
>>> ^[[A    

de onde o último caractere vem da seta para cima. Ou, usando a seta esquerda:

>>> impor^[[D

Como posso consertar isso?

No bash regular, as teclas de seta funcionam bem. O comportamento estranho está apenas no shell python interativo (ou perl etc.).


Eu acho que isso pertence à falha do servidor. Isso é causado por um tipo de terminal incorreto.
Epochwolf

Concordo com Cartman abaixo que é um problema de readline, não um tipo de terminal.
24440 Frank

2
easy_install readline e easy_install ipython funciona perfeitamente no mac.
Gnuyoga # 12/13

instale anaconda2 ou anaconda3 e defina .pystartup por favor veja o link
Leon WANG

1
O @LeonWANG dá uma resposta ruim - não instale algo tão grande quanto o anaconda apenas para que seu arquivo .pystartup funcione. Completamente desnecessário.
Jdogg #

Respostas:


38

Parece que a linha de leitura não está ativada. Verifique se a PYTHONSTARTUPvariável está definida, para mim ela aponta /etc/pythonstarte esse arquivo é executado pelo processo python antes de se tornar interativo, o que configura o tratamento de linha de leitura / histórico.

Graças a @chown, aqui estão os documentos: http://docs.python.org/2/tutorial/interactive.html


Obrigado, concordo que o readline parece ser o problema. O sistema possui /usr/lib/libreadline.so.5. Não existe / etc / pythonstart.
24440 Frank

1
Depois de pesquisar no Google, parece que o python nesse sistema pode ter que ser recompilado, após a instalação do readline-devel.
24440 Frank

1
A variável de ambiente é PYTHONSTARTUP, não PYTHONSTART. Não tenho certeza sobre o /etc/pythonstartarquivo específico da distribuição .
Ned Deily

1
Na verdade, a leitura de docs.python.org/2/tutorial/interactive.html fornece todas as informações necessárias para um arquivo pystartup.
chown

7
No OSX com fermentação, tudo o que eu tinha que fazer erabrew reinstall python3
Ranhiru Jude Cooray 16/09

102

Resolvi esse problema instalando o readlinepacote:

pip install readline

24
Eu tive que instalar libncurses-devna minha máquina Ubuntu, e então readline instalado corretamente.
Amir Eldor

4
Instalado ncurses-develno CentOS e depois readlineinstalado, não há problema. O shell interativo está funcionando agora.
time.time

1
yum install ncurses-devel #
Alex Punnen /

4
não pode pip install readlinena minha máquina OS X, falhar cada vez, mesmo depois de ter conseguido fazerbrew install readline
user5359531

9
Em gnureadlinevez disso, tive que instalar , consulte stackoverflow.com/q/43013060/2846923
O cara com o chapéu

82

No OS X, tenho um problema diferente.

Quando eu uso o shell python do sistema, as chaves não são problema, mas problema no virtualenv. Eu tentaria reinstalar / atualizar virtualenv / readline e nada corrigido.

Enquanto eu tento import readlineproblema no shell python, receba esta mensagem de erro:

ImportError: dlopen(/Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
Referenced from: /Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so
Reason: image not found

Porque existe, /usr/local/opt/readline/lib/libreadline.7.dylibmas não existe libreadline.6.dylib, então eu faço um link de símbolo:

ln -s libreadline.7.dylib libreadline.6.dylib

Problema resolvido!


Depois de olhar e olhar, consegui corrigir o problema com esta sugestão. Obrigado!
gl051

Isso não causará problemas se algo chamar v6, sem perceber que na verdade é v7?
Adam Barnes

3
Eu tive o mesmo problema, mas em vez dessas instruções, tive brew update && brew upgrade. Ainda não se sabe se isso quebrou o PHP no processo.
Adam Barnes

@ AdamBarnes Isso também fez o truque para mim. Também uso o pyenv, então desinstalei / reinstalei as versões do python necessárias depois de atualizar todos os pacotes do homebrew.
funseiki

3
Eu não tinha o libreadline.7.dylib (talvez porque esteja no Mojave 10.14.xe depois atualizei o XCode 10.2.1), mas tinha o ver 8. A execução ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibcorrigiu o problema dos códigos de verificação, mas não recuperou a recuperação do comando do histórico. Embora neste caso, metade de uma correção seja melhor que nenhuma. (Sim, eu também adicionei um link para 6, sem diferença). Adendo: este foi / é apenas um problema com python2 para mim. python3 funcionou bem sem os links.
Zim

51

No OS X, as atualizações do Xcode às vezes são interrompidas readline. Solução:

brew uninstall readline
brew upgrade python3
brew install readline
pip3 install readline

Se o problema persistir, tente remover o readlineuso pipe instale-o usando easy_install:

pip3 uninstall readline
easy_install readline

existe um equivalente se você estiver usando o sistema Python 2.7.10?
user5359531

3
@ user5359531 Eu atualizei a resposta com uma easy_installopção
Max Malysh

Usuários do OSX 10.12 também: stackoverflow.com/questions/7375545/…
ptim

1
Usar easy_installfunciona para mim, enquanto aquele com pip não funciona.
Just-

1
Isso combinado com o brew link readline(embora já estivesse vinculado) o corrigiu para mim.
precisa

28

No OS X, usando python 3.5 e virtualenv

$ pip install gnureadline

No intérprete, faça:

import gnureadline

Agora as teclas de seta devem funcionar corretamente.


Informação adicional...

Observe que, a partir de 1º de outubro de 2015 - o readline foi DEPRECADO (fonte https://github.com/ludwigschwardt/python-readline )

Use o gnureadline (consulte: https://github.com/ludwigschwardt/python-gnureadline )

Se eu instalar o readline em vez do gnureadline usando python 3.5, recebo erros após tentar importar no intérprete:

>>> import readline
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so
  Reason: image not found

isso funciona, mas significa que eu preciso adicionar import gnureadlineno topo de cada sessão interativa que é realmente irritante. Existe uma maneira de começar isso no início de cada sessão interativa?
Anton Codes

1
O @Panchishin tenta usar a variável de ambiente PYTHONSTARTUP para nomear um arquivo que possui comandos Python executados antes que o prompt interativo seja exibido (por exemplo import gnureadline). Para possíveis outras idéias também ver: interpretador de linha de comando python correr com importações carregados automaticamente
user12345

19

Eu corri para esse problema recentemente e depois de ler muito sobre pip install readline(não funciona no mac osx) pip install gnureadlinee não estar satisfeito, essa é agora a minha instalação que permite o uso de teclas de seta em qualquer console python:

  1. instale o gnureadline usando pip install gnureadline

agora você pode fazer import gnureadlinee as teclas de seta devem funcionar conforme o esperado. Para fazê-los funcionar automaticamente, siga as seguintes etapas:

  1. crie (ou acrescente a) arquivo ~/.startup.py:import gnureadline
  2. anexar ao arquivo ~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

Uma coisa que não funciona, mas funcionou na minha configuração anterior, é: importação automática do gnureadline on pdb.set_trace(). Se alguém tiver uma boa solução para esse problema, ficaria grato por um comentário.


15
  1. instale o pacote readline-devel.
  2. recompilar python com o módulo readline
  3. Bingo!

2
Obrigado por melhorar minha qualidade de vida! {;-) no CentOS 5.5, que é yum install readline-devel e você não tem que especificar explicitamente readline na recompilação
michela

3
Como recompilar o Python? Preciso instalar o extrato python da fonte (./configure, make, make install), configurar o virtualenv e instalar todos os meus pacotes novamente?
Muhammad Waqar

14

Eu tive problemas com o histórico do shell (comandos tab / arrows) do Python 3.6.x no Ubuntu 16.04 LTS.

O Python 3.6.x foi instalado a partir da fonte.

O que foi resolvido para mim foi instalar o módulo "gnureadline", conforme dito por user12345, usando esta linha de comando:

sudo pip3.6 install gnureadline

:)


1
Eu tentei todas as outras soluções, mas esta funcionou para mim no meu Python 3.6
Umair

1
certifique-se chamar import gnureadlineno shell para que ele funcione
David Schumann

3
Não há necessidade de uso sudo
Newalp

11

Aqui estão as etapas que funcionaram para mim no ubuntu 12.04 para python 3.3.

1) abra o teminal e escreva sudo apt-get install libreadline-dev

2) faça o download do arquivo fonte do python 3.3.2 em http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

3) extraia-o e navegue até o diretório Python-3.3.2 / em um shell

4) execute o seguinte comando:

./configure
make
make test
sudo make install

7

Foi impactado após a atualização do Mac para High Sierra, isso resolveu com êxito para mim:

brew unlink python
xcode-select --install
brew install python

5

No CentOS, eu corrijo isso

yum install readline-devel

e recompile o python 3.4.

No OpenSUSE, eu corrijo isso

pip3 install readline

seguindo a resposta de Valerio Crini.

Talvez o "pip3 install readline" seja uma solução geral. Ainda não tentei no meu CentOS.


Boa ligação com a dica readline-devel. Ele funcionou para mim em uma máquina Centos6.5, rumming python 2.7.8. Liguei diretamente pip install readlinesem recompilar o python e funcionou bem.
22715 Arjun

3

Corrigi isso fazendo o seguinte:

  • yum instalar o readline-devel
  • readline de instalação do pip

    • Encontrei outro erro aqui:

      gcc: readline/libreadline.a: No such file or directory

      gcc: readline/libhistory.a: No such file or directory

      Corrigi isso instalando patch:

      yum install patch

Depois disso, eu consegui executar com pip install readlinesucesso, o que resolveu os caracteres de escape no meu shell python.

Para sua informação, estou usando RedHat


CentOS 6.8, Python2.7.12, um sucesso
kkzxak47

3

Se você usa o Anaconda Python, pode corrigir isso executando:

conda install readline

Trabalhou para mim!


2
No meu caso, readlinejá está instalado, tenho que fazer conda install ncursespara que funcione.
whenov

3

Para aqueles que usam conda, a instalação do pacote readline a partir do canal conda-forge corrigirá o problema:

conda install -c conda-forge readline=6.2

2

Você chamou ssh com o parâmetro -t para dizer ao ssh para alocar um terminal virtual para você?

Na página do manual:

-t
Força a alocação pseudo-tty. Isso pode ser usado para executar programas arbitrários baseados em tela em uma máquina remota, o que pode ser muito útil, por exemplo, ao implementar serviços de menu. Várias opções -t forçam a alocação de tty, mesmo se ssh não tiver tty local.

Além disso, talvez você também precise definir a variável de ambiente TERM no servidor corretamente, conforme sugerido em outra postagem.


2

No Mac OS X Mojave 10.14.6 com várias instalações históricas via breweu resolvi isso com:

brew reinstall python2

É provável que não haja uma bala mágica, pois todos têm um cenário de instalação diferente. Eu tentei o acima também, por isso pode ter sido uma combinação de algumas das respostas. O padrão do Brew é o de python3que, se você instalou o python2pacote, ele também precisará ser reinstalado.


2

Nenhuma dessas respostas funcionou para mim em duas versões diferentes do Ubuntu. O que funcionou para mim, mas não é uma correção verdadeira, é agrupar meu código python em uma chamada para rlwrap(disponível nos repositórios do ubuntu):

rlwrap python mycode.py


1

Você já tentou usar um cliente SSH diferente? Alguns clientes SSH têm mapeamentos de teclas internos especiais para diferentes processos remotos. Eu encontrei muito esse aqui com o emacs.

Qual cliente você está usando? Eu recomendo tentar Putty e SecureCRT para comparar seu comportamento.


Hmm, eu apenas uso o comando ssh no terminal (ssh -v diz OpenSSH_3.9p1, OpenSSL 0.9.7a 19 de fevereiro de 2003).
24440 Frank

Experimente Putty (sua livre) e voltar para nós :)
JoshJordan

Ok, eu apenas instalei a massa de vidraceiro e usei-a para conectar à máquina, mas o comportamento é o mesmo.
24440 Frank

:( Definitivamente um problema do lado do servidor, então eu vou olhar para ele e voltar para você..
JoshJordan

Usar o comando ssh para conectar-se a outra máquina funciona bem: Não tenho problemas com as teclas de seta. Parece ser o único sistema em particular que apresenta problemas.
24440 Frank

1

O módulo readline foi descontinuado, o que causará erro de ponteiro inválido nas versões mais recentes do python ao executar quit () ou exit () no shell do python. pip install gnureadlineem vez de


0

Como sua variável de ambiente $ TERM define [a] quando as coisas funcionam bem e [b] quando não funcionam? As configurações Env geralmente são a chave para esses problemas.


1
Eu apenas tentei alguns valores de variáveis ​​TERM: vt102, vt220, ansi, xterm, mas nenhum deles mudou o comportamento.
24440 Frank

0

Tente obter uma biblioteca de códigos de chave em execução no servidor. Se isso não funcionar, tente baixar uma biblioteca com capacidade de leitura de chave.


0

Eu estava tentando construir o Python 2.7 no Ubuntu 14.0. Você precisará do libreadline-dev. No entanto, se você o obtiver no apt-get, a versão atual é 6.3, que é incompatível com o Python 2.7 (não tenho certeza sobre o Python 3). Por exemplo, o tipo de dados "Função" e "CPPFunction", definidos em versões anteriores do readline, foram removidos na versão 6.3, conforme relatado aqui:

https://github.com/yyuu/pyenv/issues/126

Ou seja, você precisa obter o código fonte de uma versão anterior do readline. Eu instalei o libreadline 5.2 do apt-get para a biblioteca e obtenha o código fonte do 5.2 para os arquivos de cabeçalho. Coloque-os em / usr / include.

Finalmente, o problema foi resolvido.


0

No MacOsx, corrigi isso reinstalando o readline

brew reinstall readline
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.