Arbeits-Setup für Ipython in Babel

7

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 --classicFlag 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

Screenshot meines Ipython-Puffers

Dies scheint auch nichts damit zu --classictun zu haben, da ich den gleichen Fehler erhalte:

Screenshot meines modernen Ipython-Puffers

Bonuspunkte, wenn Sie ein funktionierendes Setup haben, das mich nicht zwingt, es zu verwenden, --classicda 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.

wdkrnls
quelle
Der zweite Block Ihres "Updates" wird niemals funktionieren, da :results valueSie Ihren Python-Code ändern müssen, indem Sie entweder eine explizite returnAnweisung hinzufügen oder einer Variablen zuweisen foound :return foodem Header hinzufügen . Aber selbst mit diesen Korrekturen funktioniert es in ipython nicht - siehe meinen zweiten Kommentar zu meiner Antwort unten.
veraltet

Antworten:

2

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 %cpastemagische Befehl verwendet wird. Hier ist eine leicht vereinfachte Version:

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

Nachdem Sie das oben defadviceGesagte 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.

veraltet
quelle
Ich habe gerade festgestellt, dass Sie Pylab für interaktive Grafiken verwenden. Ich denke, dass Ipython dafür Sinn macht.
veraltet
1
Dies behebt die Beispielsitzung, was großartig ist, aber ohne die Sitzung nicht funktioniert. Siehe die aktualisierte Frage.
wdkrnls
@wdkmls Hmmm, aber ohne die Sitzung scheint die Motivation für die Verwendung von IPython noch schwächer zu sein. Dies würde bedeuten, dass für jede Codeblockauswertung ein separater IPython-Prozess gestartet wird, was sehr langsam ist. Wenn Sie diesen Weg wirklich einschlagen möchten, müssen Sie einen Rat org-babel-python-evaluate-external-processeinschließen, um die Ausgabe zu bereinigen. Benötigen Sie das wirklich?
veraltet
Im Moment wohl nicht. Ich möchte eventuell Python-Funktionen mit der Emacs-Tabelle verwenden, aber ich nehme an, ich kann die gewünschte Funktionalität vorerst in Shell-Skripten zusammenfassen.
wdkrnls