Kann mich jemand auf ein funktionierendes Setup für die Verwendung von Babel mit IPython verweisen?
Ich sehe ein seltsames Einrückungsverhalten, wenn ich versuche, Funktionen zu definieren. Dies geschieht unabhängig davon, ob ich das --classic
Flag in spezifiziere oder nicht org-babel-python-command
. Mein aktueller Befehl (Linux mit Emacs 24.4 ausführen):
(setq org-babel-python-command
"ipython --pylab=qt4 --pdb --nosep --classic --no-banner --no-confirm-exit")
Dies funktioniert nicht mit Funktionsdefinitionen.
#+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
Dies scheint auch nichts damit zu --classic
tun zu haben, da ich den gleichen Fehler erhalte:
Bonuspunkte, wenn Sie ein funktionierendes Setup haben, das mich nicht zwingt, es zu verwenden, --classic
da mir die Formatierung der "modernen" Benutzeroberfläche gefällt.
Aktualisieren
Mit dem Befehl magic kann ich Funktionen definieren und eine Sitzung auswerten, aber ohne eine kann ich keine Wertausgabe erhalten. Stattdessen bekomme ich:
#+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:
Es werden keine Ergebnisse zurückgegeben, anscheinend weil alle >>>
in der Ausgabe nicht korrekt analysiert wurden.
:results value
Sie Ihren Python-Code ändern müssen, indem Sie entweder eine explizitereturn
Anweisung hinzufügen oder einer Variablen zuweisenfoo
und:return foo
dem Header hinzufügen . Aber selbst mit diesen Korrekturen funktioniert es in ipython nicht - siehe meinen zweiten Kommentar zu meiner Antwort unten.Antworten:
Das Problem ist, dass Sie Code nicht direkt in eine Ipython-Sitzung einfügen können. Ein Beitrag auf der Org-Mailingliste von Arun Persaud bietet eine Problemumgehung, bei der der
%cpaste
magische Befehl verwendet wird. Hier ist eine leicht vereinfachte Version:Nachdem Sie das oben
defadvice
Gesagte bewertet haben, funktioniert Ihr Beispiel für mich. Ich muss allerdings fragen, was der Vorteil der Verwendung von Ipython für die minderwertige Shell ist. Wenn Sie babel verwenden, werden Sie sicherlich nicht direkt mit der Shell interagieren.quelle
org-babel-python-evaluate-external-process
einschließen, um die Ausgabe zu bereinigen. Benötigen Sie das wirklich?