¿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 --classic
bandera 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
Esto tampoco parece estar relacionado --classic
ya que obtengo el mismo error:
Puntos de bonificación si tiene una configuración funcional que no me obliga a usar, --classic
ya 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.
:results value
requiere que modifique su código de Python agregando unareturn
declaración explícita o asignando a una variablefoo
y agregando:return foo
al encabezado. Pero incluso con esas correcciones no funcionará en ipython: vea mi segundo comentario a mi respuesta a continuación.Respuestas:
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
%cpaste
comando mágico. Aquí hay una versión ligeramente simplificada:Después de evaluar lo anterior,
defadvice
su 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.fuente
org-babel-python-evaluate-external-process
para limpiar la salida. ¿Realmente necesitas esto?