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 --classic
sinalizador 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
Isso também não parece relacionado --classic
, pois recebo o mesmo erro:
Pontos de bônus se você tiver uma configuração de trabalho que não me force a usar, --classic
como 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.
:results value
exige que você modifique seu código python adicionando umareturn
declaração explícita ou atribuindo a uma variávelfoo
e adicionando:return foo
ao cabeçalho. Mas mesmo com essas correções, não funcionará no ipython - veja meu segundo comentário na minha resposta abaixo.Respostas:
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
%cpaste
comando mágico. Aqui está uma versão ligeiramente simplificada:Depois de avaliar o exposto acima,
defadvice
seu 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.fonte
org-babel-python-evaluate-external-process
para limpar a saída. Você realmente precisa disso?