configuração de trabalho para ipython em babel

7

Alguém pode me indicar uma configuração de trabalho para usar o babel com o IPython?

Estou testemunhando um comportamento de indentação estranho quando tento definir funções. Isso acontece independentemente de eu especificar ou não o --classicsinalizador org-babel-python-command. Meu comando atual (executando o linux com o Emacs 24.4):

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

Isso não funciona com definições de função.

#+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 tela do meu buffer ipython

Isso também não parece relacionado --classic, pois recebo o mesmo erro:

captura de tela do meu buffer ipython moderno

Pontos de bônus se você tiver uma configuração de trabalho que não me force a usar, --classiccomo eu gosto da formatação da interface "moderna".

Atualizar

O uso do comando magic permite definir funções e avaliar uma sessão, mas não consigo obter uma saída de valor sem uma. Em vez disso, recebo:

#+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:

Nenhum resultado é retornado, aparentemente porque todo >>>o resultado da saída não está sendo analisado corretamente.

wdkrnls
fonte
O segundo bloco da sua "Atualização" nunca funcionará, pois :results valueexige que você modifique seu código python adicionando uma returndeclaração explícita ou atribuindo a uma variável fooe adicionando :return fooao cabeçalho. Mas mesmo com essas correções, não funcionará no ipython - veja meu segundo comentário na minha resposta abaixo.
obsoleto

Respostas:

2

O problema é que você não pode colar diretamente o código em uma sessão ipython. Uma postagem na lista de discussão da organização de Arun Persaud fornece uma solução alternativa que emprega o %cpastecomando mágico. Aqui está uma versão ligeiramente 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

Depois de avaliar o exposto acima, defadviceseu exemplo funciona para mim. Eu tenho que perguntar, porém, qual é o benefício de usar o ipython para o shell inferior? Se você estiver usando o babel, certamente não estará interagindo diretamente com o shell.

descontinuada
fonte
Acabei de perceber que você está usando o pylab para gráficos interativos, então acho que o ipython faz sentido para isso.
obsoleto
11
isso corrige a sessão de exemplo, o que é ótimo, mas não funciona sem a sessão. Veja a pergunta atualizada.
Wdkrnls
@wdkmls Hmmm, mas sem a sessão, a motivação para usar o IPython parece ainda mais fraca. Isso significaria iniciar um processo IPython separado para cada avaliação de bloco de código, o que é muito lento. Se você realmente deseja seguir esse caminho, seria necessário seguir um conselho org-babel-python-evaluate-external-processpara limpar a saída. Você realmente precisa disso?
obsoleto
Agora não, suponho. Eu gostaria de eventualmente usar funções python com a planilha do Emacs, mas suponho que posso agrupar a funcionalidade desejada em scripts de shell por enquanto.
Wdkrnls