configuración de trabajo para ipython en babel

7

¿Alguien puede señalarme una configuración de trabajo para usar babel con IPython?

Estoy presenciando un extraño comportamiento de sangría cuando intento definir funciones. Esto sucede si especifico o no la --classicbandera org-babel-python-command. Mi comando actual (ejecutar Linux con Emacs 24.4):

(setq org-babel-python-command 
      "ipython --pylab=qt4 --pdb --nosep --classic --no-banner --no-confirm-exit")

Esto no funciona con definiciones de funciones.

#+BEGIN_SRC python :session *Broken IPython* :results output pp
  def g(x, lst):
      if isinstance(x, float):
          x = x + 0
      return [item + x for item in lst]
#+END_SRC

captura de pantalla de mi búfer ipython

Esto tampoco parece estar relacionado --classicya que obtengo el mismo error:

captura de pantalla de mi búfer ipython moderno

Puntos de bonificación si tiene una configuración funcional que no me obliga a usar, --classicya que me gusta el formato de la interfaz "moderna".

Actualizar

El uso del comando mágico me permite definir funciones y evaluar una sesión, pero no puedo obtener un valor sin una. En cambio, obtengo:

#+BEGIN_SRC python :results output
   def f(x):
       return x + 2

   f(2)
#+END_SRC

#+RESULTS:
: >>> ... ... >>> 4
: >>> 

#+BEGIN_SRC python :results value
   def f(x):
       return x + 2

   f(2)
#+END_SRC

#+RESULTS:

No se devuelven resultados, aparentemente debido a que todo el contenido >>>de la salida no se analiza correctamente.

wdkrnls
fuente
El segundo bloque de su "Actualización" nunca funcionará, ya que :results valuerequiere que modifique su código de Python agregando una returndeclaración explícita o asignando a una variable fooy agregando :return fooal encabezado. Pero incluso con esas correcciones no funcionará en ipython: vea mi segundo comentario a mi respuesta a continuación.
desuso el

Respuestas:

2

El problema es que no puede pegar directamente el código en una sesión de ipython. Una publicación en la lista de correo Org de Arun Persaud ofrece una solución alternativa que emplea el %cpastecomando mágico. Aquí hay una versión ligeramente simplificada:

#+BEGIN_SRC emacs-lisp
; use %cpaste to paste code into ipython in org mode
(defadvice org-babel-python-evaluate-session
  (around org-python-use-cpaste
         (session body &optional result-type result-params) activate)
  "add a %cpaste and '--' to the body, so that ipython does the right thing."
  (setq body (concat "%cpaste -q \n" body "\n--"))
  ad-do-it
  )
#+END_SRC

Después de evaluar lo anterior, defadvicesu ejemplo funciona para mí. Sin embargo, tengo que preguntar, ¿cuál es el beneficio de usar ipython para el shell inferior? Si está utilizando babel, seguramente no interactuará directamente con el shell.

obsoleto
fuente
Me acabo de dar cuenta de que estás usando pylab para gráficos interactivos, así que supongo que ipython tiene sentido para eso.
desuso el
1
Esto corrige la sesión de ejemplo, que es genial, pero no funciona sin la sesión. Ver la pregunta actualizada.
wdkrnls
@wdkmls Hmmm, pero sin la sesión, la motivación para usar IPython parece aún más débil. Eso significaría comenzar un proceso separado de IPython para cada evaluación de bloque de código, que es muy lento. Si realmente desea seguir esa ruta, entonces sería necesario envolver un consejo org-babel-python-evaluate-external-processpara limpiar la salida. ¿Realmente necesitas esto?
desuso el
No ahora, supongo. Eventualmente me gustaría usar las funciones de Python con la hoja de cálculo de Emacs, pero supongo que por ahora puedo envolver la funcionalidad deseada en scripts de shell.
wdkrnls