Режим Emacs Org: выполнение простого кода 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
кстати).И этот бит о
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))))