9

How can I execute very simple Python-Code in Emacs' Org Mode?

The first example works fine, however I can't make it give me the result of simplest computations:

; 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 set up Org Mode using the following lines:

;; 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)
1
  • Try return print(1+1) perhaps? This return seems "extra" in the original code (outside of the function). Commented Sep 3, 2013 at 18:27

2 Answers 2

17

There are two ways of getting the result of a source block - output and value. You mixed them up, hence the troubles.

First block is fine.

To fix the second block:

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

To fix the third block:

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

When output mode is value you must return. Just putting it there like you did with 1+1 won't do. In the third one you want the result to be printed output, but your default session setting is value(mine defaults to output btw).

And this bit about org-confirm-babel-evaluate is kind of irrelevant to the question. I just have it set to nil.

Sign up to request clarification or add additional context in comments.

1 Comment

Do we required to use :results value?
4

You may still face problems like blank lines cause error in function definition. The solution is given in original thread. I also posted below

(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))))

1 Comment

that works great @bowen.li , can you get inline plotting with matplotlib?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.