Ipython: iniciar la entrada multilínea en la terminal ipython y la consola ipython

Creado en 15 oct. 2012  ·  14Comentarios  ·  Fuente: ipython/ipython

En qtconsole (a través ctrl-enter ), y en el cuaderno (a través de solo enter dentro de una celda), puede convertir cualquier entrada de una línea en una entrada de varias líneas. Sería bueno tener algo así para los puntos de entrada de la terminal y la consola.

Actualmente, una posible solución alternativa es usar if 1: para la primera línea de entrada, que luego inicia la entrada de varias líneas en todos los clientes, pero eso parece un poco incómodo.

En general, cuando sea posible, creo que tiene sentido tener paridad de funciones entre los diferentes clientes.

Ejemplo concreto: puedo ingresar la siguiente entrada usando qtconsole presionando ctrl-enter al final de cada línea:

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

y si ejecuto esa línea, y luego inicio un cliente ipython basado en terminal y presiono la flecha hacia arriba, veré un mensaje apropiado:

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

que se puede ejecutar y ejecutar, pero no hay forma de ingresar una entrada multilínea de forma libre como esa desde la terminal, lo que genera un flujo de trabajo incómodo.

gracias a @michaelpacer por traer esto a mi atención.

Comentario más útil

Presionar ctrl+o funciona para mí (probado en las consolas cmd y conemu).

También es posible usar (

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

Cuando haya terminado de escribir, simplemente regrese a la primera línea y elimine el ( .

Todos 14 comentarios

Creo que aquí nos encontramos con las limitaciones de la terminal/readline. Hasta donde yo sé, no hay una manera fácil de detectar ctrl-enter. Simplemente llamamos a raw_input() y obtenemos una cadena devuelta, o se genera una excepción si el usuario presiona Ctrl-D o Ctrl-C.

Como proyecto a más largo plazo, podría ser posible hacer esto usando una biblioteca como pyrepl en lugar de readline. Esto es algo en lo que hemos estado interesados ​​durante un tiempo, pero nadie se ha puesto a investigarlo de cerca. Otra forma sería construir una nueva interfaz usando curses o una herramienta similar como urwid.

Una cosa que puede hacer es presionar ctrl-v, ctrl-j para ingresar una nueva línea sin ejecutar la entrada. Creo que esto es parte de Bash en sí mismo, ya que también funciona en la terminal (ctrl-v dice que trate la siguiente tecla de acceso rápido como una secuencia de control y ctrl-j es una nueva línea). No he tenido la oportunidad de meterme con iTerm2 en esto, pero ¿tal vez sea posible asignar ctrl-enter a esa secuencia doble de alguna manera?

Editar: de hecho, puede replicar esto en iTerm2 al menos. Puede ir a sus teclas de acceso directo globales y configurar ctrl-enter en "Enviar códigos hexadecimales" y luego: 0x16 0x0a

¿Sería posible obtener este tipo de funcionalidad ahora con prompt_toolkit ?

Sí, aunque no con un atajo de entrada - parece que el único combo con entrada que podemos detectar con enter es Alt-Enter (o Esc, Enter ), y ya lo estamos usando para forzar la ejecución (es decir no agregue una nueva línea). Sin embargo, podríamos hacer esto con otro atajo, o podría agregar un atajo personalizado .

Una forma en que puede hacer esto en IPython actual es presionar F2, lo que lo llevará a un editor y colocará los contenidos en su entrada cuando haya terminado. Puede controlar qué editor abre configurando la variable de entorno $EDITOR .

Alt-Enter en Windows cambia las ventanas de ipython a pantalla completa.

Usando el último ipython y prompt_toolkit, y si tiene vi-mode habilitado, puede escribir su comando, luego presione ESC , luego presione o . Esto creará una nueva línea, al igual que en vi.

De esta manera puede tener comandos multilínea.

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

Árbitro

  1. Habilitación del modo Vi en ipython: http://koo.fi/blog/2016/08/04/enable-vi-editing-mode-in-ipython-5/

Me encontré con esto. ¡¿Estoy seguro de que ctrl-enter se usó para crear una nueva línea?! Pero este problema sugeriría que estoy equivocado :(

Otra opción es interpretar el punto y coma como un separador de línea. p.ej

%run slow_script.py; !display_notification.sh

ejecutará mi secuencia de comandos de python, luego ejecutará una secuencia de comandos de bash.

Editar : esto en realidad no funciona, es solo una sugerencia

Lo hago usando ;

cv2.imshow('imagen', im) ;
cv2.esperaClave(0) ;
cv2.destroyAllWindows()

Presionar ctrl+o funciona para mí (probado en las consolas cmd y conemu).

También es posible usar (

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

Cuando haya terminado de escribir, simplemente regrese a la primera línea y elimine el ( .

Lo hago usando ;

cv2.imshow('imagen', im) ;
cv2.esperaClave(0) ;
cv2.destroyAllWindows()

No parece que puedas mezclar python y magics de esta manera:

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

hi

A mí me funciona presionar ctrl+o (probado en las consolas cmd y conemu).

Para mí es alt+o .

para mi es ctrl+o

Ctrl+o me funciona en ipython , pero no jupyter console .

Ctrl+O funciona, este problema se puede cerrar

¿Fue útil esta página
0 / 5 - 0 calificaciones