Pergunta

Em escudos como o shell interativo do Python, geralmente você pode usar as setas do teclado para se mover na linha atual ou obter comandos anteriores (com a seta para cima) etc.

Mas depois que eu ssh em outra máquina e começar python lá, eu recebo sessões como:

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

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

>>> impor^[[D

Como posso corrigir isso?

Na festa regular, as setas funcionam bem. O comportamento estranho é apenas no python interativo (ou perl etc.) shell.

Foi útil?

Solução

Looks como readline não está habilitado. Verifique se a variável PYTHONSTARTUP é definido, para mim ele aponta para /etc/pythonstart e esse arquivo é executado pelo processo de python antes de ir interativo, que setups readline / manuseio história.

Graças a @chown aqui é a documentação sobre isto: http: //docs.python .org / 2 / tutorial / interactive.html

Outras dicas

Eu já resolveu esse problema pacote readline instalar:

pip install readline

No OS X, eu tenho problema diferente.

Quando eu usando shell python sistema, as chaves não é problema, mas o problema em virtualenv. Eu ia tentar reinstalar / atualizar virtualenv / readline e nada fixo.

Enquanto eu tento import readline em shell python problema, obter 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 há /usr/local/opt/readline/lib/libreadline.7.dylib mas não libreadline.6.dylib, assim que eu faço um link símbolo:

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

O problema foi resolvido!

No OS X, atualizações Xcode, por vezes, quebrar readline. Solução:

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

Se o problema persistir, tente remover readline usando pip e instalá-lo usando easy_install:

pip3 uninstall readline
easy_install readline

No OS X, usando python 3.5 e virtualenv

$ pip install gnureadline

No interpretador fazer:

import gnureadline

Agora teclas de seta deve funcionar corretamente.


Informações adicionais ...

Note que a partir de 01 de outubro de 2015 - readline foi DEPRECADO (fonte https://github.com/ludwigschwardt/python-readline )

Use GNU readline em vez (ver: https://github.com/ludwigschwardt / python-GNU readline)

Se eu instalar readline vez de GNU readline usando python 3.5, recebo erros após tentativa de importação no interpretador:

>>> 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
  1. instalar o pacote readline-devel.
  2. recompilação python com readline módulo
  3. Bingo!

Aqui estão os passos que trabalharam para mim no Ubuntu 12.04 para Python 3.3.

1) teminal aberto e gravação sudo apt-get install libreadline-dev

2) baixar o arquivo fonte de python 3.3.2 do http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

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

4) execute o seguinte comando:

./configure
make
make test
sudo make install

Eu tive problemas com história shell (comandos da guia / setas) de Python 3.6.x no Ubuntu 16.04 LTS.

Python 3.6.x foi instalado a partir da fonte.

O que resolvido para mim foi instalar o módulo "GNU readline" como disseram pelo user12345, usando esta linha de comando:

sudo pip3.6 install gnureadline

:)

Eu executar para esse problema recentemente e depois de ler muito sobre pip install readline (não funciona para Mac OSX) e pip install gnureadline e não estar satisfeito, esta é agora a minha configuração que permite o uso de teclas de seta em qualquer console python:

  1. instalar GNU readline usando pip install gnureadline

Agora você pode fazer import gnureadline e setas devem funcionar como esperado. Para fazê-los funcionar automaticamente seguir os seguintes passos:

  1. criar (ou anexar a) ~/.startup.py arquivo: import gnureadline
  2. acréscimo para ~/.bash_profile arquivo: export PYTHONSTARTUP=~/.startup.py

Uma coisa que não funciona, mas fiz na minha configuração anterior é: importação automática de GNU readline em pdb.set_trace(). Se alguém tiver uma boa solução para este problema eu ficaria grato por um comentário.

foi impactado após a atualização Mac para High Sierra, este resolvidos com sucesso para mim:

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

No CentOS, eu corrigir isso

yum install readline-devel

e, em seguida, python recompilação 3.4.

No OpenSUSE, para corrigir isso por

pip3 install readline

seguinte resposta de Valerio Crini.

Talvez "PIP3 instalar readline" é uma solução geral. Não tentei no meu CentOS.

Eu reparei isso fazendo o seguinte:

  • yum install readline-devel
  • pip instalar readline

    • Eu encontrei outro erro aqui:

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

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

      Eu reparei isso instalando patch:

      yum install patch

Depois que eu consegui executar pip install readline sucesso que resolveu os caracteres de escape na minha shell python.

FYI, eu estou usando RedHat

Se você usar Anaconda Python, você pode corrigir isso executando:

conda install readline

funcionou para mim!

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

A partir da página man:

-t
alocação de pseudo-tty Force. Isso pode ser usado para executar programas baseados em tela arbitrários em uma máquina remota, que pode ser muito útil, por exemplo, na implementação de serviços de menu. opções -t alocação múltipla vigor tty, mesmo ssh não tem tty local.

Além disso, você também pode ter de definir o PRAZO variável de ambiente no servidor corretamente como sugerido em outro post.

Você já tentou usar um cliente SSH diferente? Alguns clientes SSH tem especial, built-in keymappings para diferentes processos remotos. Corri para este muito com emacs.

O cliente que você está usando? Eu recomendo a tentar Putty e SecureCRT para comparar o seu comportamento.

Para aqueles que usam Conda, instalar o pacote readline do canal Conda-forja irá corrigir o problema:

conda install -c conda-forge readline=6.2

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

brew reinstall python2

Não é provável que nenhuma mágica bala dada toda a gente tem um cenário diferente instalar. Eu tentei o acima tão bem como ela pode ter sido uma combinação de algumas das respostas. defaults Brew para python3 por isso, se você instalou o pacote python2 também precisa ser reinstalado.

Como está o seu env variável $ set TERM [a] quando bem as coisas trabalho e [b] quando não o fazem? configurações env são muitas vezes a chave para tais problemas.

Tente obter uma biblioteca de código de chave em execução no servidor. Se isso não funcionar, tente fazer o download de uma biblioteca com habilidade chave de leitura.

Eu estava tentando construir Python 2.7 no Ubuntu 14.0. Você vai precisar de libreadline-dev. No entanto, se você começar a partir de apt-get, a versão atual é de 6,3, o que é incompatível com o Python 2.7 (não tenho certeza sobre Python 3). Por exemplo, o tipo de dados "função" e "CPPFunction", que foram definidas nas versões anteriores do readline foi removido em 6.3, como descrito aqui:

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

Isso quer dizer que você precisa para obter o código fonte de uma versão anterior do readline. Eu instalei libreadline 5.2 de apt-get para a biblioteca, e obter o código fonte de 5.2 para os arquivos de cabeçalho. Colocá-los em / usr / include.

Finalmente, o problema foi resolvido.

módulo readline foi preterido que fará com que erro de ponteiro inválido em versões mais recentes python ao executar quit () ou saída () in shell python. pip install gnureadline vez

No OS X, isso funcionou para mim:

xcode-select --install  # install xcode command line tools (if you haven't already)
brew reinstall python3  # reinstall python3 (perhaps not necessary)
pip3 install gnureadline  # pip install the gnureadline package
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top