Режим организации Emacs: выполнение простого кода python

Как я могу выполнить очень простой Python-код в режиме организации Emacs?

первый пример работает нормально, однако я не могу заставить его дать мне результат простейших вычислений:

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

2 ответов


здесь два варианта получать результат исходного блока -output и value. Вы их перепутали, отсюда и неприятности.

первый блок в порядке.

чтобы исправить второй блок:

#+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(мои значения по умолчанию output btw).

и этот бит о org-confirm-babel-evaluate не имеет отношения к вопросу. Я просто установил его в nil.


вы все еще можете столкнуться с такими проблемами, как пустые строки вызывают ошибку в определении функции. Решение дано в исходный поток. Я также разместил ниже

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