diff options
Diffstat (limited to 'lisp/org/ob-python.el')
| -rw-r--r-- | lisp/org/ob-python.el | 69 |
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. | ||
| 413 | Returns a placeholder string for insertion, to later be replaced | ||
| 414 | by `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 |