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 python
lá, 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.).
python
shell
ssh
arrow-keys
Frank
fonte
fonte
Respostas:
Parece que a linha de leitura não está ativada. Verifique se a
PYTHONSTARTUP
variável está definida, para mim ela aponta/etc/pythonstart
e 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
fonte
PYTHONSTARTUP
, nãoPYTHONSTART
. Não tenho certeza sobre o/etc/pythonstart
arquivo específico da distribuição .brew reinstall python3
Resolvi esse problema instalando o
readline
pacote:fonte
libncurses-dev
na minha máquina Ubuntu, e então readline instalado corretamente.ncurses-devel
no CentOS e depoisreadline
instalado, não há problema. O shell interativo está funcionando agora.pip install readline
na minha máquina OS X, falhar cada vez, mesmo depois de ter conseguido fazerbrew install readline
gnureadline
vez disso, tive que instalar , consulte stackoverflow.com/q/43013060/2846923No 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 readline
problema no shell python, receba esta mensagem de erro:Porque existe,
/usr/local/opt/readline/lib/libreadline.7.dylib
mas não existelibreadline.6.dylib
, então eu faço um link de símbolo:Problema resolvido!
fonte
brew update && brew upgrade
. Ainda não se sabe se isso quebrou o PHP no processo.ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylib
corrigiu 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.No OS X, as atualizações do Xcode às vezes são interrompidas
readline
. Solução:Se o problema persistir, tente remover o
readline
usopip
e instale-o usandoeasy_install
:fonte
easy_install
opçãoeasy_install
funciona para mim, enquanto aquele com pip não funciona.brew link readline
(embora já estivesse vinculado) o corrigiu para mim.No OS X, usando python 3.5 e virtualenv
No intérprete, faça:
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:
fonte
import gnureadline
no topo de cada sessão interativa que é realmente irritante. Existe uma maneira de começar isso no início de cada sessão interativa?import gnureadline
). Para possíveis outras idéias também ver: interpretador de linha de comando python correr com importações carregados automaticamenteEu corri para esse problema recentemente e depois de ler muito sobre
pip install readline
(não funciona no mac osx)pip install gnureadline
e não estar satisfeito, essa é agora a minha instalação que permite o uso de teclas de seta em qualquer console python:pip install gnureadline
agora você pode fazer
import gnureadline
e as teclas de seta devem funcionar conforme o esperado. Para fazê-los funcionar automaticamente, siga as seguintes etapas:~/.startup.py
:import gnureadline
~/.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.fonte
fonte
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:
:)
fonte
import gnureadline
no shell para que ele funcioneAqui 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:
fonte
Foi impactado após a atualização do Mac para High Sierra, isso resolveu com êxito para mim:
fonte
No CentOS, eu corrijo isso
yum install readline-devel
e recompile o python 3.4.
No OpenSUSE, eu corrijo isso
seguindo a resposta de Valerio Crini.
Talvez o "pip3 install readline" seja uma solução geral. Ainda não tentei no meu CentOS.
fonte
pip install readline
sem recompilar o python e funcionou bem.Corrigi isso fazendo o seguinte:
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 readline
sucesso, o que resolveu os caracteres de escape no meu shell python.Para sua informação, estou usando RedHat
fonte
Se você usa o Anaconda Python, pode corrigir isso executando:
Trabalhou para mim!
fonte
readline
já está instalado, tenho que fazerconda install ncurses
para que funcione.Para aqueles que usam conda, a instalação do pacote readline a partir do canal conda-forge corrigirá o problema:
fonte
Você chamou ssh com o parâmetro -t para dizer ao ssh para alocar um terminal virtual para você?
Na página do manual:
Além disso, talvez você também precise definir a variável de ambiente TERM no servidor corretamente, conforme sugerido em outra postagem.
fonte
No Mac OS X Mojave 10.14.6 com várias instalações históricas via
brew
eu resolvi isso com:É 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
python3
que, se você instalou opython2
pacote, ele também precisará ser reinstalado.fonte
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
fonte
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.
fonte
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 gnureadline
em vez defonte
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.
fonte
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.
fonte
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.
fonte
No MacOsx, corrigi isso reinstalando o readline
fonte