9

如何在 Emacs 的组织模式下执行非常简单的 Python 代码?

第一个示例工作正常,但是我不能让它给我最简单的计算结果:

; 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

我使用以下几行设置了组织模式:

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

2 回答 2

16

两种方法可以获取源块的结果 -outputvalue. 你把它们弄混了,因此麻烦。

第一块没问题。

要修复第二个块:

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

要修复第三个块:

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

当输出模式是value你必须return的。只是像你那样把它放在那里是1+1不行的。在第三个中,您希望将结果打印输出,但您的默认会话设置是value(我的默认设置为outputbtw)。

这一点org-confirm-babel-evaluate与问题无关。我只是将其设置为nil.

于 2013-09-03T18:29:59.710 回答
3

您可能仍然会遇到诸如空行导致函数定义错误的问题。解决方案在原始线程中给出。我也在下面发过

(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))))
于 2016-06-22T01:54:10.057 回答