¿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.

Framester
fuente
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!
Framester
fuente
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
Yuly
fuente
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 
Levon
fuente
¿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.

ChillarAnand
fuente
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.

haridsv
fuente
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
utapyngo
fuente