aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/org/ob-python.el
diff options
context:
space:
mode:
authorCarsten Dominik2010-11-11 22:10:19 -0600
committerCarsten Dominik2010-11-11 22:10:19 -0600
commitafe98dfa700de5cf0493e8bf95b7d894e2734e47 (patch)
tree92a812b353bb09c1286e8a44fb552de9f1af3384 /lisp/org/ob-python.el
parentdf26e1f58a7e484b7ed500ea48d0e1c49345ffbf (diff)
downloademacs-afe98dfa700de5cf0493e8bf95b7d894e2734e47.tar.gz
emacs-afe98dfa700de5cf0493e8bf95b7d894e2734e47.zip
Install org-mode version 7.3
Diffstat (limited to 'lisp/org/ob-python.el')
-rw-r--r--lisp/org/ob-python.el208
1 files changed, 110 insertions, 98 deletions
diff --git a/lisp/org/ob-python.el b/lisp/org/ob-python.el
index c082188bea7..5aaa1059a47 100644
--- a/lisp/org/ob-python.el
+++ b/lisp/org/ob-python.el
@@ -5,7 +5,7 @@
5;; Author: Eric Schulte, Dan Davison 5;; Author: Eric Schulte, Dan Davison
6;; Keywords: literate programming, reproducible research 6;; Keywords: literate programming, reproducible research
7;; Homepage: http://orgmode.org 7;; Homepage: http://orgmode.org
8;; Version: 7.01 8;; Version: 7.3
9 9
10;; This file is part of GNU Emacs. 10;; This file is part of GNU Emacs.
11 11
@@ -47,46 +47,34 @@
47(defvar org-babel-python-mode (if (featurep 'xemacs) 'python-mode 'python) 47(defvar org-babel-python-mode (if (featurep 'xemacs) 'python-mode 'python)
48 "Preferred python mode for use in running python interactively.") 48 "Preferred python mode for use in running python interactively.")
49 49
50(defun org-babel-expand-body:python (body params &optional processed-params) 50(defvar org-src-preserve-indentation)
51 "Expand BODY according to PARAMS, return the expanded body."
52 (concat
53 (mapconcat ;; define any variables
54 (lambda (pair)
55 (format "%s=%s"
56 (car pair)
57 (org-babel-python-var-to-python (cdr pair))))
58 (nth 1 (or processed-params (org-babel-process-params params))) "\n")
59 "\n" (org-babel-trim body) "\n"))
60 51
61(defun org-babel-execute:python (body params) 52(defun org-babel-execute:python (body params)
62 "Execute a block of Python code with Babel. 53 "Execute a block of Python code with Babel.
63This function is called by `org-babel-execute-src-block'." 54This function is called by `org-babel-execute-src-block'."
64 (let* ((processed-params (org-babel-process-params params)) 55 (let* ((session (org-babel-python-initiate-session
65 (session (org-babel-python-initiate-session (first processed-params))) 56 (cdr (assoc :session params))))
66 (result-params (nth 2 processed-params)) 57 (result-params (cdr (assoc :result-params params)))
67 (result-type (nth 3 processed-params)) 58 (result-type (cdr (assoc :result-type params)))
68 (full-body (org-babel-expand-body:python 59 (full-body
69 body params processed-params)) 60 (org-babel-expand-body:generic
61 body params (org-babel-variable-assignments:python params)))
70 (result (org-babel-python-evaluate 62 (result (org-babel-python-evaluate
71 session full-body result-type result-params))) 63 session full-body result-type result-params)))
72 (or (cdr (assoc :file params)) 64 (or (cdr (assoc :file params))
73 (org-babel-reassemble-table 65 (org-babel-reassemble-table
74 result 66 result
75 (org-babel-pick-name (nth 4 processed-params) 67 (org-babel-pick-name (cdr (assoc :colname-names params))
76 (cdr (assoc :colnames params))) 68 (cdr (assoc :colnames params)))
77 (org-babel-pick-name (nth 5 processed-params) 69 (org-babel-pick-name (cdr (assoc :rowname-names params))
78 (cdr (assoc :rownames params))))))) 70 (cdr (assoc :rownames params)))))))
79 71
80(defun org-babel-prep-session:python (session params) 72(defun org-babel-prep-session:python (session params)
81 "Prepare SESSION according to the header arguments in PARAMS." 73 "Prepare SESSION according to the header arguments in PARAMS.
74VARS contains resolved variable references"
82 (let* ((session (org-babel-python-initiate-session session)) 75 (let* ((session (org-babel-python-initiate-session session))
83 (vars (org-babel-ref-variables params)) 76 (var-lines
84 (var-lines (mapcar ;; define any variables 77 (org-babel-variable-assignments:python params)))
85 (lambda (pair)
86 (format "%s=%s"
87 (car pair)
88 (org-babel-python-var-to-python (cdr pair))))
89 vars)))
90 (org-babel-comint-in-buffer session 78 (org-babel-comint-in-buffer session
91 (mapc (lambda (var) 79 (mapc (lambda (var)
92 (end-of-line 1) (insert var) (comint-send-input) 80 (end-of-line 1) (insert var) (comint-send-input)
@@ -104,6 +92,15 @@ This function is called by `org-babel-execute-src-block'."
104 92
105;; helper functions 93;; helper functions
106 94
95(defun org-babel-variable-assignments:python (params)
96 "Return list of python statements assigning the block's variables"
97 (mapcar
98 (lambda (pair)
99 (format "%s=%s"
100 (car pair)
101 (org-babel-python-var-to-python (cdr pair))))
102 (mapcar #'cdr (org-babel-get-header params :var))))
103
107(defun org-babel-python-var-to-python (var) 104(defun org-babel-python-var-to-python (var)
108 "Convert an elisp value to a python variable. 105 "Convert an elisp value to a python variable.
109Convert an elisp value, VAR, into a string of python source code 106Convert an elisp value, VAR, into a string of python source code
@@ -125,8 +122,7 @@ Emacs-lisp table, otherwise return the results as a string."
125 (mapcar (lambda (el) (if (equal el 'None) 'hline el)) res) 122 (mapcar (lambda (el) (if (equal el 'None) 'hline el)) res)
126 res)) 123 res))
127 (org-babel-read 124 (org-babel-read
128 (if (or (string-match "^\\[.+\\]$" results) 125 (if (and (stringp results) (string-match "^[([].+[])]$" results))
129 (string-match "^(.+)$" results))
130 (org-babel-read 126 (org-babel-read
131 (concat "'" 127 (concat "'"
132 (replace-regexp-in-string 128 (replace-regexp-in-string
@@ -151,10 +147,10 @@ then create. Return the initialized session."
151 (let* ((session (if session (intern session) :default)) 147 (let* ((session (if session (intern session) :default))
152 (python-buffer (org-babel-python-session-buffer session))) 148 (python-buffer (org-babel-python-session-buffer session)))
153 (cond 149 (cond
154 ((and (equal 'python org-babel-python-mode) 150 ((and (eq 'python org-babel-python-mode)
155 (fboundp 'run-python)) ; python.el 151 (fboundp 'run-python)) ; python.el
156 (run-python)) 152 (run-python))
157 ((and (equal 'python-mode org-babel-python-mode) 153 ((and (eq 'python-mode org-babel-python-mode)
158 (fboundp 'py-shell)) ; python-mode.el 154 (fboundp 'py-shell)) ; python-mode.el
159 ;; `py-shell' creates a buffer whose name is the value of 155 ;; `py-shell' creates a buffer whose name is the value of
160 ;; `py-which-bufname' with '*'s at the beginning and end 156 ;; `py-which-bufname' with '*'s at the beginning and end
@@ -195,73 +191,89 @@ def main():
195open('%s', 'w').write( pprint.pformat(main()) )") 191open('%s', 'w').write( pprint.pformat(main()) )")
196 192
197(defun org-babel-python-evaluate 193(defun org-babel-python-evaluate
198 (buffer body &optional result-type result-params) 194 (session body &optional result-type result-params)
199 "Pass BODY to the Python process in BUFFER. 195 "Evaluate BODY as python code."
200If RESULT-TYPE equals 'output then return a list of the outputs 196 (if session
201of the statements in BODY, if RESULT-TYPE equals 'value then 197 (org-babel-python-evaluate-session
202return the value of the last statement in BODY, as elisp." 198 session body result-type result-params)
203 (if (not buffer) 199 (org-babel-python-evaluate-external-process
204 ;; external process evaluation 200 body result-type result-params)))
205 (case result-type 201
206 (output (org-babel-eval org-babel-python-command body)) 202(defun org-babel-python-evaluate-external-process
207 (value (let ((tmp-file (make-temp-file "org-babel-python-results-"))) 203 (body &optional result-type result-params)
208 (org-babel-eval org-babel-python-command 204 "Evaluate BODY in external python process.
209 (format 205If RESULT-TYPE equals 'output then return standard output as a
210 (if (member "pp" result-params) 206string. If RESULT-TYPE equals 'value then return the value of the
211 org-babel-python-pp-wrapper-method 207last statement in BODY, as elisp."
212 org-babel-python-wrapper-method) 208 (case result-type
213 (mapconcat 209 (output (org-babel-eval org-babel-python-command body))
214 (lambda (line) (format "\t%s" line)) 210 (value (let ((tmp-file (org-babel-temp-file "python-")))
215 (split-string 211 (org-babel-eval org-babel-python-command
216 (org-remove-indentation 212 (format
217 (org-babel-trim body)) 213 (if (member "pp" result-params)
218 "[\r\n]") "\n") 214 org-babel-python-pp-wrapper-method
219 tmp-file)) 215 org-babel-python-wrapper-method)
220 ((lambda (raw) 216 (mapconcat
221 (if (or (member "code" result-params) 217 (lambda (line) (format "\t%s" line))
222 (member "pp" result-params)) 218 (split-string
223 raw 219 (org-remove-indentation
224 (org-babel-python-table-or-string raw))) 220 (org-babel-trim body))
225 (org-babel-eval-read-file tmp-file))))) 221 "[\r\n]") "\n")
226 ;; comint session evaluation 222 (org-babel-process-file-name tmp-file 'noquote)))
227 (flet ((dump-last-value (tmp-file pp) 223 ((lambda (raw)
228 (mapc 224 (if (or (member "code" result-params)
229 (lambda (statement) (insert statement) (comint-send-input)) 225 (member "pp" result-params))
230 (if pp 226 raw
231 (list 227 (org-babel-python-table-or-string raw)))
232 "import pp" 228 (org-babel-eval-read-file tmp-file))))))
233 (format "open('%s', 'w').write(pprint.pformat(_))" tmp-file)) 229
234 (list (format "open('%s', 'w').write(str(_))" tmp-file))))) 230(defun org-babel-python-evaluate-session
235 (input-body (body) 231 (session body &optional result-type result-params)
236 (mapc (lambda (statement) (insert statement) (comint-send-input)) 232 "Pass BODY to the Python process in SESSION.
237 (split-string (org-babel-trim body) "[\r\n]+")) 233If RESULT-TYPE equals 'output then return standard output as a
238 (comint-send-input) (comint-send-input))) 234string. If RESULT-TYPE equals 'value then return the value of the
239 (case result-type 235last statement in BODY, as elisp."
240 (output 236 (flet ((dump-last-value
241 (mapconcat 237 (tmp-file pp)
242 #'org-babel-trim 238 (mapc
243 (butlast 239 (lambda (statement) (insert statement) (comint-send-input))
244 (org-babel-comint-with-output 240 (if pp
245 (buffer org-babel-python-eoe-indicator t body) 241 (list
246 (let ((comint-process-echoes nil)) 242 "import pp"
247 (input-body body) 243 (format "open('%s', 'w').write(pprint.pformat(_))"
248 (insert org-babel-python-eoe-indicator) 244 (org-babel-process-file-name tmp-file 'noquote)))
249 (comint-send-input))) 2) "\n")) 245 (list (format "open('%s', 'w').write(str(_))"
250 (value 246 (org-babel-process-file-name tmp-file 'noquote))))))
251 ((lambda (results) 247 (input-body (body)
252 (if (or (member "code" result-params) (member "pp" result-params)) 248 (mapc (lambda (statement) (insert statement) (comint-send-input))
253 results 249 (split-string (org-babel-trim body) "[\r\n]+"))
254 (org-babel-python-table-or-string results))) 250 (comint-send-input) (comint-send-input)))
255 (let ((tmp-file (make-temp-file "org-babel-python-results-"))) 251 (case result-type
256 (org-babel-comint-with-output 252 (output
257 (buffer org-babel-python-eoe-indicator t body) 253 (mapconcat
258 (let ((comint-process-echoes nil)) 254 #'org-babel-trim
259 (input-body body) 255 (butlast
260 (dump-last-value tmp-file (member "pp" result-params)) 256 (org-babel-comint-with-output
261 (comint-send-input) (comint-send-input) 257 (session org-babel-python-eoe-indicator t body)
262 (insert org-babel-python-eoe-indicator) 258 (let ((comint-process-echoes nil))
263 (comint-send-input))) 259 (input-body body)
264 (org-babel-eval-read-file tmp-file)))))))) 260 (insert org-babel-python-eoe-indicator)
261 (comint-send-input))) 2) "\n"))
262 (value
263 ((lambda (results)
264 (if (or (member "code" result-params) (member "pp" result-params))
265 results
266 (org-babel-python-table-or-string results)))
267 (let ((tmp-file (org-babel-temp-file "python-")))
268 (org-babel-comint-with-output
269 (session org-babel-python-eoe-indicator t body)
270 (let ((comint-process-echoes nil))
271 (input-body body)
272 (dump-last-value tmp-file (member "pp" result-params))
273 (comint-send-input) (comint-send-input)
274 (insert org-babel-python-eoe-indicator)
275 (comint-send-input)))
276 (org-babel-eval-read-file tmp-file)))))))
265 277
266(defun org-babel-python-read-string (string) 278(defun org-babel-python-read-string (string)
267 "Strip 's from around python string" 279 "Strip 's from around python string"