2013-09-03 12 views
8

Wie kann ich sehr einfache Python-Code in Emacs 'Org-Modus ausführen?Emacs Org Modus: Einfache Python-Code ausführen

Das erste Beispiel funktioniert gut, aber ich kann es nicht mir das Ergebnis der einfachsten Berechnungen machen geben:

; works 
#+begin_src python 
def foo(x): 
    if x>0: 
    return x+10 

    else: 
    return x-1 

return foo(50) 
#+end_src 

#+RESULTS: 
: 60 

; does not work 
#+begin_src python 
1+1 
#+end_src 

#+RESULTS: 
: None 

; does not work 
#+begin_src python 
print(1+1) 
#+end_src 

#+RESULTS: 
: None 

I Org-Modus einrichten mit den folgenden Zeilen:

;; enable python for in-buffer evaluation 
(org-babel-do-load-languages 
'org-babel-load-languages 
'((python . t))) 

;; all python code be safe 
(defun my-org-confirm-babel-evaluate (lang body) 
(not (string= lang "python"))) 
(setq org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate) 
+0

Versuchen Sie 'return print (1 + 1)' vielleicht? Diese Rückkehr erscheint im Originalcode (außerhalb der Funktion) "extra". – PascalVKooten

Antwort

13

Es sind two ways von erhalten das Ergebnis eines Quellblocks - output und value. Du hast sie verwechselt, daher die Schwierigkeiten.

Erster Block ist in Ordnung.

den zweiten Block zu beheben:

#+begin_src python :results value 
return 1+1 
#+end_src 

den dritten Block zu beheben:

#+begin_src python :results output 
print 1+1 
#+end_src 

Wenn Ausgabemodus ist value Sie müssen return. Es einfach dort zu setzen, wie Sie es getan haben mit 1+1 wird nicht tun. In der dritten soll das Ergebnis gedruckt werden, aber Ihre Standardsitzung Einstellung ist value (mein Standard ist output BTW).

Und dieses Bit über org-confirm-babel-evaluate ist irgendwie irrelevant zu der Frage. Ich habe es nur auf nil festgelegt.

3

Sie können immer noch Probleme auftreten wie leere Zeilen Fehler in der Funktionsdefinition verursachen. Die Lösung ist in original thread angegeben. Ich auch unter

(setq org-babel-python-command "ipython3 --no-banner --classic --no-confirm-exit") 

;; 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\n" body "\n--")) 
ad-do-it 
(if (stringp ad-return-value) 
    (setq ad-return-value (replace-regexp-in-string "\\(^Pasting code; enter '--' alone on the line to stop or use Ctrl-D\.[\r\n]:*\\)" "" ad-return-value)))) 
+0

das funktioniert gut @ bowen.li, können Sie Inline-Plotten mit Matplotlib bekommen? – manandearth