Vendo caracteres de escape ao pressionar as teclas de seta em shell python
-
23-08-2019 - |
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.
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
- instalar o pacote readline-devel.
- recompilação python com readline módulo
- 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:
- 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:
- criar (ou anexar a)
~/.startup.py
arquivo:import gnureadline
- 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