2013-09-03 11 views
8

Jak mogę wykonać bardzo prosty kod Pythona w trybie Emacsa?Tryb Emacs Org: Wykonywanie prostego kodu Pythona

Pierwszy przykład działa dobrze, jednak nie mogę zrobić to dać mi wynik najprostszych obliczeń:

; 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 

skonfigurować tryb Org stosując następujące linie:

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

Spróbuj 'return print (1 + 1)' moze? Ten "return" wydaje się "ekstra" w oryginalnym kodzie (poza funkcją). – PascalVKooten

Odpowiedz

13

Nie są two ways uzyskiwania wyniku bloku źródłowego - output i value. Połączyłeś je, stąd kłopoty.

Pierwszy blok jest w porządku.

Aby rozwiązać ten drugi blok:

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

Aby rozwiązać ten trzeci blok:

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

Gdy tryb wyjściowy jest value musisz return. Po prostu wstawienie go tak, jak zrobiłeś z 1+1, nie wystarczy. W trzecim przypadku wynik ma zostać wydrukowany, ale domyślną wartością ustawienia jest value (domyślne ustawienie kopalni to output btw).

Ten kawałek o numerze org-confirm-babel-evaluate jest w pewnym stopniu nieistotny dla pytania. Po prostu ustawiłem to na nil.

3

Możesz napotkać problemy, takie jak puste linie, które powodują błąd w definicji funkcji. Rozwiązanie podano w original thread. Opublikowalem takze ponizej:

(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

który działa wspaniale @ bowen.li, czy możesz uzyskać inline plotowanie z matplotlib? – manandearth