]> code.delx.au - gnu-emacs/blobdiff - lisp/org/ob-python.el
merge trunk
[gnu-emacs] / lisp / org / ob-python.el
index 0fe0b4fefd8358a17c61de55ac9ac301ae7d0ee3..79cc53ea0fa8dc1c7b7f0061fd7092d2d9e0b9a3 100644 (file)
@@ -1,11 +1,11 @@
 ;;; ob-python.el --- org-babel functions for python evaluation
 
-;; Copyright (C) 2009, 2010  Free Software Foundation
+;; Copyright (C) 2009-2013 Free Software Foundation, Inc.
 
-;; Author: Eric Schulte, Dan Davison
+;; Authors: Eric Schulte
+;;      Dan Davison
 ;; Keywords: literate programming, reproducible research
 ;; Homepage: http://orgmode.org
-;; Version: 7.7
 
 ;; This file is part of GNU Emacs.
 
@@ -44,7 +44,7 @@
 (defvar org-babel-default-header-args:python '())
 
 (defvar org-babel-python-command "python"
-  "Name of command for executing python code.")
+  "Name of the command for executing Python code.")
 
 (defvar org-babel-python-mode (if (featurep 'xemacs) 'python-mode 'python)
   "Preferred python mode for use in running python interactively.
@@ -64,7 +64,7 @@ This function is called by `org-babel-execute-src-block'."
         (preamble (cdr (assoc :preamble params)))
          (full-body
          (org-babel-expand-body:generic
-          (concat body (if return-val (format "return %s" return-val) ""))
+          (concat body (if return-val (format "\nreturn %s" return-val) ""))
           params (org-babel-variable-assignments:python params)))
          (result (org-babel-python-evaluate
                  session full-body result-type result-params preamble)))
@@ -99,7 +99,7 @@ VARS contains resolved variable references"
 ;; helper functions
 
 (defun org-babel-variable-assignments:python (params)
-  "Return list of python statements assigning the block's variables"
+  "Return a list of Python statements assigning the block's variables."
   (mapcar
    (lambda (pair)
      (format "%s=%s"
@@ -143,7 +143,9 @@ then create.  Return the initialized session."
       (cond
        ((and (eq 'python org-babel-python-mode)
             (fboundp 'run-python)) ; python.el
-       (run-python))
+       (if (version< "24.1" emacs-version)
+           (run-python org-babel-python-command)
+         (run-python)))
        ((and (eq 'python-mode org-babel-python-mode)
             (fboundp 'py-shell)) ; python-mode.el
        ;; Make sure that py-which-bufname is initialized, as otherwise
@@ -160,7 +162,7 @@ then create.  Return the initialized session."
          (py-shell)
          (setq python-buffer (concat "*" bufname "*"))))
        (t
-       (error "No function available for running an inferior python.")))
+       (error "No function available for running an inferior Python")))
       (setq org-babel-python-buffers
            (cons (cons session python-buffer)
                  (assq-delete-all session org-babel-python-buffers)))
@@ -190,7 +192,7 @@ open('%s', 'w').write( pprint.pformat(main()) )")
 
 (defun org-babel-python-evaluate
   (session body &optional result-type result-params preamble)
-  "Evaluate BODY as python code."
+  "Evaluate BODY as Python code."
   (if session
       (org-babel-python-evaluate-session
        session body result-type result-params)
@@ -201,7 +203,7 @@ open('%s', 'w').write( pprint.pformat(main()) )")
   (body &optional result-type result-params preamble)
   "Evaluate BODY in external python process.
 If RESULT-TYPE equals 'output then return standard output as a
-string. If RESULT-TYPE equals 'value then return the value of the
+string.  If RESULT-TYPE equals 'value then return the value of the
 last statement in BODY, as elisp."
   ((lambda (raw)
      (if (or (member "code" result-params)
@@ -236,24 +238,25 @@ last statement in BODY, as elisp."
   (session body &optional result-type result-params)
   "Pass BODY to the Python process in SESSION.
 If RESULT-TYPE equals 'output then return standard output as a
-string. If RESULT-TYPE equals 'value then return the value of the
+string.  If RESULT-TYPE equals 'value then return the value of the
 last statement in BODY, as elisp."
-  (flet ((send-wait () (comint-send-input nil t) (sleep-for 0 5))
+  (let* ((send-wait (lambda () (comint-send-input nil t) (sleep-for 0 5)))
         (dump-last-value
-         (tmp-file pp)
-         (mapc
-          (lambda (statement) (insert statement) (send-wait))
-          (if pp
-              (list
-               "import pprint"
-               (format "open('%s', 'w').write(pprint.pformat(_))"
-                       (org-babel-process-file-name tmp-file 'noquote)))
-            (list (format "open('%s', 'w').write(str(_))"
-                          (org-babel-process-file-name tmp-file 'noquote))))))
-        (input-body (body)
-                    (mapc (lambda (line) (insert line) (send-wait))
-                          (split-string body "[\r\n]"))
-                    (send-wait)))
+         (lambda
+           (tmp-file pp)
+           (mapc
+            (lambda (statement) (insert statement) (funcall send-wait))
+            (if pp
+                (list
+                 "import pprint"
+                 (format "open('%s', 'w').write(pprint.pformat(_))"
+                         (org-babel-process-file-name tmp-file 'noquote)))
+              (list (format "open('%s', 'w').write(str(_))"
+                            (org-babel-process-file-name tmp-file 'noquote)))))))
+        (input-body (lambda (body)
+                      (mapc (lambda (line) (insert line) (funcall send-wait))
+                            (split-string body "[\r\n]"))
+                      (funcall send-wait))))
     ((lambda (results)
        (unless (string= (substring org-babel-python-eoe-indicator 1 -1) results)
         (if (or (member "code" result-params)
@@ -269,31 +272,31 @@ last statement in BODY, as elisp."
         (butlast
          (org-babel-comint-with-output
              (session org-babel-python-eoe-indicator t body)
-           (input-body body)
-           (send-wait) (send-wait)
+           (funcall input-body body)
+           (funcall send-wait) (funcall send-wait)
            (insert org-babel-python-eoe-indicator)
-           (send-wait))
+           (funcall send-wait))
          2) "\n"))
        (value
        (let ((tmp-file (org-babel-temp-file "python-")))
          (org-babel-comint-with-output
              (session org-babel-python-eoe-indicator nil body)
            (let ((comint-process-echoes nil))
-             (input-body body)
-             (dump-last-value tmp-file (member "pp" result-params))
-             (send-wait) (send-wait)
+             (funcall input-body body)
+             (funcall dump-last-value tmp-file (member "pp" result-params))
+             (funcall send-wait) (funcall send-wait)
              (insert org-babel-python-eoe-indicator)
-             (send-wait)))
+             (funcall send-wait)))
          (org-babel-eval-read-file tmp-file)))))))
 
 (defun org-babel-python-read-string (string)
-  "Strip 's from around python string"
+  "Strip 's from around Python string."
   (if (string-match "^'\\([^\000]+\\)'$" string)
       (match-string 1 string)
     string))
 
 (provide 'ob-python)
 
-;; arch-tag: f19b6c3d-dfcb-4a1a-9ce0-45ade1ebc212
+
 
 ;;; ob-python.el ends here