¿Cómo funciona la pasta% mágica de IPython?


93

Quiero copiar el código Python / funciones y clases completas ya sangradas en IPython. Cada vez que intento, la sangría se estropea y aparece el siguiente mensaje de error:

IndentationError: unindent does not match any outer indentation level (<ipython-input-23-354f8c8be51b>, line 12)

If you want to paste code into IPython, try the %paste and %cpaste magic functions.


3
Lo sé, probablemente ya esté en stackoverflow, pero no lo encontró después de 3 búsquedas, así que agregué mi propia versión.
Framester

Respuestas:


136

No puede copiar a IPython directamente. Estos son los pasos:

  1. Copie las líneas que desea copiar en IPython en el portapapeles
  2. Entrar %paste en IPython
  3. Presione enter
  4. ¡Lucro!

47
% paste requiere Tkinter, así que si no tienes esa otra buena apuesta es% cpaste
yekta

61
De hecho, puede copiar el código a IPython directamente: es posible que primero deba deshabilitar la sangría automática ingresando %autoindent.
Eric O Lebigot

¡Gracias EOL! +1 para ti
Framester

5
En Ipython 5 puede simplemente pegar el código. No necesito %pastemás. Lea esta respuesta .
Levon

1
Tampoco necesitas el% antes paste.
palabras para lo que sea

40

Una aclaración sobre los pasos:

  • Primero, copie las líneas de destino en su portapapeles.

  • Escriba en el indicador de iPython:

    • Si está en Tkinter: ingrese %paste
    • De lo contrario: ingrese %cpaste
  • Pega (Ctrl-V) y presiona Enter.

  • Luego escribe -- y presiona enter.

Por ejemplo:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:for l in "Hello World":
:    print l,
:--
H e l l o   W o r l d

3
No es necesario que presione Ctrl-V. Solo escriba% paste y presione enter.
SeF

21

A partir de Ipython 5 no necesitas ningún comando mágico, solo pégalo

ipython5

Gracias a prompt_toolkit, IPythonahora admite:

  • Resaltado de sintaxis a medida que escribe
  • Edición real de varias líneas (las teclas de flecha arriba y abajo se mueven entre líneas)
  • Pegado de varias líneas sin romper la sangría o ejecutar código inmediatamente
  • Mejor interfaz de finalización de código (planeamos mejorar eso más) Soporte de mouse opcional

Más sobre esto aquí

Para actualizar ipythona la última versión

pip install ipython --upgrade 

¿Es posible pegar varias líneas y ejecutar el código automáticamente en cada línea?
Eric Duminil

sí, solo pega el código y presiona enter. si desea depurar, consulte% pdb o ipdb. ejemplo
Levon

Esto también admite la salida de Python repl, código que comienza con tres >signos como este:>>> a = 1 + 2
Flimm

Todo este tiempo he estado haciendo% cpaste .. ¡agradable!
Gershon Herczeg

1
Yo creo que depende del entorno desde el que está haciendo el pegar y la forma en que está haciendo el pegar? Mi colega está usando el símbolo del sistema de Windows 10 para SSH en nuestro host Linux, abre ipython en un contenedor Docker allí e intenta pegar el código ya sangrado ( haciendo clic con el botón derecho ), y obtiene sangría adicional incluso en iPython 7.8.0. La forma en que entiendo el comportamiento del clic derecho del símbolo del sistema es que en realidad solo toma lo que está en el portapapeles y lo muestra carácter por carácter como si lo estuviera escribiendo. Así que iPython no tiene forma de saber que de hecho está pegando.
Kal

6

%paste requiere Tkinter. Si está en ubuntu, puede instalarlo

sudo apt-get install python-tk

Si estás en Python3

sudo apt-get install python3-tk

Luego reinicie ipython y use %pastepara pegar desde su portapapeles.


1

Una de las respuestas útiles se perdió en los comentarios, así que quería reformularla junto con agregar una referencia para otra función mágica útil de IPython.

Primero, para reafirmar lo que dijo @EOL, una forma de resolver el problema de OP es desactivar la sangría automática ejecutando primero %autoindenty pegando (no es necesario si lo está usando %paste, por supuesto).

Ahora, para agregar más información a lo que ya está allí, un modo más útil en IPython es %doctest_modeque le permite copiar, pegar, ejemplos y probar fragmentos de cadenas de documentos. Esto también es útil para ejecutar la salida de sesión interactiva de Python que puede encontrar en la documentación y en los foros en línea, sin tener que eliminar primero las cadenas de mensajes.


1

Para usuarios de ubuntu que están en Python 3.

El python-tkes para Python 2.

Para que %pastefuncione en Python 3, instale el python3-tkpaquete:

sudo apt-get install python3-tk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.