Hello Jack: What versions of emacs and org-mode are you using? I tried your example on Emacs 25.3.1 and org-mode 9.1.2-22 and I got "20" as result It has happened to me in the past that some bug I was seeing goes away just by updating org-mode. Regards, Martin On Sat, Nov 18, 2017 at 5:16 PM Jack Kamm wrote: > Thanks Kyle, and sorry for missing that recent related thread. > > I adapted your old patch to the current master branch. I also extended it > to work for ":results value" (the original patch only worked for ":results > output"). I did this by not writing the last line of the code block to the > tmpfile, unless it is indented. > > I've never contributed before so would appreciate any comments on this > patch, and how to get it accepted. Cheers, Jack. > > From a5d553ece9f6ee35cd1e273e554a21a19e80ec3c Mon Sep 17 00:00:00 2001 > > From: Jack Kamm > Date: Sat, 18 Nov 2017 21:47:09 +0000 > Subject: [PATCH] fix newline/indentation issues in ob-python :session > > --- > lisp/ob-python.el | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/lisp/ob-python.el b/lisp/ob-python.el > index 60ec5fa47..6623ef5fc 100644 > --- a/lisp/ob-python.el > +++ b/lisp/ob-python.el > @@ -303,6 +303,10 @@ last statement in BODY, as elisp." > (mapc (lambda (line) (insert line) (funcall > send-wait)) > (split-string body "[\r\n]")) > (funcall send-wait))) > + (indented-p (org-babel-python--indented-p body)) > + (body (if indented-p > + (org-babel-python--replace-body-tmpfile body) > + body)) > (results > (pcase result-type > (`output > @@ -340,6 +344,35 @@ last statement in BODY, as elisp." > (substring string 1 -1) > string)) > > + > +(defun org-babel-python--indented-p (input) > + "Non-nil if any line in INPUT is indented." > + (string-match-p "^[ \t]" input)) > + > +(defun org-babel-python--replace-body-tmpfile (body) > + "Place body in tmpfile, and return string to exec the tmpfile. > +If last line of body is not indented, place it at end of exec string > +instead of tmpfile, so shell can see the result" > + (let* ((tmp-file (org-babel-temp-file "python-")) > + (lines (split-string body "\n" t)) > + (lastline (car (last lines))) > + (newbody (concat > + (format "__pyfilename = '%s'; " tmp-file) > + "__pyfile = open(__pyfilename); " > + "exec(compile(" > + "__pyfile.read(), __pyfilename, 'exec'" > + ")); " > + "__pyfile.close()"))) > + (if (string-match-p "^[ \t]" lastline) > + (progn > + (with-temp-file tmp-file (insert body)) > + newbody) > + (with-temp-file tmp-file > + (insert (mapconcat 'identity > + (butlast lines) "\n"))) > + (concat newbody "\n" lastline))) > + ) > + > (provide 'ob-python) > > > -- > 2.15.0 > > > On Sat, Nov 18, 2017 at 3:05 PM, Kyle Meyer wrote: > >> Hello, >> >> Jack Kamm writes: >> >> > ob-python newline & indentation behavior in :session is very ugly and >> > possibly broken. For example, consider the following code block: >> >> [...] >> >> > There is a 2 year old patch that fixes this behavior but has not yet >> > been incorporated: >> > https://lists.gnu.org/archive/html/emacs-orgmode/2015-03/msg00505.html >> >> [...] >> >> > The patch follows the python.el behavior of using a temporary file and >> > executing that from the shell. >> > >> > Could this patch, or something similar, be incorporated into org-mode, >> > to fix this behavior? >> >> Here's what I said in a recent post about ob-python sessions: >> >> >> https://lists.gnu.org/archive/html/emacs-orgmode/2017-10/msg00198.html >> >> I dropped my attempt to fix it because 1) I was still having trouble >> getting a complete understanding of what the issue was and 2) I didn't >> have the motivation to spend time digging deeper because I don't use >> ob-python (and in general am not a heavy Org-Babel user). Perhaps you >> or some other ob-python user could help make ob-python sessions more >> robust? >> >> Perhaps you are the "you"? >> >> -- >> Kyle >> > >