Ipython: iniciar a entrada multilinha no terminal ipython e console ipython

Criado em 15 out. 2012  ·  14Comentários  ·  Fonte: ipython/ipython

Em qtconsole (via ctrl-enter ), e no notebook (via apenas enter dentro de uma célula), você pode transformar qualquer entrada de linha em uma entrada de várias linhas. Seria bom obter algo assim para os pontos de entrada do terminal e do console.

Atualmente, uma possível solução alternativa é usar e if 1: para a primeira linha de entrada, que então inicia a entrada de várias linhas em todos os clientes, mas isso parece um pouco estranho.

Em geral, sempre que possível, acho que faz sentido ter paridade de recursos entre os diferentes clientes.

Exemplo concreto: posso inserir a seguinte entrada usando o qtconsole pressionando ctrl-enter no final de cada linha:

In [2]: print "hello"
   ...: print "this is all one input"
   ...: print "same here..."
   ...: 

e se eu executar essa linha e, em seguida, iniciar um cliente ipython baseado em terminal e pressionar a seta para cima, verei um prompt apropriado:

In [1]: print "hello"
print "this is all one input"
print "same here..."

que pode ser executado e executado, mas não há como inserir uma entrada de várias linhas de forma livre como a do terminal, o que torna um fluxo de trabalho complicado.

obrigado a @michaelpacer por trazer isso à minha atenção.

Comentários muito úteis

Pressionar ctrl+o funciona para mim (tentei nos consoles cmd e conemu).

Também é possível usar (

 In [84]: (
     ...: fig, ax = plt.subplots(1,2)
     ...: ax[0].plot([1,2,3])
     ...: ax[1].plot([3,2,1])
     ...: fig.show()
     ...:

Quando terminar de digitar, volte para a primeira linha e remova o ( .

Todos 14 comentários

Acho que nos deparamos com as restrições do terminal/readline aqui. Até onde eu sei, não há uma maneira fácil de detectar ctrl-enter. Nós apenas chamamos raw_input() e obtemos uma string retornada - ou uma exceção levantada se o usuário pressionar Ctrl-D ou Ctrl-C.

Como um projeto de longo prazo, pode ser possível fazer isso usando uma biblioteca como pyrepl em vez de readline. Isso é algo que nos interessa há algum tempo, mas ninguém tem a chance de investigar isso de perto. Outra maneira seria construir um novo frontend usando curses ou uma ferramenta semelhante como o urwid.

Uma coisa que você pode fazer é pressionar ctrl-v, ctrl-j para inserir uma nova linha sem executar a entrada. Acho que isso faz parte do próprio Bash, pois também funciona no terminal (ctrl-v diz para tratar a próxima tecla de atalho como uma sequência de controle e ctrl-j é nova linha). Eu não tive a chance de mexer com o iTerm2 sobre isso, mas talvez seja possível mapear ctrl-enter para essa sequência dupla de alguma forma?

Edit: Você pode realmente replicar isso no iTerm2, pelo menos. Pode ir para as teclas de atalho globais e definir ctrl-enter para "Enviar códigos hexadecimais" e depois: 0x16 0x0a

Seria possível obter esse tipo de funcionalidade agora com prompt_toolkit ?

Sim, embora não com um atalho enter - parece que o único combo com enter que podemos detectar com enter é Alt-Enter (ou Esc, Enter ), e já estamos usando isso para forçar a execução (ou seja não adicione uma nova linha). No entanto, poderíamos fazer isso com outro atalho - ou você pode adicionar um atalho personalizado .

Uma maneira de fazer isso no IPython atual é pressionar F2, que o levará a um editor e colocará o conteúdo em sua entrada quando terminar. Você pode controlar qual editor ele abre configurando a variável de ambiente $EDITOR .

Alt-Enter no Windows altera as janelas do ipython para tela cheia.

Usando o ipython e o prompt_toolkit mais recentes, e se você tiver vi-mode habilitado, digite seu comando, pressione ESC e o . Isso criará uma nova linha, assim como no vi.

Desta forma, você pode ter comandos de várias linhas.

In [29] : %reset -s #----> press `ESC` then `o`
            %run foo.py

Referência

  1. Ativando o modo Vi no ipython: http://koo.fi/blog/2016/08/04/enable-vi-editing-mode-in-ipython-5/

Acabei de entrar nisso. Estou positivo ctrl-enter usado para criar uma nova linha!?! Mas esse problema sugere que estou enganado :(

Outra opção é interpretar o ponto e vírgula como um separador de linha. por exemplo

%run slow_script.py; !display_notification.sh

executará meu script python e, em seguida, executará algum script bash.

Edit : isso não funciona, é apenas uma sugestão

Eu faço isso usando ;

cv2.imshow('imagem', im);
cv2.waitKey(0) ;
cv2.destroyAllWindows()

Pressionar ctrl+o funciona para mim (tentei nos consoles cmd e conemu).

Também é possível usar (

 In [84]: (
     ...: fig, ax = plt.subplots(1,2)
     ...: ax[0].plot([1,2,3])
     ...: ax[1].plot([3,2,1])
     ...: fig.show()
     ...:

Quando terminar de digitar, volte para a primeira linha e remova o ( .

Eu faço isso usando ;

cv2.imshow('imagem', im);
cv2.waitKey(0) ;
cv2.destroyAllWindows()

Não parece que você pode misturar python e magias desta maneira:

In [5]: %run test.py ;\
   ...: !echo foo

hi

Pressionar ctrl + o funciona para mim (tentei nos consoles cmd e conemu).

Para mim é alt+o .

pra mim é ctrl+o

Ctrl+o funciona para mim em ipython , mas não jupyter console .

Ctrl+O funciona, este problema pode ser fechado

Esta página foi útil?
0 / 5 - 0 avaliações