aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/org/ob-python.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/org/ob-python.el')
-rw-r--r--lisp/org/ob-python.el69
1 files changed, 60 insertions, 9 deletions
diff --git a/lisp/org/ob-python.el b/lisp/org/ob-python.el
index 7911205d08d..3c095ad463f 100644
--- a/lisp/org/ob-python.el
+++ b/lisp/org/ob-python.el
@@ -81,15 +81,20 @@ This function is called by `org-babel-execute-src-block'."
81 (cdr (assq :session params)))) 81 (cdr (assq :session params))))
82 (result-params (cdr (assq :result-params params))) 82 (result-params (cdr (assq :result-params params)))
83 (result-type (cdr (assq :result-type params))) 83 (result-type (cdr (assq :result-type params)))
84 (return-val (when (and (eq result-type 'value) (not session)) 84 (return-val (when (eq result-type 'value)
85 (cdr (assq :return params)))) 85 (cdr (assq :return params))))
86 (preamble (cdr (assq :preamble params))) 86 (preamble (cdr (assq :preamble params)))
87 (async (org-babel-comint-use-async params))
87 (full-body 88 (full-body
88 (org-babel-expand-body:generic 89 (concat
89 (concat body (if return-val (format "\nreturn %s" return-val) "")) 90 (org-babel-expand-body:generic
90 params (org-babel-variable-assignments:python params))) 91 body params
92 (org-babel-variable-assignments:python params))
93 (when return-val
94 (format (if session "\n%s" "\nreturn %s") return-val))))
91 (result (org-babel-python-evaluate 95 (result (org-babel-python-evaluate
92 session full-body result-type result-params preamble))) 96 session full-body result-type
97 result-params preamble async)))
93 (org-babel-reassemble-table 98 (org-babel-reassemble-table
94 result 99 result
95 (org-babel-pick-name (cdr (assq :colname-names params)) 100 (org-babel-pick-name (cdr (assq :colname-names params))
@@ -149,7 +154,7 @@ Emacs-lisp table, otherwise return the results as a string."
149 (let ((res (org-babel-script-escape results))) 154 (let ((res (org-babel-script-escape results)))
150 (if (listp res) 155 (if (listp res)
151 (mapcar (lambda (el) (if (eq el 'None) 156 (mapcar (lambda (el) (if (eq el 'None)
152 org-babel-python-None-to el)) 157 org-babel-python-None-to el))
153 res) 158 res)
154 res))) 159 res)))
155 160
@@ -275,11 +280,14 @@ else:
275 (if (member "pp" result-params) "True" "False"))) 280 (if (member "pp" result-params) "True" "False")))
276 281
277(defun org-babel-python-evaluate 282(defun org-babel-python-evaluate
278 (session body &optional result-type result-params preamble) 283 (session body &optional result-type result-params preamble async)
279 "Evaluate BODY as Python code." 284 "Evaluate BODY as Python code."
280 (if session 285 (if session
281 (org-babel-python-evaluate-session 286 (if async
282 session body result-type result-params) 287 (org-babel-python-async-evaluate-session
288 session body result-type result-params)
289 (org-babel-python-evaluate-session
290 session body result-type result-params))
283 (org-babel-python-evaluate-external-process 291 (org-babel-python-evaluate-external-process
284 body result-type result-params preamble))) 292 body result-type result-params preamble)))
285 293
@@ -388,6 +396,49 @@ last statement in BODY, as elisp."
388 (substring string 1 -1) 396 (substring string 1 -1)
389 string)) 397 string))
390 398
399;; Async session eval
400
401(defconst org-babel-python-async-indicator "print ('ob_comint_async_python_%s_%s')")
402
403(defun org-babel-python-async-value-callback (params tmp-file)
404 (let ((result-params (cdr (assq :result-params params)))
405 (results (org-babel-eval-read-file tmp-file)))
406 (org-babel-result-cond result-params
407 results
408 (org-babel-python-table-or-string results))))
409
410(defun org-babel-python-async-evaluate-session
411 (session body &optional result-type result-params)
412 "Asynchronously evaluate BODY in SESSION.
413Returns a placeholder string for insertion, to later be replaced
414by `org-babel-comint-async-filter'."
415 (org-babel-comint-async-register
416 session (current-buffer)
417 "ob_comint_async_python_\\(.+\\)_\\(.+\\)"
418 'org-babel-chomp 'org-babel-python-async-value-callback)
419 (let ((python-shell-buffer-name (org-babel-python-without-earmuffs session)))
420 (pcase result-type
421 (`output
422 (let ((uuid (md5 (number-to-string (random 100000000)))))
423 (with-temp-buffer
424 (insert (format org-babel-python-async-indicator "start" uuid))
425 (insert "\n")
426 (insert body)
427 (insert "\n")
428 (insert (format org-babel-python-async-indicator "end" uuid))
429 (python-shell-send-buffer))
430 uuid))
431 (`value
432 (let ((tmp-results-file (org-babel-temp-file "python-"))
433 (tmp-src-file (org-babel-temp-file "python-")))
434 (with-temp-file tmp-src-file (insert body))
435 (with-temp-buffer
436 (insert (org-babel-python-format-session-value tmp-src-file tmp-results-file result-params))
437 (insert "\n")
438 (insert (format org-babel-python-async-indicator "file" tmp-results-file))
439 (python-shell-send-buffer))
440 tmp-results-file)))))
441
391(provide 'ob-python) 442(provide 'ob-python)
392 443
393;;; ob-python.el ends here 444;;; ob-python.el ends here