branch: externals/org
commit 9239b0e8d1c317f3bd21211832feb3b10d29dc94
Author: Jack Kamm <[email protected]>
Commit: Jack Kamm <[email protected]>

    ob-python: Changed options for default Python command
    
    ob-python will now use the same settings as `run-python' when starting
    interactive sessions, by default.
    
    * lisp/ob-python.el (org-babel-python-command): Changed to have
    additional `auto' option, which is the new default value.
    (org-babel-python-command-session): New option to control default
    session Python command.
    (org-babel-python-command-nonsession): New option to control default
    nonsession Python command.
    (org-babel-python--command): New function to determine the command to
    run Python.
    (org-babel-python-initiate-session-by-key): Call `run-python' without
    CMD arg.  Instead, set `python-shell-interpreter' and
    `python-shell-interpreter-args' from `org-babel-python--command' when
    needed.
    (org-babel-python-evaluate-external-process): Use
    `org-babel-python--command' to start Python.
---
 etc/ORG-NEWS      | 30 ++++++++++++++++++++++++++
 lisp/ob-python.el | 63 ++++++++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 81 insertions(+), 12 deletions(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index c54473f559..7d0822faf4 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -551,6 +551,36 @@ Currently implemented options are:
 The capture template expansion element =%K= creates links using
 ~org-store-link~, which respects the values of ~org-id-link-to-use-id~.
 
+*** Changes to ~org-babel-python-command~, and new session/nonsession specific 
options
+
+The default Python command used by interactive sessions has been
+changed to match ~python-shell-interpreter~ and
+~python-shell-interpreter-args~ by default.  The default Python
+command for nonsessions has not changed.
+
+New options ~org-babel-python-command-nonsession~ and
+~org-babel-python-command-session~ control the default Python command
+for nonsessions and sessions, respectively.  By default,
+~org-babel-python-command-session~ is ~auto~, which means to use the
+configuration for ~python-shell-interpreter(-args)~ as default.
+
+The old option ~org-babel-python-command~ has been changed to have
+default value of ~auto~.  When not ~auto~, it overrides both
+~org-babel-python-command-nonsession~ and
+~org-babel-python-command-session~.  Therefore, users who had
+previously set ~org-babel-python-command~ will not experience any
+changes.
+
+Likewise, users who had neither set ~org-babel-python-command~ nor
+~python-shell-interpreter(-args)~ will not see any changes -- ~python~
+remains the default command.
+
+The main change will be for users who did not configure
+~org-babel-python-command~, but did configure
+~python-shell-interpreter~, e.g. to use IPython.  In this case,
+~ob-python~ will now start interactive sessions in a more consistent
+manner with ~run-python~.
+
 ** New features
 *** =ob-plantuml.el=: Support tikz file format output
 
diff --git a/lisp/ob-python.el b/lisp/ob-python.el
index 6b3a608c8a..5251c3b336 100644
--- a/lisp/ob-python.el
+++ b/lisp/ob-python.el
@@ -46,10 +46,28 @@
     (python . :any))
   "Python-specific header arguments.")
 
-(defcustom org-babel-python-command "python"
-  "Name of the command for executing Python code."
-  :version "24.4"
-  :package-version '(Org . "8.0")
+(defcustom org-babel-python-command 'auto
+  "Command (including arguments) for interactive and non-interactive Python 
code.
+When not `auto', it overrides `org-babel-python-command-session'
+and `org-babel-python-command-nonsession'."
+  :package-version '(Org . "9.7")
+  :group 'org-babel
+  :type '(choice string (const auto)))
+
+(defcustom org-babel-python-command-session 'auto
+  "Command (including arguments) for starting interactive Python sessions.
+If `auto' (the default), uses the values from
+`python-shell-interpreter' and `python-shell-interpreter-args'.
+If `org-babel-python-command' is set, then it overrides this
+option."
+  :package-version '(Org . "9.7")
+  :group 'org-babel
+  :type '(choice string (const auto)))
+
+(defcustom org-babel-python-command-nonsession "python"
+  "Command (including arguments) for executing non-interactive Python code.
+If `org-babel-python-command' is set, then it overrides this option."
+  :package-version '(Org . "9.7")
   :group 'org-babel
   :type 'string)
 
@@ -246,6 +264,20 @@ be removed after minimum supported version reaches 
emacs29."
      (buffer-substring-no-properties
       (car prompt) (cdr prompt)))))
 
+(defun org-babel-python--command (is-session)
+  "Helper function to return the Python command.
+This checks `org-babel-python-command', and then
+`org-babel-python-command-session' (if IS-SESSION) or
+`org-babel-python-command-nonsession' (if not IS-SESSION).  If
+IS-SESSION, this might return `nil', which means to use
+`python-shell-calculate-command'."
+  (or (unless (eq org-babel-python-command 'auto)
+        org-babel-python-command)
+      (if is-session
+          (unless (eq org-babel-python-command-session 'auto)
+            org-babel-python-command-session)
+        org-babel-python-command-nonsession)))
+
 (defvar-local org-babel-python--initialized nil
   "Flag used to mark that python session has been initialized.")
 (defun org-babel-python--setup-session ()
@@ -267,13 +299,21 @@ initialized session."
     (let* ((session (if session (intern session) :default))
            (py-buffer (or (org-babel-python-session-buffer session)
                           (org-babel-python-with-earmuffs session)))
-          (cmd (if (member system-type '(cygwin windows-nt ms-dos))
-                   (concat org-babel-python-command " -i")
-                 org-babel-python-command))
            (python-shell-buffer-name
            (org-babel-python-without-earmuffs py-buffer))
-           (existing-session-p (comint-check-proc py-buffer)))
-      (run-python cmd)
+           (existing-session-p (comint-check-proc py-buffer))
+           (cmd (org-babel-python--command t)))
+      (if cmd
+          (let* ((cmd-split (split-string-and-unquote cmd))
+                 (python-shell-interpreter (car cmd-split))
+                 (python-shell-interpreter-args
+                  (combine-and-quote-strings
+                   (append (cdr cmd-split)
+                           (when (member system-type
+                                         '(cygwin windows-nt ms-dos))
+                             (list "-i"))))))
+            (run-python))
+        (run-python))
       (with-current-buffer py-buffer
         (if existing-session-p
             ;; Session was created outside Org.  Assume first prompt
@@ -374,7 +414,7 @@ the last statement in BODY, as elisp.  If GRAPHICS-FILE is
 non-nil, then save graphical results to that file instead."
   (let ((raw
          (pcase result-type
-           (`output (org-babel-eval org-babel-python-command
+           (`output (org-babel-eval (org-babel-python--command nil)
                                    (concat preamble (and preamble "\n")
                                             (if graphics-file
                                                 (format 
org-babel-python--output-graphics-wrapper
@@ -382,8 +422,7 @@ non-nil, then save graphical results to that file instead."
                                               body))))
            (`value (let ((results-file (or graphics-file
                                           (org-babel-temp-file "python-"))))
-                    (org-babel-eval
-                     org-babel-python-command
+                    (org-babel-eval (org-babel-python--command nil)
                      (concat
                       preamble (and preamble "\n")
                       (format

Reply via email to