##// END OF EJS Templates
Move skip_doctest decorator to separate module, so that it can be used without triggering other imports.
Thomas Kluyver -
Show More
@@ -0,0 +1,15 b''
1 """This decorator marks that a doctest should be skipped.
2
3 The IPython.testing.decorators module triggers various extra imports, including
4 numpy and sympy if they're present. Since this decorator is used in core parts
5 of IPython, it's in a separate module so that running IPython doesn't trigger
6 those imports."""
7
8 def skip_doctest(f):
9 """Decorator - mark a function or method for skipping its doctest.
10
11 This decorator allows you to mark a function whose docstring you wish to
12 omit from testing, while preserving the docstring for introspection, help,
13 etc."""
14 f.skip_doctest = True
15 return f
@@ -1,802 +1,802 b''
1 """ History related magics and functionality """
1 """ History related magics and functionality """
2 #-----------------------------------------------------------------------------
2 #-----------------------------------------------------------------------------
3 # Copyright (C) 2010 The IPython Development Team.
3 # Copyright (C) 2010 The IPython Development Team.
4 #
4 #
5 # Distributed under the terms of the BSD License.
5 # Distributed under the terms of the BSD License.
6 #
6 #
7 # The full license is in the file COPYING.txt, distributed with this software.
7 # The full license is in the file COPYING.txt, distributed with this software.
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9
9
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Imports
11 # Imports
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 from __future__ import print_function
13 from __future__ import print_function
14
14
15 # Stdlib imports
15 # Stdlib imports
16 import atexit
16 import atexit
17 import datetime
17 import datetime
18 import os
18 import os
19 import re
19 import re
20 import sqlite3
20 import sqlite3
21 import threading
21 import threading
22
22
23 # Our own packages
23 # Our own packages
24 from IPython.config.configurable import Configurable
24 from IPython.config.configurable import Configurable
25
25
26 from IPython.testing import decorators as testdec
26 from IPython.testing.skipdoctest import skip_doctest
27 from IPython.utils import io
27 from IPython.utils import io
28 from IPython.utils.traitlets import Bool, Dict, Instance, Int, List, Unicode
28 from IPython.utils.traitlets import Bool, Dict, Instance, Int, List, Unicode
29 from IPython.utils.warn import warn
29 from IPython.utils.warn import warn
30
30
31 #-----------------------------------------------------------------------------
31 #-----------------------------------------------------------------------------
32 # Classes and functions
32 # Classes and functions
33 #-----------------------------------------------------------------------------
33 #-----------------------------------------------------------------------------
34
34
35 class HistoryManager(Configurable):
35 class HistoryManager(Configurable):
36 """A class to organize all history-related functionality in one place.
36 """A class to organize all history-related functionality in one place.
37 """
37 """
38 # Public interface
38 # Public interface
39
39
40 # An instance of the IPython shell we are attached to
40 # An instance of the IPython shell we are attached to
41 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
41 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
42 # Lists to hold processed and raw history. These start with a blank entry
42 # Lists to hold processed and raw history. These start with a blank entry
43 # so that we can index them starting from 1
43 # so that we can index them starting from 1
44 input_hist_parsed = List([""])
44 input_hist_parsed = List([""])
45 input_hist_raw = List([""])
45 input_hist_raw = List([""])
46 # A list of directories visited during session
46 # A list of directories visited during session
47 dir_hist = List()
47 dir_hist = List()
48 def _dir_hist_default(self):
48 def _dir_hist_default(self):
49 try:
49 try:
50 return [os.getcwd()]
50 return [os.getcwd()]
51 except OSError:
51 except OSError:
52 return []
52 return []
53
53
54 # A dict of output history, keyed with ints from the shell's
54 # A dict of output history, keyed with ints from the shell's
55 # execution count.
55 # execution count.
56 output_hist = Dict()
56 output_hist = Dict()
57 # The text/plain repr of outputs.
57 # The text/plain repr of outputs.
58 output_hist_reprs = Dict()
58 output_hist_reprs = Dict()
59
59
60 # String holding the path to the history file
60 # String holding the path to the history file
61 hist_file = Unicode(config=True)
61 hist_file = Unicode(config=True)
62
62
63 # The SQLite database
63 # The SQLite database
64 db = Instance(sqlite3.Connection)
64 db = Instance(sqlite3.Connection)
65 # The number of the current session in the history database
65 # The number of the current session in the history database
66 session_number = Int()
66 session_number = Int()
67 # Should we log output to the database? (default no)
67 # Should we log output to the database? (default no)
68 db_log_output = Bool(False, config=True)
68 db_log_output = Bool(False, config=True)
69 # Write to database every x commands (higher values save disk access & power)
69 # Write to database every x commands (higher values save disk access & power)
70 # Values of 1 or less effectively disable caching.
70 # Values of 1 or less effectively disable caching.
71 db_cache_size = Int(0, config=True)
71 db_cache_size = Int(0, config=True)
72 # The input and output caches
72 # The input and output caches
73 db_input_cache = List()
73 db_input_cache = List()
74 db_output_cache = List()
74 db_output_cache = List()
75
75
76 # History saving in separate thread
76 # History saving in separate thread
77 save_thread = Instance('IPython.core.history.HistorySavingThread')
77 save_thread = Instance('IPython.core.history.HistorySavingThread')
78 # N.B. Event is a function returning an instance of _Event.
78 # N.B. Event is a function returning an instance of _Event.
79 save_flag = Instance(threading._Event)
79 save_flag = Instance(threading._Event)
80
80
81 # Private interface
81 # Private interface
82 # Variables used to store the three last inputs from the user. On each new
82 # Variables used to store the three last inputs from the user. On each new
83 # history update, we populate the user's namespace with these, shifted as
83 # history update, we populate the user's namespace with these, shifted as
84 # necessary.
84 # necessary.
85 _i00 = Unicode(u'')
85 _i00 = Unicode(u'')
86 _i = Unicode(u'')
86 _i = Unicode(u'')
87 _ii = Unicode(u'')
87 _ii = Unicode(u'')
88 _iii = Unicode(u'')
88 _iii = Unicode(u'')
89
89
90 # A regex matching all forms of the exit command, so that we don't store
90 # A regex matching all forms of the exit command, so that we don't store
91 # them in the history (it's annoying to rewind the first entry and land on
91 # them in the history (it's annoying to rewind the first entry and land on
92 # an exit call).
92 # an exit call).
93 _exit_re = re.compile(r"(exit|quit)(\s*\(.*\))?$")
93 _exit_re = re.compile(r"(exit|quit)(\s*\(.*\))?$")
94
94
95 def __init__(self, shell, config=None, **traits):
95 def __init__(self, shell, config=None, **traits):
96 """Create a new history manager associated with a shell instance.
96 """Create a new history manager associated with a shell instance.
97 """
97 """
98 # We need a pointer back to the shell for various tasks.
98 # We need a pointer back to the shell for various tasks.
99 super(HistoryManager, self).__init__(shell=shell, config=config,
99 super(HistoryManager, self).__init__(shell=shell, config=config,
100 **traits)
100 **traits)
101
101
102 if self.hist_file == u'':
102 if self.hist_file == u'':
103 # No one has set the hist_file, yet.
103 # No one has set the hist_file, yet.
104 if shell.profile:
104 if shell.profile:
105 histfname = 'history-%s' % shell.profile
105 histfname = 'history-%s' % shell.profile
106 else:
106 else:
107 histfname = 'history'
107 histfname = 'history'
108 self.hist_file = os.path.join(shell.ipython_dir, histfname + '.sqlite')
108 self.hist_file = os.path.join(shell.ipython_dir, histfname + '.sqlite')
109
109
110 try:
110 try:
111 self.init_db()
111 self.init_db()
112 except sqlite3.DatabaseError:
112 except sqlite3.DatabaseError:
113 if os.path.isfile(self.hist_file):
113 if os.path.isfile(self.hist_file):
114 # Try to move the file out of the way.
114 # Try to move the file out of the way.
115 newpath = os.path.join(self.shell.ipython_dir, "hist-corrupt.sqlite")
115 newpath = os.path.join(self.shell.ipython_dir, "hist-corrupt.sqlite")
116 os.rename(self.hist_file, newpath)
116 os.rename(self.hist_file, newpath)
117 print("ERROR! History file wasn't a valid SQLite database.",
117 print("ERROR! History file wasn't a valid SQLite database.",
118 "It was moved to %s" % newpath, "and a new file created.")
118 "It was moved to %s" % newpath, "and a new file created.")
119 self.init_db()
119 self.init_db()
120 else:
120 else:
121 # The hist_file is probably :memory: or something else.
121 # The hist_file is probably :memory: or something else.
122 raise
122 raise
123
123
124 self.save_flag = threading.Event()
124 self.save_flag = threading.Event()
125 self.db_input_cache_lock = threading.Lock()
125 self.db_input_cache_lock = threading.Lock()
126 self.db_output_cache_lock = threading.Lock()
126 self.db_output_cache_lock = threading.Lock()
127 self.save_thread = HistorySavingThread(self)
127 self.save_thread = HistorySavingThread(self)
128 self.save_thread.start()
128 self.save_thread.start()
129
129
130 self.new_session()
130 self.new_session()
131
131
132
132
133 def init_db(self):
133 def init_db(self):
134 """Connect to the database, and create tables if necessary."""
134 """Connect to the database, and create tables if necessary."""
135 self.db = sqlite3.connect(self.hist_file)
135 self.db = sqlite3.connect(self.hist_file)
136 self.db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
136 self.db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
137 primary key autoincrement, start timestamp,
137 primary key autoincrement, start timestamp,
138 end timestamp, num_cmds integer, remark text)""")
138 end timestamp, num_cmds integer, remark text)""")
139 self.db.execute("""CREATE TABLE IF NOT EXISTS history
139 self.db.execute("""CREATE TABLE IF NOT EXISTS history
140 (session integer, line integer, source text, source_raw text,
140 (session integer, line integer, source text, source_raw text,
141 PRIMARY KEY (session, line))""")
141 PRIMARY KEY (session, line))""")
142 # Output history is optional, but ensure the table's there so it can be
142 # Output history is optional, but ensure the table's there so it can be
143 # enabled later.
143 # enabled later.
144 self.db.execute("""CREATE TABLE IF NOT EXISTS output_history
144 self.db.execute("""CREATE TABLE IF NOT EXISTS output_history
145 (session integer, line integer, output text,
145 (session integer, line integer, output text,
146 PRIMARY KEY (session, line))""")
146 PRIMARY KEY (session, line))""")
147 self.db.commit()
147 self.db.commit()
148
148
149 def new_session(self, conn=None):
149 def new_session(self, conn=None):
150 """Get a new session number."""
150 """Get a new session number."""
151 if conn is None:
151 if conn is None:
152 conn = self.db
152 conn = self.db
153
153
154 with conn:
154 with conn:
155 cur = conn.execute("""INSERT INTO sessions VALUES (NULL, ?, NULL,
155 cur = conn.execute("""INSERT INTO sessions VALUES (NULL, ?, NULL,
156 NULL, "") """, (datetime.datetime.now(),))
156 NULL, "") """, (datetime.datetime.now(),))
157 self.session_number = cur.lastrowid
157 self.session_number = cur.lastrowid
158
158
159 def end_session(self):
159 def end_session(self):
160 """Close the database session, filling in the end time and line count."""
160 """Close the database session, filling in the end time and line count."""
161 self.writeout_cache()
161 self.writeout_cache()
162 with self.db:
162 with self.db:
163 self.db.execute("""UPDATE sessions SET end=?, num_cmds=? WHERE
163 self.db.execute("""UPDATE sessions SET end=?, num_cmds=? WHERE
164 session==?""", (datetime.datetime.now(),
164 session==?""", (datetime.datetime.now(),
165 len(self.input_hist_parsed)-1, self.session_number))
165 len(self.input_hist_parsed)-1, self.session_number))
166 self.session_number = 0
166 self.session_number = 0
167
167
168 def name_session(self, name):
168 def name_session(self, name):
169 """Give the current session a name in the history database."""
169 """Give the current session a name in the history database."""
170 with self.db:
170 with self.db:
171 self.db.execute("UPDATE sessions SET remark=? WHERE session==?",
171 self.db.execute("UPDATE sessions SET remark=? WHERE session==?",
172 (name, self.session_number))
172 (name, self.session_number))
173
173
174 def reset(self, new_session=True):
174 def reset(self, new_session=True):
175 """Clear the session history, releasing all object references, and
175 """Clear the session history, releasing all object references, and
176 optionally open a new session."""
176 optionally open a new session."""
177 self.output_hist.clear()
177 self.output_hist.clear()
178 # The directory history can't be completely empty
178 # The directory history can't be completely empty
179 self.dir_hist[:] = [os.getcwd()]
179 self.dir_hist[:] = [os.getcwd()]
180
180
181 if new_session:
181 if new_session:
182 if self.session_number:
182 if self.session_number:
183 self.end_session()
183 self.end_session()
184 self.input_hist_parsed[:] = [""]
184 self.input_hist_parsed[:] = [""]
185 self.input_hist_raw[:] = [""]
185 self.input_hist_raw[:] = [""]
186 self.new_session()
186 self.new_session()
187
187
188 ## -------------------------------
188 ## -------------------------------
189 ## Methods for retrieving history:
189 ## Methods for retrieving history:
190 ## -------------------------------
190 ## -------------------------------
191 def _run_sql(self, sql, params, raw=True, output=False):
191 def _run_sql(self, sql, params, raw=True, output=False):
192 """Prepares and runs an SQL query for the history database.
192 """Prepares and runs an SQL query for the history database.
193
193
194 Parameters
194 Parameters
195 ----------
195 ----------
196 sql : str
196 sql : str
197 Any filtering expressions to go after SELECT ... FROM ...
197 Any filtering expressions to go after SELECT ... FROM ...
198 params : tuple
198 params : tuple
199 Parameters passed to the SQL query (to replace "?")
199 Parameters passed to the SQL query (to replace "?")
200 raw, output : bool
200 raw, output : bool
201 See :meth:`get_range`
201 See :meth:`get_range`
202
202
203 Returns
203 Returns
204 -------
204 -------
205 Tuples as :meth:`get_range`
205 Tuples as :meth:`get_range`
206 """
206 """
207 toget = 'source_raw' if raw else 'source'
207 toget = 'source_raw' if raw else 'source'
208 sqlfrom = "history"
208 sqlfrom = "history"
209 if output:
209 if output:
210 sqlfrom = "history LEFT JOIN output_history USING (session, line)"
210 sqlfrom = "history LEFT JOIN output_history USING (session, line)"
211 toget = "history.%s, output_history.output" % toget
211 toget = "history.%s, output_history.output" % toget
212 cur = self.db.execute("SELECT session, line, %s FROM %s " %\
212 cur = self.db.execute("SELECT session, line, %s FROM %s " %\
213 (toget, sqlfrom) + sql, params)
213 (toget, sqlfrom) + sql, params)
214 if output: # Regroup into 3-tuples, and parse JSON
214 if output: # Regroup into 3-tuples, and parse JSON
215 return ((ses, lin, (inp, out)) for ses, lin, inp, out in cur)
215 return ((ses, lin, (inp, out)) for ses, lin, inp, out in cur)
216 return cur
216 return cur
217
217
218
218
219 def get_tail(self, n=10, raw=True, output=False, include_latest=False):
219 def get_tail(self, n=10, raw=True, output=False, include_latest=False):
220 """Get the last n lines from the history database.
220 """Get the last n lines from the history database.
221
221
222 Parameters
222 Parameters
223 ----------
223 ----------
224 n : int
224 n : int
225 The number of lines to get
225 The number of lines to get
226 raw, output : bool
226 raw, output : bool
227 See :meth:`get_range`
227 See :meth:`get_range`
228 include_latest : bool
228 include_latest : bool
229 If False (default), n+1 lines are fetched, and the latest one
229 If False (default), n+1 lines are fetched, and the latest one
230 is discarded. This is intended to be used where the function
230 is discarded. This is intended to be used where the function
231 is called by a user command, which it should not return.
231 is called by a user command, which it should not return.
232
232
233 Returns
233 Returns
234 -------
234 -------
235 Tuples as :meth:`get_range`
235 Tuples as :meth:`get_range`
236 """
236 """
237 self.writeout_cache()
237 self.writeout_cache()
238 if not include_latest:
238 if not include_latest:
239 n += 1
239 n += 1
240 cur = self._run_sql("ORDER BY session DESC, line DESC LIMIT ?",
240 cur = self._run_sql("ORDER BY session DESC, line DESC LIMIT ?",
241 (n,), raw=raw, output=output)
241 (n,), raw=raw, output=output)
242 if not include_latest:
242 if not include_latest:
243 return reversed(list(cur)[1:])
243 return reversed(list(cur)[1:])
244 return reversed(list(cur))
244 return reversed(list(cur))
245
245
246 def search(self, pattern="*", raw=True, search_raw=True,
246 def search(self, pattern="*", raw=True, search_raw=True,
247 output=False):
247 output=False):
248 """Search the database using unix glob-style matching (wildcards
248 """Search the database using unix glob-style matching (wildcards
249 * and ?).
249 * and ?).
250
250
251 Parameters
251 Parameters
252 ----------
252 ----------
253 pattern : str
253 pattern : str
254 The wildcarded pattern to match when searching
254 The wildcarded pattern to match when searching
255 search_raw : bool
255 search_raw : bool
256 If True, search the raw input, otherwise, the parsed input
256 If True, search the raw input, otherwise, the parsed input
257 raw, output : bool
257 raw, output : bool
258 See :meth:`get_range`
258 See :meth:`get_range`
259
259
260 Returns
260 Returns
261 -------
261 -------
262 Tuples as :meth:`get_range`
262 Tuples as :meth:`get_range`
263 """
263 """
264 tosearch = "source_raw" if search_raw else "source"
264 tosearch = "source_raw" if search_raw else "source"
265 if output:
265 if output:
266 tosearch = "history." + tosearch
266 tosearch = "history." + tosearch
267 self.writeout_cache()
267 self.writeout_cache()
268 return self._run_sql("WHERE %s GLOB ?" % tosearch, (pattern,),
268 return self._run_sql("WHERE %s GLOB ?" % tosearch, (pattern,),
269 raw=raw, output=output)
269 raw=raw, output=output)
270
270
271 def _get_range_session(self, start=1, stop=None, raw=True, output=False):
271 def _get_range_session(self, start=1, stop=None, raw=True, output=False):
272 """Get input and output history from the current session. Called by
272 """Get input and output history from the current session. Called by
273 get_range, and takes similar parameters."""
273 get_range, and takes similar parameters."""
274 input_hist = self.input_hist_raw if raw else self.input_hist_parsed
274 input_hist = self.input_hist_raw if raw else self.input_hist_parsed
275
275
276 n = len(input_hist)
276 n = len(input_hist)
277 if start < 0:
277 if start < 0:
278 start += n
278 start += n
279 if not stop:
279 if not stop:
280 stop = n
280 stop = n
281 elif stop < 0:
281 elif stop < 0:
282 stop += n
282 stop += n
283
283
284 for i in range(start, stop):
284 for i in range(start, stop):
285 if output:
285 if output:
286 line = (input_hist[i], self.output_hist_reprs.get(i))
286 line = (input_hist[i], self.output_hist_reprs.get(i))
287 else:
287 else:
288 line = input_hist[i]
288 line = input_hist[i]
289 yield (0, i, line)
289 yield (0, i, line)
290
290
291 def get_range(self, session=0, start=1, stop=None, raw=True,output=False):
291 def get_range(self, session=0, start=1, stop=None, raw=True,output=False):
292 """Retrieve input by session.
292 """Retrieve input by session.
293
293
294 Parameters
294 Parameters
295 ----------
295 ----------
296 session : int
296 session : int
297 Session number to retrieve. The current session is 0, and negative
297 Session number to retrieve. The current session is 0, and negative
298 numbers count back from current session, so -1 is previous session.
298 numbers count back from current session, so -1 is previous session.
299 start : int
299 start : int
300 First line to retrieve.
300 First line to retrieve.
301 stop : int
301 stop : int
302 End of line range (excluded from output itself). If None, retrieve
302 End of line range (excluded from output itself). If None, retrieve
303 to the end of the session.
303 to the end of the session.
304 raw : bool
304 raw : bool
305 If True, return untranslated input
305 If True, return untranslated input
306 output : bool
306 output : bool
307 If True, attempt to include output. This will be 'real' Python
307 If True, attempt to include output. This will be 'real' Python
308 objects for the current session, or text reprs from previous
308 objects for the current session, or text reprs from previous
309 sessions if db_log_output was enabled at the time. Where no output
309 sessions if db_log_output was enabled at the time. Where no output
310 is found, None is used.
310 is found, None is used.
311
311
312 Returns
312 Returns
313 -------
313 -------
314 An iterator over the desired lines. Each line is a 3-tuple, either
314 An iterator over the desired lines. Each line is a 3-tuple, either
315 (session, line, input) if output is False, or
315 (session, line, input) if output is False, or
316 (session, line, (input, output)) if output is True.
316 (session, line, (input, output)) if output is True.
317 """
317 """
318 if session == 0 or session==self.session_number: # Current session
318 if session == 0 or session==self.session_number: # Current session
319 return self._get_range_session(start, stop, raw, output)
319 return self._get_range_session(start, stop, raw, output)
320 if session < 0:
320 if session < 0:
321 session += self.session_number
321 session += self.session_number
322
322
323 if stop:
323 if stop:
324 lineclause = "line >= ? AND line < ?"
324 lineclause = "line >= ? AND line < ?"
325 params = (session, start, stop)
325 params = (session, start, stop)
326 else:
326 else:
327 lineclause = "line>=?"
327 lineclause = "line>=?"
328 params = (session, start)
328 params = (session, start)
329
329
330 return self._run_sql("WHERE session==? AND %s""" % lineclause,
330 return self._run_sql("WHERE session==? AND %s""" % lineclause,
331 params, raw=raw, output=output)
331 params, raw=raw, output=output)
332
332
333 def get_range_by_str(self, rangestr, raw=True, output=False):
333 def get_range_by_str(self, rangestr, raw=True, output=False):
334 """Get lines of history from a string of ranges, as used by magic
334 """Get lines of history from a string of ranges, as used by magic
335 commands %hist, %save, %macro, etc.
335 commands %hist, %save, %macro, etc.
336
336
337 Parameters
337 Parameters
338 ----------
338 ----------
339 rangestr : str
339 rangestr : str
340 A string specifying ranges, e.g. "5 ~2/1-4". See
340 A string specifying ranges, e.g. "5 ~2/1-4". See
341 :func:`magic_history` for full details.
341 :func:`magic_history` for full details.
342 raw, output : bool
342 raw, output : bool
343 As :meth:`get_range`
343 As :meth:`get_range`
344
344
345 Returns
345 Returns
346 -------
346 -------
347 Tuples as :meth:`get_range`
347 Tuples as :meth:`get_range`
348 """
348 """
349 for sess, s, e in extract_hist_ranges(rangestr):
349 for sess, s, e in extract_hist_ranges(rangestr):
350 for line in self.get_range(sess, s, e, raw=raw, output=output):
350 for line in self.get_range(sess, s, e, raw=raw, output=output):
351 yield line
351 yield line
352
352
353 ## ----------------------------
353 ## ----------------------------
354 ## Methods for storing history:
354 ## Methods for storing history:
355 ## ----------------------------
355 ## ----------------------------
356 def store_inputs(self, line_num, source, source_raw=None):
356 def store_inputs(self, line_num, source, source_raw=None):
357 """Store source and raw input in history and create input cache
357 """Store source and raw input in history and create input cache
358 variables _i*.
358 variables _i*.
359
359
360 Parameters
360 Parameters
361 ----------
361 ----------
362 line_num : int
362 line_num : int
363 The prompt number of this input.
363 The prompt number of this input.
364
364
365 source : str
365 source : str
366 Python input.
366 Python input.
367
367
368 source_raw : str, optional
368 source_raw : str, optional
369 If given, this is the raw input without any IPython transformations
369 If given, this is the raw input without any IPython transformations
370 applied to it. If not given, ``source`` is used.
370 applied to it. If not given, ``source`` is used.
371 """
371 """
372 if source_raw is None:
372 if source_raw is None:
373 source_raw = source
373 source_raw = source
374 source = source.rstrip('\n')
374 source = source.rstrip('\n')
375 source_raw = source_raw.rstrip('\n')
375 source_raw = source_raw.rstrip('\n')
376
376
377 # do not store exit/quit commands
377 # do not store exit/quit commands
378 if self._exit_re.match(source_raw.strip()):
378 if self._exit_re.match(source_raw.strip()):
379 return
379 return
380
380
381 self.input_hist_parsed.append(source)
381 self.input_hist_parsed.append(source)
382 self.input_hist_raw.append(source_raw)
382 self.input_hist_raw.append(source_raw)
383
383
384 with self.db_input_cache_lock:
384 with self.db_input_cache_lock:
385 self.db_input_cache.append((line_num, source, source_raw))
385 self.db_input_cache.append((line_num, source, source_raw))
386 # Trigger to flush cache and write to DB.
386 # Trigger to flush cache and write to DB.
387 if len(self.db_input_cache) >= self.db_cache_size:
387 if len(self.db_input_cache) >= self.db_cache_size:
388 self.save_flag.set()
388 self.save_flag.set()
389
389
390 # update the auto _i variables
390 # update the auto _i variables
391 self._iii = self._ii
391 self._iii = self._ii
392 self._ii = self._i
392 self._ii = self._i
393 self._i = self._i00
393 self._i = self._i00
394 self._i00 = source_raw
394 self._i00 = source_raw
395
395
396 # hackish access to user namespace to create _i1,_i2... dynamically
396 # hackish access to user namespace to create _i1,_i2... dynamically
397 new_i = '_i%s' % line_num
397 new_i = '_i%s' % line_num
398 to_main = {'_i': self._i,
398 to_main = {'_i': self._i,
399 '_ii': self._ii,
399 '_ii': self._ii,
400 '_iii': self._iii,
400 '_iii': self._iii,
401 new_i : self._i00 }
401 new_i : self._i00 }
402 self.shell.user_ns.update(to_main)
402 self.shell.user_ns.update(to_main)
403
403
404 def store_output(self, line_num):
404 def store_output(self, line_num):
405 """If database output logging is enabled, this saves all the
405 """If database output logging is enabled, this saves all the
406 outputs from the indicated prompt number to the database. It's
406 outputs from the indicated prompt number to the database. It's
407 called by run_cell after code has been executed.
407 called by run_cell after code has been executed.
408
408
409 Parameters
409 Parameters
410 ----------
410 ----------
411 line_num : int
411 line_num : int
412 The line number from which to save outputs
412 The line number from which to save outputs
413 """
413 """
414 if (not self.db_log_output) or (line_num not in self.output_hist_reprs):
414 if (not self.db_log_output) or (line_num not in self.output_hist_reprs):
415 return
415 return
416 output = self.output_hist_reprs[line_num]
416 output = self.output_hist_reprs[line_num]
417
417
418 with self.db_output_cache_lock:
418 with self.db_output_cache_lock:
419 self.db_output_cache.append((line_num, output))
419 self.db_output_cache.append((line_num, output))
420 if self.db_cache_size <= 1:
420 if self.db_cache_size <= 1:
421 self.save_flag.set()
421 self.save_flag.set()
422
422
423 def _writeout_input_cache(self, conn):
423 def _writeout_input_cache(self, conn):
424 with conn:
424 with conn:
425 for line in self.db_input_cache:
425 for line in self.db_input_cache:
426 conn.execute("INSERT INTO history VALUES (?, ?, ?, ?)",
426 conn.execute("INSERT INTO history VALUES (?, ?, ?, ?)",
427 (self.session_number,)+line)
427 (self.session_number,)+line)
428
428
429 def _writeout_output_cache(self, conn):
429 def _writeout_output_cache(self, conn):
430 with conn:
430 with conn:
431 for line in self.db_output_cache:
431 for line in self.db_output_cache:
432 conn.execute("INSERT INTO output_history VALUES (?, ?, ?)",
432 conn.execute("INSERT INTO output_history VALUES (?, ?, ?)",
433 (self.session_number,)+line)
433 (self.session_number,)+line)
434
434
435 def writeout_cache(self, conn=None):
435 def writeout_cache(self, conn=None):
436 """Write any entries in the cache to the database."""
436 """Write any entries in the cache to the database."""
437 if conn is None:
437 if conn is None:
438 conn = self.db
438 conn = self.db
439
439
440 with self.db_input_cache_lock:
440 with self.db_input_cache_lock:
441 try:
441 try:
442 self._writeout_input_cache(conn)
442 self._writeout_input_cache(conn)
443 except sqlite3.IntegrityError:
443 except sqlite3.IntegrityError:
444 self.new_session(conn)
444 self.new_session(conn)
445 print("ERROR! Session/line number was not unique in",
445 print("ERROR! Session/line number was not unique in",
446 "database. History logging moved to new session",
446 "database. History logging moved to new session",
447 self.session_number)
447 self.session_number)
448 try: # Try writing to the new session. If this fails, don't recurse
448 try: # Try writing to the new session. If this fails, don't recurse
449 self._writeout_input_cache(conn)
449 self._writeout_input_cache(conn)
450 except sqlite3.IntegrityError:
450 except sqlite3.IntegrityError:
451 pass
451 pass
452 finally:
452 finally:
453 self.db_input_cache = []
453 self.db_input_cache = []
454
454
455 with self.db_output_cache_lock:
455 with self.db_output_cache_lock:
456 try:
456 try:
457 self._writeout_output_cache(conn)
457 self._writeout_output_cache(conn)
458 except sqlite3.IntegrityError:
458 except sqlite3.IntegrityError:
459 print("!! Session/line number for output was not unique",
459 print("!! Session/line number for output was not unique",
460 "in database. Output will not be stored.")
460 "in database. Output will not be stored.")
461 finally:
461 finally:
462 self.db_output_cache = []
462 self.db_output_cache = []
463
463
464
464
465 class HistorySavingThread(threading.Thread):
465 class HistorySavingThread(threading.Thread):
466 """This thread takes care of writing history to the database, so that
466 """This thread takes care of writing history to the database, so that
467 the UI isn't held up while that happens.
467 the UI isn't held up while that happens.
468
468
469 It waits for the HistoryManager's save_flag to be set, then writes out
469 It waits for the HistoryManager's save_flag to be set, then writes out
470 the history cache. The main thread is responsible for setting the flag when
470 the history cache. The main thread is responsible for setting the flag when
471 the cache size reaches a defined threshold."""
471 the cache size reaches a defined threshold."""
472 daemon = True
472 daemon = True
473 stop_now = False
473 stop_now = False
474 def __init__(self, history_manager):
474 def __init__(self, history_manager):
475 super(HistorySavingThread, self).__init__()
475 super(HistorySavingThread, self).__init__()
476 self.history_manager = history_manager
476 self.history_manager = history_manager
477 atexit.register(self.stop)
477 atexit.register(self.stop)
478
478
479 def run(self):
479 def run(self):
480 # We need a separate db connection per thread:
480 # We need a separate db connection per thread:
481 try:
481 try:
482 self.db = sqlite3.connect(self.history_manager.hist_file)
482 self.db = sqlite3.connect(self.history_manager.hist_file)
483 while True:
483 while True:
484 self.history_manager.save_flag.wait()
484 self.history_manager.save_flag.wait()
485 if self.stop_now:
485 if self.stop_now:
486 return
486 return
487 self.history_manager.save_flag.clear()
487 self.history_manager.save_flag.clear()
488 self.history_manager.writeout_cache(self.db)
488 self.history_manager.writeout_cache(self.db)
489 except Exception as e:
489 except Exception as e:
490 print(("The history saving thread hit an unexpected error (%s)."
490 print(("The history saving thread hit an unexpected error (%s)."
491 "History will not be written to the database.") % repr(e))
491 "History will not be written to the database.") % repr(e))
492
492
493 def stop(self):
493 def stop(self):
494 """This can be called from the main thread to safely stop this thread.
494 """This can be called from the main thread to safely stop this thread.
495
495
496 Note that it does not attempt to write out remaining history before
496 Note that it does not attempt to write out remaining history before
497 exiting. That should be done by calling the HistoryManager's
497 exiting. That should be done by calling the HistoryManager's
498 end_session method."""
498 end_session method."""
499 self.stop_now = True
499 self.stop_now = True
500 self.history_manager.save_flag.set()
500 self.history_manager.save_flag.set()
501 self.join()
501 self.join()
502
502
503
503
504 # To match, e.g. ~5/8-~2/3
504 # To match, e.g. ~5/8-~2/3
505 range_re = re.compile(r"""
505 range_re = re.compile(r"""
506 ((?P<startsess>~?\d+)/)?
506 ((?P<startsess>~?\d+)/)?
507 (?P<start>\d+) # Only the start line num is compulsory
507 (?P<start>\d+) # Only the start line num is compulsory
508 ((?P<sep>[\-:])
508 ((?P<sep>[\-:])
509 ((?P<endsess>~?\d+)/)?
509 ((?P<endsess>~?\d+)/)?
510 (?P<end>\d+))?
510 (?P<end>\d+))?
511 $""", re.VERBOSE)
511 $""", re.VERBOSE)
512
512
513 def extract_hist_ranges(ranges_str):
513 def extract_hist_ranges(ranges_str):
514 """Turn a string of history ranges into 3-tuples of (session, start, stop).
514 """Turn a string of history ranges into 3-tuples of (session, start, stop).
515
515
516 Examples
516 Examples
517 --------
517 --------
518 list(extract_input_ranges("~8/5-~7/4 2"))
518 list(extract_input_ranges("~8/5-~7/4 2"))
519 [(-8, 5, None), (-7, 1, 4), (0, 2, 3)]
519 [(-8, 5, None), (-7, 1, 4), (0, 2, 3)]
520 """
520 """
521 for range_str in ranges_str.split():
521 for range_str in ranges_str.split():
522 rmatch = range_re.match(range_str)
522 rmatch = range_re.match(range_str)
523 if not rmatch:
523 if not rmatch:
524 continue
524 continue
525 start = int(rmatch.group("start"))
525 start = int(rmatch.group("start"))
526 end = rmatch.group("end")
526 end = rmatch.group("end")
527 end = int(end) if end else start+1 # If no end specified, get (a, a+1)
527 end = int(end) if end else start+1 # If no end specified, get (a, a+1)
528 if rmatch.group("sep") == "-": # 1-3 == 1:4 --> [1, 2, 3]
528 if rmatch.group("sep") == "-": # 1-3 == 1:4 --> [1, 2, 3]
529 end += 1
529 end += 1
530 startsess = rmatch.group("startsess") or "0"
530 startsess = rmatch.group("startsess") or "0"
531 endsess = rmatch.group("endsess") or startsess
531 endsess = rmatch.group("endsess") or startsess
532 startsess = int(startsess.replace("~","-"))
532 startsess = int(startsess.replace("~","-"))
533 endsess = int(endsess.replace("~","-"))
533 endsess = int(endsess.replace("~","-"))
534 assert endsess >= startsess
534 assert endsess >= startsess
535
535
536 if endsess == startsess:
536 if endsess == startsess:
537 yield (startsess, start, end)
537 yield (startsess, start, end)
538 continue
538 continue
539 # Multiple sessions in one range:
539 # Multiple sessions in one range:
540 yield (startsess, start, None)
540 yield (startsess, start, None)
541 for sess in range(startsess+1, endsess):
541 for sess in range(startsess+1, endsess):
542 yield (sess, 1, None)
542 yield (sess, 1, None)
543 yield (endsess, 1, end)
543 yield (endsess, 1, end)
544
544
545 def _format_lineno(session, line):
545 def _format_lineno(session, line):
546 """Helper function to format line numbers properly."""
546 """Helper function to format line numbers properly."""
547 if session == 0:
547 if session == 0:
548 return str(line)
548 return str(line)
549 return "%s#%s" % (session, line)
549 return "%s#%s" % (session, line)
550
550
551 @testdec.skip_doctest
551 @skip_doctest
552 def magic_history(self, parameter_s = ''):
552 def magic_history(self, parameter_s = ''):
553 """Print input history (_i<n> variables), with most recent last.
553 """Print input history (_i<n> variables), with most recent last.
554
554
555 %history -> print at most 40 inputs (some may be multi-line)\\
555 %history -> print at most 40 inputs (some may be multi-line)\\
556 %history n -> print at most n inputs\\
556 %history n -> print at most n inputs\\
557 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
557 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
558
558
559 By default, input history is printed without line numbers so it can be
559 By default, input history is printed without line numbers so it can be
560 directly pasted into an editor. Use -n to show them.
560 directly pasted into an editor. Use -n to show them.
561
561
562 Ranges of history can be indicated using the syntax:
562 Ranges of history can be indicated using the syntax:
563 4 : Line 4, current session
563 4 : Line 4, current session
564 4-6 : Lines 4-6, current session
564 4-6 : Lines 4-6, current session
565 243/1-5: Lines 1-5, session 243
565 243/1-5: Lines 1-5, session 243
566 ~2/7 : Line 7, session 2 before current
566 ~2/7 : Line 7, session 2 before current
567 ~8/1-~6/5 : From the first line of 8 sessions ago, to the fifth line
567 ~8/1-~6/5 : From the first line of 8 sessions ago, to the fifth line
568 of 6 sessions ago.
568 of 6 sessions ago.
569 Multiple ranges can be entered, separated by spaces
569 Multiple ranges can be entered, separated by spaces
570
570
571 The same syntax is used by %macro, %save, %edit, %rerun
571 The same syntax is used by %macro, %save, %edit, %rerun
572
572
573 Options:
573 Options:
574
574
575 -n: print line numbers for each input.
575 -n: print line numbers for each input.
576 This feature is only available if numbered prompts are in use.
576 This feature is only available if numbered prompts are in use.
577
577
578 -o: also print outputs for each input.
578 -o: also print outputs for each input.
579
579
580 -p: print classic '>>>' python prompts before each input. This is useful
580 -p: print classic '>>>' python prompts before each input. This is useful
581 for making documentation, and in conjunction with -o, for producing
581 for making documentation, and in conjunction with -o, for producing
582 doctest-ready output.
582 doctest-ready output.
583
583
584 -r: (default) print the 'raw' history, i.e. the actual commands you typed.
584 -r: (default) print the 'raw' history, i.e. the actual commands you typed.
585
585
586 -t: print the 'translated' history, as IPython understands it. IPython
586 -t: print the 'translated' history, as IPython understands it. IPython
587 filters your input and converts it all into valid Python source before
587 filters your input and converts it all into valid Python source before
588 executing it (things like magics or aliases are turned into function
588 executing it (things like magics or aliases are turned into function
589 calls, for example). With this option, you'll see the native history
589 calls, for example). With this option, you'll see the native history
590 instead of the user-entered version: '%cd /' will be seen as
590 instead of the user-entered version: '%cd /' will be seen as
591 'get_ipython().magic("%cd /")' instead of '%cd /'.
591 'get_ipython().magic("%cd /")' instead of '%cd /'.
592
592
593 -g: treat the arg as a pattern to grep for in (full) history.
593 -g: treat the arg as a pattern to grep for in (full) history.
594 This includes the saved history (almost all commands ever written).
594 This includes the saved history (almost all commands ever written).
595 Use '%hist -g' to show full saved history (may be very long).
595 Use '%hist -g' to show full saved history (may be very long).
596
596
597 -l: get the last n lines from all sessions. Specify n as a single arg, or
597 -l: get the last n lines from all sessions. Specify n as a single arg, or
598 the default is the last 10 lines.
598 the default is the last 10 lines.
599
599
600 -f FILENAME: instead of printing the output to the screen, redirect it to
600 -f FILENAME: instead of printing the output to the screen, redirect it to
601 the given file. The file is always overwritten, though IPython asks for
601 the given file. The file is always overwritten, though IPython asks for
602 confirmation first if it already exists.
602 confirmation first if it already exists.
603
603
604 Examples
604 Examples
605 --------
605 --------
606 ::
606 ::
607
607
608 In [6]: %hist -n 4 6
608 In [6]: %hist -n 4 6
609 4:a = 12
609 4:a = 12
610 5:print a**2
610 5:print a**2
611
611
612 """
612 """
613
613
614 if not self.shell.displayhook.do_full_cache:
614 if not self.shell.displayhook.do_full_cache:
615 print('This feature is only available if numbered prompts are in use.')
615 print('This feature is only available if numbered prompts are in use.')
616 return
616 return
617 opts,args = self.parse_options(parameter_s,'noprtglf:',mode='string')
617 opts,args = self.parse_options(parameter_s,'noprtglf:',mode='string')
618
618
619 # For brevity
619 # For brevity
620 history_manager = self.shell.history_manager
620 history_manager = self.shell.history_manager
621
621
622 def _format_lineno(session, line):
622 def _format_lineno(session, line):
623 """Helper function to format line numbers properly."""
623 """Helper function to format line numbers properly."""
624 if session in (0, history_manager.session_number):
624 if session in (0, history_manager.session_number):
625 return str(line)
625 return str(line)
626 return "%s/%s" % (session, line)
626 return "%s/%s" % (session, line)
627
627
628 # Check if output to specific file was requested.
628 # Check if output to specific file was requested.
629 try:
629 try:
630 outfname = opts['f']
630 outfname = opts['f']
631 except KeyError:
631 except KeyError:
632 outfile = io.stdout # default
632 outfile = io.stdout # default
633 # We don't want to close stdout at the end!
633 # We don't want to close stdout at the end!
634 close_at_end = False
634 close_at_end = False
635 else:
635 else:
636 if os.path.exists(outfname):
636 if os.path.exists(outfname):
637 if not io.ask_yes_no("File %r exists. Overwrite?" % outfname):
637 if not io.ask_yes_no("File %r exists. Overwrite?" % outfname):
638 print('Aborting.')
638 print('Aborting.')
639 return
639 return
640
640
641 outfile = open(outfname,'w')
641 outfile = open(outfname,'w')
642 close_at_end = True
642 close_at_end = True
643
643
644 print_nums = 'n' in opts
644 print_nums = 'n' in opts
645 get_output = 'o' in opts
645 get_output = 'o' in opts
646 pyprompts = 'p' in opts
646 pyprompts = 'p' in opts
647 # Raw history is the default
647 # Raw history is the default
648 raw = not('t' in opts)
648 raw = not('t' in opts)
649
649
650 default_length = 40
650 default_length = 40
651 pattern = None
651 pattern = None
652
652
653 if 'g' in opts: # Glob search
653 if 'g' in opts: # Glob search
654 pattern = "*" + args + "*" if args else "*"
654 pattern = "*" + args + "*" if args else "*"
655 hist = history_manager.search(pattern, raw=raw, output=get_output)
655 hist = history_manager.search(pattern, raw=raw, output=get_output)
656 elif 'l' in opts: # Get 'tail'
656 elif 'l' in opts: # Get 'tail'
657 try:
657 try:
658 n = int(args)
658 n = int(args)
659 except ValueError, IndexError:
659 except ValueError, IndexError:
660 n = 10
660 n = 10
661 hist = history_manager.get_tail(n, raw=raw, output=get_output)
661 hist = history_manager.get_tail(n, raw=raw, output=get_output)
662 else:
662 else:
663 if args: # Get history by ranges
663 if args: # Get history by ranges
664 hist = history_manager.get_range_by_str(args, raw, get_output)
664 hist = history_manager.get_range_by_str(args, raw, get_output)
665 else: # Just get history for the current session
665 else: # Just get history for the current session
666 hist = history_manager.get_range(raw=raw, output=get_output)
666 hist = history_manager.get_range(raw=raw, output=get_output)
667
667
668 # We could be displaying the entire history, so let's not try to pull it
668 # We could be displaying the entire history, so let's not try to pull it
669 # into a list in memory. Anything that needs more space will just misalign.
669 # into a list in memory. Anything that needs more space will just misalign.
670 width = 4
670 width = 4
671
671
672 for session, lineno, inline in hist:
672 for session, lineno, inline in hist:
673 # Print user history with tabs expanded to 4 spaces. The GUI clients
673 # Print user history with tabs expanded to 4 spaces. The GUI clients
674 # use hard tabs for easier usability in auto-indented code, but we want
674 # use hard tabs for easier usability in auto-indented code, but we want
675 # to produce PEP-8 compliant history for safe pasting into an editor.
675 # to produce PEP-8 compliant history for safe pasting into an editor.
676 if get_output:
676 if get_output:
677 inline, output = inline
677 inline, output = inline
678 inline = inline.expandtabs(4).rstrip()
678 inline = inline.expandtabs(4).rstrip()
679
679
680 multiline = "\n" in inline
680 multiline = "\n" in inline
681 line_sep = '\n' if multiline else ' '
681 line_sep = '\n' if multiline else ' '
682 if print_nums:
682 if print_nums:
683 print('%s:%s' % (_format_lineno(session, lineno).rjust(width),
683 print('%s:%s' % (_format_lineno(session, lineno).rjust(width),
684 line_sep), file=outfile, end='')
684 line_sep), file=outfile, end='')
685 if pyprompts:
685 if pyprompts:
686 print(">>> ", end="", file=outfile)
686 print(">>> ", end="", file=outfile)
687 if multiline:
687 if multiline:
688 inline = "\n... ".join(inline.splitlines()) + "\n..."
688 inline = "\n... ".join(inline.splitlines()) + "\n..."
689 print(inline, file=outfile)
689 print(inline, file=outfile)
690 if get_output and output:
690 if get_output and output:
691 print(output, file=outfile)
691 print(output, file=outfile)
692
692
693 if close_at_end:
693 if close_at_end:
694 outfile.close()
694 outfile.close()
695
695
696
696
697 def magic_rep(self, arg):
697 def magic_rep(self, arg):
698 r""" Repeat a command, or get command to input line for editing
698 r""" Repeat a command, or get command to input line for editing
699
699
700 - %rep (no arguments):
700 - %rep (no arguments):
701
701
702 Place a string version of last computation result (stored in the special '_'
702 Place a string version of last computation result (stored in the special '_'
703 variable) to the next input prompt. Allows you to create elaborate command
703 variable) to the next input prompt. Allows you to create elaborate command
704 lines without using copy-paste::
704 lines without using copy-paste::
705
705
706 In[1]: l = ["hei", "vaan"]
706 In[1]: l = ["hei", "vaan"]
707 In[2]: "".join(l)
707 In[2]: "".join(l)
708 Out[2]: heivaan
708 Out[2]: heivaan
709 In[3]: %rep
709 In[3]: %rep
710 In[4]: heivaan_ <== cursor blinking
710 In[4]: heivaan_ <== cursor blinking
711
711
712 %rep 45
712 %rep 45
713
713
714 Place history line 45 on the next input prompt. Use %hist to find
714 Place history line 45 on the next input prompt. Use %hist to find
715 out the number.
715 out the number.
716
716
717 %rep 1-4
717 %rep 1-4
718
718
719 Combine the specified lines into one cell, and place it on the next
719 Combine the specified lines into one cell, and place it on the next
720 input prompt. See %history for the slice syntax.
720 input prompt. See %history for the slice syntax.
721
721
722 %rep foo+bar
722 %rep foo+bar
723
723
724 If foo+bar can be evaluated in the user namespace, the result is
724 If foo+bar can be evaluated in the user namespace, the result is
725 placed at the next input prompt. Otherwise, the history is searched
725 placed at the next input prompt. Otherwise, the history is searched
726 for lines which contain that substring, and the most recent one is
726 for lines which contain that substring, and the most recent one is
727 placed at the next input prompt.
727 placed at the next input prompt.
728 """
728 """
729 if not arg: # Last output
729 if not arg: # Last output
730 self.set_next_input(str(self.shell.user_ns["_"]))
730 self.set_next_input(str(self.shell.user_ns["_"]))
731 return
731 return
732 # Get history range
732 # Get history range
733 histlines = self.history_manager.get_range_by_str(arg)
733 histlines = self.history_manager.get_range_by_str(arg)
734 cmd = "\n".join(x[2] for x in histlines)
734 cmd = "\n".join(x[2] for x in histlines)
735 if cmd:
735 if cmd:
736 self.set_next_input(cmd.rstrip())
736 self.set_next_input(cmd.rstrip())
737 return
737 return
738
738
739 try: # Variable in user namespace
739 try: # Variable in user namespace
740 cmd = str(eval(arg, self.shell.user_ns))
740 cmd = str(eval(arg, self.shell.user_ns))
741 except Exception: # Search for term in history
741 except Exception: # Search for term in history
742 histlines = self.history_manager.search("*"+arg+"*")
742 histlines = self.history_manager.search("*"+arg+"*")
743 for h in reversed([x[2] for x in histlines]):
743 for h in reversed([x[2] for x in histlines]):
744 if 'rep' in h:
744 if 'rep' in h:
745 continue
745 continue
746 self.set_next_input(h.rstrip())
746 self.set_next_input(h.rstrip())
747 return
747 return
748 else:
748 else:
749 self.set_next_input(cmd.rstrip())
749 self.set_next_input(cmd.rstrip())
750 print("Couldn't evaluate or find in history:", arg)
750 print("Couldn't evaluate or find in history:", arg)
751
751
752 def magic_rerun(self, parameter_s=''):
752 def magic_rerun(self, parameter_s=''):
753 """Re-run previous input
753 """Re-run previous input
754
754
755 By default, you can specify ranges of input history to be repeated
755 By default, you can specify ranges of input history to be repeated
756 (as with %history). With no arguments, it will repeat the last line.
756 (as with %history). With no arguments, it will repeat the last line.
757
757
758 Options:
758 Options:
759
759
760 -l <n> : Repeat the last n lines of input, not including the
760 -l <n> : Repeat the last n lines of input, not including the
761 current command.
761 current command.
762
762
763 -g foo : Repeat the most recent line which contains foo
763 -g foo : Repeat the most recent line which contains foo
764 """
764 """
765 opts, args = self.parse_options(parameter_s, 'l:g:', mode='string')
765 opts, args = self.parse_options(parameter_s, 'l:g:', mode='string')
766 if "l" in opts: # Last n lines
766 if "l" in opts: # Last n lines
767 n = int(opts['l'])
767 n = int(opts['l'])
768 hist = self.history_manager.get_tail(n)
768 hist = self.history_manager.get_tail(n)
769 elif "g" in opts: # Search
769 elif "g" in opts: # Search
770 p = "*"+opts['g']+"*"
770 p = "*"+opts['g']+"*"
771 hist = list(self.history_manager.search(p))
771 hist = list(self.history_manager.search(p))
772 for l in reversed(hist):
772 for l in reversed(hist):
773 if "rerun" not in l[2]:
773 if "rerun" not in l[2]:
774 hist = [l] # The last match which isn't a %rerun
774 hist = [l] # The last match which isn't a %rerun
775 break
775 break
776 else:
776 else:
777 hist = [] # No matches except %rerun
777 hist = [] # No matches except %rerun
778 elif args: # Specify history ranges
778 elif args: # Specify history ranges
779 hist = self.history_manager.get_range_by_str(args)
779 hist = self.history_manager.get_range_by_str(args)
780 else: # Last line
780 else: # Last line
781 hist = self.history_manager.get_tail(1)
781 hist = self.history_manager.get_tail(1)
782 hist = [x[2] for x in hist]
782 hist = [x[2] for x in hist]
783 if not hist:
783 if not hist:
784 print("No lines in history match specification")
784 print("No lines in history match specification")
785 return
785 return
786 histlines = "\n".join(hist)
786 histlines = "\n".join(hist)
787 print("=== Executing: ===")
787 print("=== Executing: ===")
788 print(histlines)
788 print(histlines)
789 print("=== Output: ===")
789 print("=== Output: ===")
790 self.run_cell("\n".join(hist), store_history=False)
790 self.run_cell("\n".join(hist), store_history=False)
791
791
792
792
793 def init_ipython(ip):
793 def init_ipython(ip):
794 ip.define_magic("rep", magic_rep)
794 ip.define_magic("rep", magic_rep)
795 ip.define_magic("recall", magic_rep)
795 ip.define_magic("recall", magic_rep)
796 ip.define_magic("rerun", magic_rerun)
796 ip.define_magic("rerun", magic_rerun)
797 ip.define_magic("hist",magic_history) # Alternative name
797 ip.define_magic("hist",magic_history) # Alternative name
798 ip.define_magic("history",magic_history)
798 ip.define_magic("history",magic_history)
799
799
800 # XXX - ipy_completers are in quarantine, need to be updated to new apis
800 # XXX - ipy_completers are in quarantine, need to be updated to new apis
801 #import ipy_completers
801 #import ipy_completers
802 #ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
802 #ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
@@ -1,3487 +1,3487 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3 """
3 """
4
4
5 #-----------------------------------------------------------------------------
5 #-----------------------------------------------------------------------------
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
7 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2008-2009 The IPython Development Team
8 # Copyright (C) 2008-2009 The IPython Development Team
9
9
10 # Distributed under the terms of the BSD License. The full license is in
10 # Distributed under the terms of the BSD License. The full license is in
11 # the file COPYING, distributed as part of this software.
11 # the file COPYING, distributed as part of this software.
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15 # Imports
15 # Imports
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 import __builtin__
18 import __builtin__
19 import __future__
19 import __future__
20 import bdb
20 import bdb
21 import inspect
21 import inspect
22 import os
22 import os
23 import sys
23 import sys
24 import shutil
24 import shutil
25 import re
25 import re
26 import time
26 import time
27 import textwrap
27 import textwrap
28 from cStringIO import StringIO
28 from cStringIO import StringIO
29 from getopt import getopt,GetoptError
29 from getopt import getopt,GetoptError
30 from pprint import pformat
30 from pprint import pformat
31 from xmlrpclib import ServerProxy
31 from xmlrpclib import ServerProxy
32
32
33 # cProfile was added in Python2.5
33 # cProfile was added in Python2.5
34 try:
34 try:
35 import cProfile as profile
35 import cProfile as profile
36 import pstats
36 import pstats
37 except ImportError:
37 except ImportError:
38 # profile isn't bundled by default in Debian for license reasons
38 # profile isn't bundled by default in Debian for license reasons
39 try:
39 try:
40 import profile,pstats
40 import profile,pstats
41 except ImportError:
41 except ImportError:
42 profile = pstats = None
42 profile = pstats = None
43
43
44 import IPython
44 import IPython
45 from IPython.core import debugger, oinspect
45 from IPython.core import debugger, oinspect
46 from IPython.core.error import TryNext
46 from IPython.core.error import TryNext
47 from IPython.core.error import UsageError
47 from IPython.core.error import UsageError
48 from IPython.core.fakemodule import FakeModule
48 from IPython.core.fakemodule import FakeModule
49 from IPython.core.macro import Macro
49 from IPython.core.macro import Macro
50 from IPython.core import page
50 from IPython.core import page
51 from IPython.core.prefilter import ESC_MAGIC
51 from IPython.core.prefilter import ESC_MAGIC
52 from IPython.lib.pylabtools import mpl_runner
52 from IPython.lib.pylabtools import mpl_runner
53 from IPython.external.Itpl import itpl, printpl
53 from IPython.external.Itpl import itpl, printpl
54 from IPython.testing import decorators as testdec
54 from IPython.testing.skipdoctest import skip_doctest
55 from IPython.utils.io import file_read, nlprint
55 from IPython.utils.io import file_read, nlprint
56 from IPython.utils.path import get_py_filename
56 from IPython.utils.path import get_py_filename
57 from IPython.utils.process import arg_split, abbrev_cwd
57 from IPython.utils.process import arg_split, abbrev_cwd
58 from IPython.utils.terminal import set_term_title
58 from IPython.utils.terminal import set_term_title
59 from IPython.utils.text import LSString, SList, format_screen
59 from IPython.utils.text import LSString, SList, format_screen
60 from IPython.utils.timing import clock, clock2
60 from IPython.utils.timing import clock, clock2
61 from IPython.utils.warn import warn, error
61 from IPython.utils.warn import warn, error
62 from IPython.utils.ipstruct import Struct
62 from IPython.utils.ipstruct import Struct
63 import IPython.utils.generics
63 import IPython.utils.generics
64
64
65 #-----------------------------------------------------------------------------
65 #-----------------------------------------------------------------------------
66 # Utility functions
66 # Utility functions
67 #-----------------------------------------------------------------------------
67 #-----------------------------------------------------------------------------
68
68
69 def on_off(tag):
69 def on_off(tag):
70 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
70 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
71 return ['OFF','ON'][tag]
71 return ['OFF','ON'][tag]
72
72
73 class Bunch: pass
73 class Bunch: pass
74
74
75 def compress_dhist(dh):
75 def compress_dhist(dh):
76 head, tail = dh[:-10], dh[-10:]
76 head, tail = dh[:-10], dh[-10:]
77
77
78 newhead = []
78 newhead = []
79 done = set()
79 done = set()
80 for h in head:
80 for h in head:
81 if h in done:
81 if h in done:
82 continue
82 continue
83 newhead.append(h)
83 newhead.append(h)
84 done.add(h)
84 done.add(h)
85
85
86 return newhead + tail
86 return newhead + tail
87
87
88 def needs_local_scope(func):
88 def needs_local_scope(func):
89 """Decorator to mark magic functions which need to local scope to run."""
89 """Decorator to mark magic functions which need to local scope to run."""
90 func.needs_local_scope = True
90 func.needs_local_scope = True
91 return func
91 return func
92
92
93 #***************************************************************************
93 #***************************************************************************
94 # Main class implementing Magic functionality
94 # Main class implementing Magic functionality
95
95
96 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
96 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
97 # on construction of the main InteractiveShell object. Something odd is going
97 # on construction of the main InteractiveShell object. Something odd is going
98 # on with super() calls, Configurable and the MRO... For now leave it as-is, but
98 # on with super() calls, Configurable and the MRO... For now leave it as-is, but
99 # eventually this needs to be clarified.
99 # eventually this needs to be clarified.
100 # BG: This is because InteractiveShell inherits from this, but is itself a
100 # BG: This is because InteractiveShell inherits from this, but is itself a
101 # Configurable. This messes up the MRO in some way. The fix is that we need to
101 # Configurable. This messes up the MRO in some way. The fix is that we need to
102 # make Magic a configurable that InteractiveShell does not subclass.
102 # make Magic a configurable that InteractiveShell does not subclass.
103
103
104 class Magic:
104 class Magic:
105 """Magic functions for InteractiveShell.
105 """Magic functions for InteractiveShell.
106
106
107 Shell functions which can be reached as %function_name. All magic
107 Shell functions which can be reached as %function_name. All magic
108 functions should accept a string, which they can parse for their own
108 functions should accept a string, which they can parse for their own
109 needs. This can make some functions easier to type, eg `%cd ../`
109 needs. This can make some functions easier to type, eg `%cd ../`
110 vs. `%cd("../")`
110 vs. `%cd("../")`
111
111
112 ALL definitions MUST begin with the prefix magic_. The user won't need it
112 ALL definitions MUST begin with the prefix magic_. The user won't need it
113 at the command line, but it is is needed in the definition. """
113 at the command line, but it is is needed in the definition. """
114
114
115 # class globals
115 # class globals
116 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
116 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
117 'Automagic is ON, % prefix NOT needed for magic functions.']
117 'Automagic is ON, % prefix NOT needed for magic functions.']
118
118
119 #......................................................................
119 #......................................................................
120 # some utility functions
120 # some utility functions
121
121
122 def __init__(self,shell):
122 def __init__(self,shell):
123
123
124 self.options_table = {}
124 self.options_table = {}
125 if profile is None:
125 if profile is None:
126 self.magic_prun = self.profile_missing_notice
126 self.magic_prun = self.profile_missing_notice
127 self.shell = shell
127 self.shell = shell
128
128
129 # namespace for holding state we may need
129 # namespace for holding state we may need
130 self._magic_state = Bunch()
130 self._magic_state = Bunch()
131
131
132 def profile_missing_notice(self, *args, **kwargs):
132 def profile_missing_notice(self, *args, **kwargs):
133 error("""\
133 error("""\
134 The profile module could not be found. It has been removed from the standard
134 The profile module could not be found. It has been removed from the standard
135 python packages because of its non-free license. To use profiling, install the
135 python packages because of its non-free license. To use profiling, install the
136 python-profiler package from non-free.""")
136 python-profiler package from non-free.""")
137
137
138 def default_option(self,fn,optstr):
138 def default_option(self,fn,optstr):
139 """Make an entry in the options_table for fn, with value optstr"""
139 """Make an entry in the options_table for fn, with value optstr"""
140
140
141 if fn not in self.lsmagic():
141 if fn not in self.lsmagic():
142 error("%s is not a magic function" % fn)
142 error("%s is not a magic function" % fn)
143 self.options_table[fn] = optstr
143 self.options_table[fn] = optstr
144
144
145 def lsmagic(self):
145 def lsmagic(self):
146 """Return a list of currently available magic functions.
146 """Return a list of currently available magic functions.
147
147
148 Gives a list of the bare names after mangling (['ls','cd', ...], not
148 Gives a list of the bare names after mangling (['ls','cd', ...], not
149 ['magic_ls','magic_cd',...]"""
149 ['magic_ls','magic_cd',...]"""
150
150
151 # FIXME. This needs a cleanup, in the way the magics list is built.
151 # FIXME. This needs a cleanup, in the way the magics list is built.
152
152
153 # magics in class definition
153 # magics in class definition
154 class_magic = lambda fn: fn.startswith('magic_') and \
154 class_magic = lambda fn: fn.startswith('magic_') and \
155 callable(Magic.__dict__[fn])
155 callable(Magic.__dict__[fn])
156 # in instance namespace (run-time user additions)
156 # in instance namespace (run-time user additions)
157 inst_magic = lambda fn: fn.startswith('magic_') and \
157 inst_magic = lambda fn: fn.startswith('magic_') and \
158 callable(self.__dict__[fn])
158 callable(self.__dict__[fn])
159 # and bound magics by user (so they can access self):
159 # and bound magics by user (so they can access self):
160 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
160 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
161 callable(self.__class__.__dict__[fn])
161 callable(self.__class__.__dict__[fn])
162 magics = filter(class_magic,Magic.__dict__.keys()) + \
162 magics = filter(class_magic,Magic.__dict__.keys()) + \
163 filter(inst_magic,self.__dict__.keys()) + \
163 filter(inst_magic,self.__dict__.keys()) + \
164 filter(inst_bound_magic,self.__class__.__dict__.keys())
164 filter(inst_bound_magic,self.__class__.__dict__.keys())
165 out = []
165 out = []
166 for fn in set(magics):
166 for fn in set(magics):
167 out.append(fn.replace('magic_','',1))
167 out.append(fn.replace('magic_','',1))
168 out.sort()
168 out.sort()
169 return out
169 return out
170
170
171 def extract_input_lines(self, range_str, raw=False):
171 def extract_input_lines(self, range_str, raw=False):
172 """Return as a string a set of input history slices.
172 """Return as a string a set of input history slices.
173
173
174 Inputs:
174 Inputs:
175
175
176 - range_str: the set of slices is given as a string, like
176 - range_str: the set of slices is given as a string, like
177 "~5/6-~4/2 4:8 9", since this function is for use by magic functions
177 "~5/6-~4/2 4:8 9", since this function is for use by magic functions
178 which get their arguments as strings. The number before the / is the
178 which get their arguments as strings. The number before the / is the
179 session number: ~n goes n back from the current session.
179 session number: ~n goes n back from the current session.
180
180
181 Optional inputs:
181 Optional inputs:
182
182
183 - raw(False): by default, the processed input is used. If this is
183 - raw(False): by default, the processed input is used. If this is
184 true, the raw input history is used instead.
184 true, the raw input history is used instead.
185
185
186 Note that slices can be called with two notations:
186 Note that slices can be called with two notations:
187
187
188 N:M -> standard python form, means including items N...(M-1).
188 N:M -> standard python form, means including items N...(M-1).
189
189
190 N-M -> include items N..M (closed endpoint)."""
190 N-M -> include items N..M (closed endpoint)."""
191 lines = self.shell.history_manager.\
191 lines = self.shell.history_manager.\
192 get_range_by_str(range_str, raw=raw)
192 get_range_by_str(range_str, raw=raw)
193 return "\n".join(x for _, _, x in lines)
193 return "\n".join(x for _, _, x in lines)
194
194
195 def arg_err(self,func):
195 def arg_err(self,func):
196 """Print docstring if incorrect arguments were passed"""
196 """Print docstring if incorrect arguments were passed"""
197 print 'Error in arguments:'
197 print 'Error in arguments:'
198 print oinspect.getdoc(func)
198 print oinspect.getdoc(func)
199
199
200 def format_latex(self,strng):
200 def format_latex(self,strng):
201 """Format a string for latex inclusion."""
201 """Format a string for latex inclusion."""
202
202
203 # Characters that need to be escaped for latex:
203 # Characters that need to be escaped for latex:
204 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
204 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
205 # Magic command names as headers:
205 # Magic command names as headers:
206 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
206 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
207 re.MULTILINE)
207 re.MULTILINE)
208 # Magic commands
208 # Magic commands
209 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
209 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
210 re.MULTILINE)
210 re.MULTILINE)
211 # Paragraph continue
211 # Paragraph continue
212 par_re = re.compile(r'\\$',re.MULTILINE)
212 par_re = re.compile(r'\\$',re.MULTILINE)
213
213
214 # The "\n" symbol
214 # The "\n" symbol
215 newline_re = re.compile(r'\\n')
215 newline_re = re.compile(r'\\n')
216
216
217 # Now build the string for output:
217 # Now build the string for output:
218 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
218 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
219 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
219 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
220 strng)
220 strng)
221 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
221 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
222 strng = par_re.sub(r'\\\\',strng)
222 strng = par_re.sub(r'\\\\',strng)
223 strng = escape_re.sub(r'\\\1',strng)
223 strng = escape_re.sub(r'\\\1',strng)
224 strng = newline_re.sub(r'\\textbackslash{}n',strng)
224 strng = newline_re.sub(r'\\textbackslash{}n',strng)
225 return strng
225 return strng
226
226
227 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
227 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
228 """Parse options passed to an argument string.
228 """Parse options passed to an argument string.
229
229
230 The interface is similar to that of getopt(), but it returns back a
230 The interface is similar to that of getopt(), but it returns back a
231 Struct with the options as keys and the stripped argument string still
231 Struct with the options as keys and the stripped argument string still
232 as a string.
232 as a string.
233
233
234 arg_str is quoted as a true sys.argv vector by using shlex.split.
234 arg_str is quoted as a true sys.argv vector by using shlex.split.
235 This allows us to easily expand variables, glob files, quote
235 This allows us to easily expand variables, glob files, quote
236 arguments, etc.
236 arguments, etc.
237
237
238 Options:
238 Options:
239 -mode: default 'string'. If given as 'list', the argument string is
239 -mode: default 'string'. If given as 'list', the argument string is
240 returned as a list (split on whitespace) instead of a string.
240 returned as a list (split on whitespace) instead of a string.
241
241
242 -list_all: put all option values in lists. Normally only options
242 -list_all: put all option values in lists. Normally only options
243 appearing more than once are put in a list.
243 appearing more than once are put in a list.
244
244
245 -posix (True): whether to split the input line in POSIX mode or not,
245 -posix (True): whether to split the input line in POSIX mode or not,
246 as per the conventions outlined in the shlex module from the
246 as per the conventions outlined in the shlex module from the
247 standard library."""
247 standard library."""
248
248
249 # inject default options at the beginning of the input line
249 # inject default options at the beginning of the input line
250 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
250 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
251 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
251 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
252
252
253 mode = kw.get('mode','string')
253 mode = kw.get('mode','string')
254 if mode not in ['string','list']:
254 if mode not in ['string','list']:
255 raise ValueError,'incorrect mode given: %s' % mode
255 raise ValueError,'incorrect mode given: %s' % mode
256 # Get options
256 # Get options
257 list_all = kw.get('list_all',0)
257 list_all = kw.get('list_all',0)
258 posix = kw.get('posix', os.name == 'posix')
258 posix = kw.get('posix', os.name == 'posix')
259
259
260 # Check if we have more than one argument to warrant extra processing:
260 # Check if we have more than one argument to warrant extra processing:
261 odict = {} # Dictionary with options
261 odict = {} # Dictionary with options
262 args = arg_str.split()
262 args = arg_str.split()
263 if len(args) >= 1:
263 if len(args) >= 1:
264 # If the list of inputs only has 0 or 1 thing in it, there's no
264 # If the list of inputs only has 0 or 1 thing in it, there's no
265 # need to look for options
265 # need to look for options
266 argv = arg_split(arg_str,posix)
266 argv = arg_split(arg_str,posix)
267 # Do regular option processing
267 # Do regular option processing
268 try:
268 try:
269 opts,args = getopt(argv,opt_str,*long_opts)
269 opts,args = getopt(argv,opt_str,*long_opts)
270 except GetoptError,e:
270 except GetoptError,e:
271 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
271 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
272 " ".join(long_opts)))
272 " ".join(long_opts)))
273 for o,a in opts:
273 for o,a in opts:
274 if o.startswith('--'):
274 if o.startswith('--'):
275 o = o[2:]
275 o = o[2:]
276 else:
276 else:
277 o = o[1:]
277 o = o[1:]
278 try:
278 try:
279 odict[o].append(a)
279 odict[o].append(a)
280 except AttributeError:
280 except AttributeError:
281 odict[o] = [odict[o],a]
281 odict[o] = [odict[o],a]
282 except KeyError:
282 except KeyError:
283 if list_all:
283 if list_all:
284 odict[o] = [a]
284 odict[o] = [a]
285 else:
285 else:
286 odict[o] = a
286 odict[o] = a
287
287
288 # Prepare opts,args for return
288 # Prepare opts,args for return
289 opts = Struct(odict)
289 opts = Struct(odict)
290 if mode == 'string':
290 if mode == 'string':
291 args = ' '.join(args)
291 args = ' '.join(args)
292
292
293 return opts,args
293 return opts,args
294
294
295 #......................................................................
295 #......................................................................
296 # And now the actual magic functions
296 # And now the actual magic functions
297
297
298 # Functions for IPython shell work (vars,funcs, config, etc)
298 # Functions for IPython shell work (vars,funcs, config, etc)
299 def magic_lsmagic(self, parameter_s = ''):
299 def magic_lsmagic(self, parameter_s = ''):
300 """List currently available magic functions."""
300 """List currently available magic functions."""
301 mesc = ESC_MAGIC
301 mesc = ESC_MAGIC
302 print 'Available magic functions:\n'+mesc+\
302 print 'Available magic functions:\n'+mesc+\
303 (' '+mesc).join(self.lsmagic())
303 (' '+mesc).join(self.lsmagic())
304 print '\n' + Magic.auto_status[self.shell.automagic]
304 print '\n' + Magic.auto_status[self.shell.automagic]
305 return None
305 return None
306
306
307 def magic_magic(self, parameter_s = ''):
307 def magic_magic(self, parameter_s = ''):
308 """Print information about the magic function system.
308 """Print information about the magic function system.
309
309
310 Supported formats: -latex, -brief, -rest
310 Supported formats: -latex, -brief, -rest
311 """
311 """
312
312
313 mode = ''
313 mode = ''
314 try:
314 try:
315 if parameter_s.split()[0] == '-latex':
315 if parameter_s.split()[0] == '-latex':
316 mode = 'latex'
316 mode = 'latex'
317 if parameter_s.split()[0] == '-brief':
317 if parameter_s.split()[0] == '-brief':
318 mode = 'brief'
318 mode = 'brief'
319 if parameter_s.split()[0] == '-rest':
319 if parameter_s.split()[0] == '-rest':
320 mode = 'rest'
320 mode = 'rest'
321 rest_docs = []
321 rest_docs = []
322 except:
322 except:
323 pass
323 pass
324
324
325 magic_docs = []
325 magic_docs = []
326 for fname in self.lsmagic():
326 for fname in self.lsmagic():
327 mname = 'magic_' + fname
327 mname = 'magic_' + fname
328 for space in (Magic,self,self.__class__):
328 for space in (Magic,self,self.__class__):
329 try:
329 try:
330 fn = space.__dict__[mname]
330 fn = space.__dict__[mname]
331 except KeyError:
331 except KeyError:
332 pass
332 pass
333 else:
333 else:
334 break
334 break
335 if mode == 'brief':
335 if mode == 'brief':
336 # only first line
336 # only first line
337 if fn.__doc__:
337 if fn.__doc__:
338 fndoc = fn.__doc__.split('\n',1)[0]
338 fndoc = fn.__doc__.split('\n',1)[0]
339 else:
339 else:
340 fndoc = 'No documentation'
340 fndoc = 'No documentation'
341 else:
341 else:
342 if fn.__doc__:
342 if fn.__doc__:
343 fndoc = fn.__doc__.rstrip()
343 fndoc = fn.__doc__.rstrip()
344 else:
344 else:
345 fndoc = 'No documentation'
345 fndoc = 'No documentation'
346
346
347
347
348 if mode == 'rest':
348 if mode == 'rest':
349 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
349 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
350 fname,fndoc))
350 fname,fndoc))
351
351
352 else:
352 else:
353 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
353 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
354 fname,fndoc))
354 fname,fndoc))
355
355
356 magic_docs = ''.join(magic_docs)
356 magic_docs = ''.join(magic_docs)
357
357
358 if mode == 'rest':
358 if mode == 'rest':
359 return "".join(rest_docs)
359 return "".join(rest_docs)
360
360
361 if mode == 'latex':
361 if mode == 'latex':
362 print self.format_latex(magic_docs)
362 print self.format_latex(magic_docs)
363 return
363 return
364 else:
364 else:
365 magic_docs = format_screen(magic_docs)
365 magic_docs = format_screen(magic_docs)
366 if mode == 'brief':
366 if mode == 'brief':
367 return magic_docs
367 return magic_docs
368
368
369 outmsg = """
369 outmsg = """
370 IPython's 'magic' functions
370 IPython's 'magic' functions
371 ===========================
371 ===========================
372
372
373 The magic function system provides a series of functions which allow you to
373 The magic function system provides a series of functions which allow you to
374 control the behavior of IPython itself, plus a lot of system-type
374 control the behavior of IPython itself, plus a lot of system-type
375 features. All these functions are prefixed with a % character, but parameters
375 features. All these functions are prefixed with a % character, but parameters
376 are given without parentheses or quotes.
376 are given without parentheses or quotes.
377
377
378 NOTE: If you have 'automagic' enabled (via the command line option or with the
378 NOTE: If you have 'automagic' enabled (via the command line option or with the
379 %automagic function), you don't need to type in the % explicitly. By default,
379 %automagic function), you don't need to type in the % explicitly. By default,
380 IPython ships with automagic on, so you should only rarely need the % escape.
380 IPython ships with automagic on, so you should only rarely need the % escape.
381
381
382 Example: typing '%cd mydir' (without the quotes) changes you working directory
382 Example: typing '%cd mydir' (without the quotes) changes you working directory
383 to 'mydir', if it exists.
383 to 'mydir', if it exists.
384
384
385 You can define your own magic functions to extend the system. See the supplied
385 You can define your own magic functions to extend the system. See the supplied
386 ipythonrc and example-magic.py files for details (in your ipython
386 ipythonrc and example-magic.py files for details (in your ipython
387 configuration directory, typically $HOME/.config/ipython on Linux or $HOME/.ipython elsewhere).
387 configuration directory, typically $HOME/.config/ipython on Linux or $HOME/.ipython elsewhere).
388
388
389 You can also define your own aliased names for magic functions. In your
389 You can also define your own aliased names for magic functions. In your
390 ipythonrc file, placing a line like:
390 ipythonrc file, placing a line like:
391
391
392 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
392 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
393
393
394 will define %pf as a new name for %profile.
394 will define %pf as a new name for %profile.
395
395
396 You can also call magics in code using the magic() function, which IPython
396 You can also call magics in code using the magic() function, which IPython
397 automatically adds to the builtin namespace. Type 'magic?' for details.
397 automatically adds to the builtin namespace. Type 'magic?' for details.
398
398
399 For a list of the available magic functions, use %lsmagic. For a description
399 For a list of the available magic functions, use %lsmagic. For a description
400 of any of them, type %magic_name?, e.g. '%cd?'.
400 of any of them, type %magic_name?, e.g. '%cd?'.
401
401
402 Currently the magic system has the following functions:\n"""
402 Currently the magic system has the following functions:\n"""
403
403
404 mesc = ESC_MAGIC
404 mesc = ESC_MAGIC
405 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
405 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
406 "\n\n%s%s\n\n%s" % (outmsg,
406 "\n\n%s%s\n\n%s" % (outmsg,
407 magic_docs,mesc,mesc,
407 magic_docs,mesc,mesc,
408 (' '+mesc).join(self.lsmagic()),
408 (' '+mesc).join(self.lsmagic()),
409 Magic.auto_status[self.shell.automagic] ) )
409 Magic.auto_status[self.shell.automagic] ) )
410 page.page(outmsg)
410 page.page(outmsg)
411
411
412 def magic_automagic(self, parameter_s = ''):
412 def magic_automagic(self, parameter_s = ''):
413 """Make magic functions callable without having to type the initial %.
413 """Make magic functions callable without having to type the initial %.
414
414
415 Without argumentsl toggles on/off (when off, you must call it as
415 Without argumentsl toggles on/off (when off, you must call it as
416 %automagic, of course). With arguments it sets the value, and you can
416 %automagic, of course). With arguments it sets the value, and you can
417 use any of (case insensitive):
417 use any of (case insensitive):
418
418
419 - on,1,True: to activate
419 - on,1,True: to activate
420
420
421 - off,0,False: to deactivate.
421 - off,0,False: to deactivate.
422
422
423 Note that magic functions have lowest priority, so if there's a
423 Note that magic functions have lowest priority, so if there's a
424 variable whose name collides with that of a magic fn, automagic won't
424 variable whose name collides with that of a magic fn, automagic won't
425 work for that function (you get the variable instead). However, if you
425 work for that function (you get the variable instead). However, if you
426 delete the variable (del var), the previously shadowed magic function
426 delete the variable (del var), the previously shadowed magic function
427 becomes visible to automagic again."""
427 becomes visible to automagic again."""
428
428
429 arg = parameter_s.lower()
429 arg = parameter_s.lower()
430 if parameter_s in ('on','1','true'):
430 if parameter_s in ('on','1','true'):
431 self.shell.automagic = True
431 self.shell.automagic = True
432 elif parameter_s in ('off','0','false'):
432 elif parameter_s in ('off','0','false'):
433 self.shell.automagic = False
433 self.shell.automagic = False
434 else:
434 else:
435 self.shell.automagic = not self.shell.automagic
435 self.shell.automagic = not self.shell.automagic
436 print '\n' + Magic.auto_status[self.shell.automagic]
436 print '\n' + Magic.auto_status[self.shell.automagic]
437
437
438 @testdec.skip_doctest
438 @skip_doctest
439 def magic_autocall(self, parameter_s = ''):
439 def magic_autocall(self, parameter_s = ''):
440 """Make functions callable without having to type parentheses.
440 """Make functions callable without having to type parentheses.
441
441
442 Usage:
442 Usage:
443
443
444 %autocall [mode]
444 %autocall [mode]
445
445
446 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
446 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
447 value is toggled on and off (remembering the previous state).
447 value is toggled on and off (remembering the previous state).
448
448
449 In more detail, these values mean:
449 In more detail, these values mean:
450
450
451 0 -> fully disabled
451 0 -> fully disabled
452
452
453 1 -> active, but do not apply if there are no arguments on the line.
453 1 -> active, but do not apply if there are no arguments on the line.
454
454
455 In this mode, you get:
455 In this mode, you get:
456
456
457 In [1]: callable
457 In [1]: callable
458 Out[1]: <built-in function callable>
458 Out[1]: <built-in function callable>
459
459
460 In [2]: callable 'hello'
460 In [2]: callable 'hello'
461 ------> callable('hello')
461 ------> callable('hello')
462 Out[2]: False
462 Out[2]: False
463
463
464 2 -> Active always. Even if no arguments are present, the callable
464 2 -> Active always. Even if no arguments are present, the callable
465 object is called:
465 object is called:
466
466
467 In [2]: float
467 In [2]: float
468 ------> float()
468 ------> float()
469 Out[2]: 0.0
469 Out[2]: 0.0
470
470
471 Note that even with autocall off, you can still use '/' at the start of
471 Note that even with autocall off, you can still use '/' at the start of
472 a line to treat the first argument on the command line as a function
472 a line to treat the first argument on the command line as a function
473 and add parentheses to it:
473 and add parentheses to it:
474
474
475 In [8]: /str 43
475 In [8]: /str 43
476 ------> str(43)
476 ------> str(43)
477 Out[8]: '43'
477 Out[8]: '43'
478
478
479 # all-random (note for auto-testing)
479 # all-random (note for auto-testing)
480 """
480 """
481
481
482 if parameter_s:
482 if parameter_s:
483 arg = int(parameter_s)
483 arg = int(parameter_s)
484 else:
484 else:
485 arg = 'toggle'
485 arg = 'toggle'
486
486
487 if not arg in (0,1,2,'toggle'):
487 if not arg in (0,1,2,'toggle'):
488 error('Valid modes: (0->Off, 1->Smart, 2->Full')
488 error('Valid modes: (0->Off, 1->Smart, 2->Full')
489 return
489 return
490
490
491 if arg in (0,1,2):
491 if arg in (0,1,2):
492 self.shell.autocall = arg
492 self.shell.autocall = arg
493 else: # toggle
493 else: # toggle
494 if self.shell.autocall:
494 if self.shell.autocall:
495 self._magic_state.autocall_save = self.shell.autocall
495 self._magic_state.autocall_save = self.shell.autocall
496 self.shell.autocall = 0
496 self.shell.autocall = 0
497 else:
497 else:
498 try:
498 try:
499 self.shell.autocall = self._magic_state.autocall_save
499 self.shell.autocall = self._magic_state.autocall_save
500 except AttributeError:
500 except AttributeError:
501 self.shell.autocall = self._magic_state.autocall_save = 1
501 self.shell.autocall = self._magic_state.autocall_save = 1
502
502
503 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
503 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
504
504
505
505
506 def magic_page(self, parameter_s=''):
506 def magic_page(self, parameter_s=''):
507 """Pretty print the object and display it through a pager.
507 """Pretty print the object and display it through a pager.
508
508
509 %page [options] OBJECT
509 %page [options] OBJECT
510
510
511 If no object is given, use _ (last output).
511 If no object is given, use _ (last output).
512
512
513 Options:
513 Options:
514
514
515 -r: page str(object), don't pretty-print it."""
515 -r: page str(object), don't pretty-print it."""
516
516
517 # After a function contributed by Olivier Aubert, slightly modified.
517 # After a function contributed by Olivier Aubert, slightly modified.
518
518
519 # Process options/args
519 # Process options/args
520 opts,args = self.parse_options(parameter_s,'r')
520 opts,args = self.parse_options(parameter_s,'r')
521 raw = 'r' in opts
521 raw = 'r' in opts
522
522
523 oname = args and args or '_'
523 oname = args and args or '_'
524 info = self._ofind(oname)
524 info = self._ofind(oname)
525 if info['found']:
525 if info['found']:
526 txt = (raw and str or pformat)( info['obj'] )
526 txt = (raw and str or pformat)( info['obj'] )
527 page.page(txt)
527 page.page(txt)
528 else:
528 else:
529 print 'Object `%s` not found' % oname
529 print 'Object `%s` not found' % oname
530
530
531 def magic_profile(self, parameter_s=''):
531 def magic_profile(self, parameter_s=''):
532 """Print your currently active IPython profile."""
532 """Print your currently active IPython profile."""
533 if self.shell.profile:
533 if self.shell.profile:
534 printpl('Current IPython profile: $self.shell.profile.')
534 printpl('Current IPython profile: $self.shell.profile.')
535 else:
535 else:
536 print 'No profile active.'
536 print 'No profile active.'
537
537
538 def magic_pinfo(self, parameter_s='', namespaces=None):
538 def magic_pinfo(self, parameter_s='', namespaces=None):
539 """Provide detailed information about an object.
539 """Provide detailed information about an object.
540
540
541 '%pinfo object' is just a synonym for object? or ?object."""
541 '%pinfo object' is just a synonym for object? or ?object."""
542
542
543 #print 'pinfo par: <%s>' % parameter_s # dbg
543 #print 'pinfo par: <%s>' % parameter_s # dbg
544
544
545
545
546 # detail_level: 0 -> obj? , 1 -> obj??
546 # detail_level: 0 -> obj? , 1 -> obj??
547 detail_level = 0
547 detail_level = 0
548 # We need to detect if we got called as 'pinfo pinfo foo', which can
548 # We need to detect if we got called as 'pinfo pinfo foo', which can
549 # happen if the user types 'pinfo foo?' at the cmd line.
549 # happen if the user types 'pinfo foo?' at the cmd line.
550 pinfo,qmark1,oname,qmark2 = \
550 pinfo,qmark1,oname,qmark2 = \
551 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
551 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
552 if pinfo or qmark1 or qmark2:
552 if pinfo or qmark1 or qmark2:
553 detail_level = 1
553 detail_level = 1
554 if "*" in oname:
554 if "*" in oname:
555 self.magic_psearch(oname)
555 self.magic_psearch(oname)
556 else:
556 else:
557 self.shell._inspect('pinfo', oname, detail_level=detail_level,
557 self.shell._inspect('pinfo', oname, detail_level=detail_level,
558 namespaces=namespaces)
558 namespaces=namespaces)
559
559
560 def magic_pinfo2(self, parameter_s='', namespaces=None):
560 def magic_pinfo2(self, parameter_s='', namespaces=None):
561 """Provide extra detailed information about an object.
561 """Provide extra detailed information about an object.
562
562
563 '%pinfo2 object' is just a synonym for object?? or ??object."""
563 '%pinfo2 object' is just a synonym for object?? or ??object."""
564 self.shell._inspect('pinfo', parameter_s, detail_level=1,
564 self.shell._inspect('pinfo', parameter_s, detail_level=1,
565 namespaces=namespaces)
565 namespaces=namespaces)
566
566
567 @testdec.skip_doctest
567 @skip_doctest
568 def magic_pdef(self, parameter_s='', namespaces=None):
568 def magic_pdef(self, parameter_s='', namespaces=None):
569 """Print the definition header for any callable object.
569 """Print the definition header for any callable object.
570
570
571 If the object is a class, print the constructor information.
571 If the object is a class, print the constructor information.
572
572
573 Examples
573 Examples
574 --------
574 --------
575 ::
575 ::
576
576
577 In [3]: %pdef urllib.urlopen
577 In [3]: %pdef urllib.urlopen
578 urllib.urlopen(url, data=None, proxies=None)
578 urllib.urlopen(url, data=None, proxies=None)
579 """
579 """
580 self._inspect('pdef',parameter_s, namespaces)
580 self._inspect('pdef',parameter_s, namespaces)
581
581
582 def magic_pdoc(self, parameter_s='', namespaces=None):
582 def magic_pdoc(self, parameter_s='', namespaces=None):
583 """Print the docstring for an object.
583 """Print the docstring for an object.
584
584
585 If the given object is a class, it will print both the class and the
585 If the given object is a class, it will print both the class and the
586 constructor docstrings."""
586 constructor docstrings."""
587 self._inspect('pdoc',parameter_s, namespaces)
587 self._inspect('pdoc',parameter_s, namespaces)
588
588
589 def magic_psource(self, parameter_s='', namespaces=None):
589 def magic_psource(self, parameter_s='', namespaces=None):
590 """Print (or run through pager) the source code for an object."""
590 """Print (or run through pager) the source code for an object."""
591 self._inspect('psource',parameter_s, namespaces)
591 self._inspect('psource',parameter_s, namespaces)
592
592
593 def magic_pfile(self, parameter_s=''):
593 def magic_pfile(self, parameter_s=''):
594 """Print (or run through pager) the file where an object is defined.
594 """Print (or run through pager) the file where an object is defined.
595
595
596 The file opens at the line where the object definition begins. IPython
596 The file opens at the line where the object definition begins. IPython
597 will honor the environment variable PAGER if set, and otherwise will
597 will honor the environment variable PAGER if set, and otherwise will
598 do its best to print the file in a convenient form.
598 do its best to print the file in a convenient form.
599
599
600 If the given argument is not an object currently defined, IPython will
600 If the given argument is not an object currently defined, IPython will
601 try to interpret it as a filename (automatically adding a .py extension
601 try to interpret it as a filename (automatically adding a .py extension
602 if needed). You can thus use %pfile as a syntax highlighting code
602 if needed). You can thus use %pfile as a syntax highlighting code
603 viewer."""
603 viewer."""
604
604
605 # first interpret argument as an object name
605 # first interpret argument as an object name
606 out = self._inspect('pfile',parameter_s)
606 out = self._inspect('pfile',parameter_s)
607 # if not, try the input as a filename
607 # if not, try the input as a filename
608 if out == 'not found':
608 if out == 'not found':
609 try:
609 try:
610 filename = get_py_filename(parameter_s)
610 filename = get_py_filename(parameter_s)
611 except IOError,msg:
611 except IOError,msg:
612 print msg
612 print msg
613 return
613 return
614 page.page(self.shell.inspector.format(file(filename).read()))
614 page.page(self.shell.inspector.format(file(filename).read()))
615
615
616 def magic_psearch(self, parameter_s=''):
616 def magic_psearch(self, parameter_s=''):
617 """Search for object in namespaces by wildcard.
617 """Search for object in namespaces by wildcard.
618
618
619 %psearch [options] PATTERN [OBJECT TYPE]
619 %psearch [options] PATTERN [OBJECT TYPE]
620
620
621 Note: ? can be used as a synonym for %psearch, at the beginning or at
621 Note: ? can be used as a synonym for %psearch, at the beginning or at
622 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
622 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
623 rest of the command line must be unchanged (options come first), so
623 rest of the command line must be unchanged (options come first), so
624 for example the following forms are equivalent
624 for example the following forms are equivalent
625
625
626 %psearch -i a* function
626 %psearch -i a* function
627 -i a* function?
627 -i a* function?
628 ?-i a* function
628 ?-i a* function
629
629
630 Arguments:
630 Arguments:
631
631
632 PATTERN
632 PATTERN
633
633
634 where PATTERN is a string containing * as a wildcard similar to its
634 where PATTERN is a string containing * as a wildcard similar to its
635 use in a shell. The pattern is matched in all namespaces on the
635 use in a shell. The pattern is matched in all namespaces on the
636 search path. By default objects starting with a single _ are not
636 search path. By default objects starting with a single _ are not
637 matched, many IPython generated objects have a single
637 matched, many IPython generated objects have a single
638 underscore. The default is case insensitive matching. Matching is
638 underscore. The default is case insensitive matching. Matching is
639 also done on the attributes of objects and not only on the objects
639 also done on the attributes of objects and not only on the objects
640 in a module.
640 in a module.
641
641
642 [OBJECT TYPE]
642 [OBJECT TYPE]
643
643
644 Is the name of a python type from the types module. The name is
644 Is the name of a python type from the types module. The name is
645 given in lowercase without the ending type, ex. StringType is
645 given in lowercase without the ending type, ex. StringType is
646 written string. By adding a type here only objects matching the
646 written string. By adding a type here only objects matching the
647 given type are matched. Using all here makes the pattern match all
647 given type are matched. Using all here makes the pattern match all
648 types (this is the default).
648 types (this is the default).
649
649
650 Options:
650 Options:
651
651
652 -a: makes the pattern match even objects whose names start with a
652 -a: makes the pattern match even objects whose names start with a
653 single underscore. These names are normally ommitted from the
653 single underscore. These names are normally ommitted from the
654 search.
654 search.
655
655
656 -i/-c: make the pattern case insensitive/sensitive. If neither of
656 -i/-c: make the pattern case insensitive/sensitive. If neither of
657 these options is given, the default is read from your ipythonrc
657 these options is given, the default is read from your ipythonrc
658 file. The option name which sets this value is
658 file. The option name which sets this value is
659 'wildcards_case_sensitive'. If this option is not specified in your
659 'wildcards_case_sensitive'. If this option is not specified in your
660 ipythonrc file, IPython's internal default is to do a case sensitive
660 ipythonrc file, IPython's internal default is to do a case sensitive
661 search.
661 search.
662
662
663 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
663 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
664 specifiy can be searched in any of the following namespaces:
664 specifiy can be searched in any of the following namespaces:
665 'builtin', 'user', 'user_global','internal', 'alias', where
665 'builtin', 'user', 'user_global','internal', 'alias', where
666 'builtin' and 'user' are the search defaults. Note that you should
666 'builtin' and 'user' are the search defaults. Note that you should
667 not use quotes when specifying namespaces.
667 not use quotes when specifying namespaces.
668
668
669 'Builtin' contains the python module builtin, 'user' contains all
669 'Builtin' contains the python module builtin, 'user' contains all
670 user data, 'alias' only contain the shell aliases and no python
670 user data, 'alias' only contain the shell aliases and no python
671 objects, 'internal' contains objects used by IPython. The
671 objects, 'internal' contains objects used by IPython. The
672 'user_global' namespace is only used by embedded IPython instances,
672 'user_global' namespace is only used by embedded IPython instances,
673 and it contains module-level globals. You can add namespaces to the
673 and it contains module-level globals. You can add namespaces to the
674 search with -s or exclude them with -e (these options can be given
674 search with -s or exclude them with -e (these options can be given
675 more than once).
675 more than once).
676
676
677 Examples:
677 Examples:
678
678
679 %psearch a* -> objects beginning with an a
679 %psearch a* -> objects beginning with an a
680 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
680 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
681 %psearch a* function -> all functions beginning with an a
681 %psearch a* function -> all functions beginning with an a
682 %psearch re.e* -> objects beginning with an e in module re
682 %psearch re.e* -> objects beginning with an e in module re
683 %psearch r*.e* -> objects that start with e in modules starting in r
683 %psearch r*.e* -> objects that start with e in modules starting in r
684 %psearch r*.* string -> all strings in modules beginning with r
684 %psearch r*.* string -> all strings in modules beginning with r
685
685
686 Case sensitve search:
686 Case sensitve search:
687
687
688 %psearch -c a* list all object beginning with lower case a
688 %psearch -c a* list all object beginning with lower case a
689
689
690 Show objects beginning with a single _:
690 Show objects beginning with a single _:
691
691
692 %psearch -a _* list objects beginning with a single underscore"""
692 %psearch -a _* list objects beginning with a single underscore"""
693 try:
693 try:
694 parameter_s = parameter_s.encode('ascii')
694 parameter_s = parameter_s.encode('ascii')
695 except UnicodeEncodeError:
695 except UnicodeEncodeError:
696 print 'Python identifiers can only contain ascii characters.'
696 print 'Python identifiers can only contain ascii characters.'
697 return
697 return
698
698
699 # default namespaces to be searched
699 # default namespaces to be searched
700 def_search = ['user','builtin']
700 def_search = ['user','builtin']
701
701
702 # Process options/args
702 # Process options/args
703 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
703 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
704 opt = opts.get
704 opt = opts.get
705 shell = self.shell
705 shell = self.shell
706 psearch = shell.inspector.psearch
706 psearch = shell.inspector.psearch
707
707
708 # select case options
708 # select case options
709 if opts.has_key('i'):
709 if opts.has_key('i'):
710 ignore_case = True
710 ignore_case = True
711 elif opts.has_key('c'):
711 elif opts.has_key('c'):
712 ignore_case = False
712 ignore_case = False
713 else:
713 else:
714 ignore_case = not shell.wildcards_case_sensitive
714 ignore_case = not shell.wildcards_case_sensitive
715
715
716 # Build list of namespaces to search from user options
716 # Build list of namespaces to search from user options
717 def_search.extend(opt('s',[]))
717 def_search.extend(opt('s',[]))
718 ns_exclude = ns_exclude=opt('e',[])
718 ns_exclude = ns_exclude=opt('e',[])
719 ns_search = [nm for nm in def_search if nm not in ns_exclude]
719 ns_search = [nm for nm in def_search if nm not in ns_exclude]
720
720
721 # Call the actual search
721 # Call the actual search
722 try:
722 try:
723 psearch(args,shell.ns_table,ns_search,
723 psearch(args,shell.ns_table,ns_search,
724 show_all=opt('a'),ignore_case=ignore_case)
724 show_all=opt('a'),ignore_case=ignore_case)
725 except:
725 except:
726 shell.showtraceback()
726 shell.showtraceback()
727
727
728 @testdec.skip_doctest
728 @skip_doctest
729 def magic_who_ls(self, parameter_s=''):
729 def magic_who_ls(self, parameter_s=''):
730 """Return a sorted list of all interactive variables.
730 """Return a sorted list of all interactive variables.
731
731
732 If arguments are given, only variables of types matching these
732 If arguments are given, only variables of types matching these
733 arguments are returned.
733 arguments are returned.
734
734
735 Examples
735 Examples
736 --------
736 --------
737
737
738 Define two variables and list them with who_ls::
738 Define two variables and list them with who_ls::
739
739
740 In [1]: alpha = 123
740 In [1]: alpha = 123
741
741
742 In [2]: beta = 'test'
742 In [2]: beta = 'test'
743
743
744 In [3]: %who_ls
744 In [3]: %who_ls
745 Out[3]: ['alpha', 'beta']
745 Out[3]: ['alpha', 'beta']
746
746
747 In [4]: %who_ls int
747 In [4]: %who_ls int
748 Out[4]: ['alpha']
748 Out[4]: ['alpha']
749
749
750 In [5]: %who_ls str
750 In [5]: %who_ls str
751 Out[5]: ['beta']
751 Out[5]: ['beta']
752 """
752 """
753
753
754 user_ns = self.shell.user_ns
754 user_ns = self.shell.user_ns
755 internal_ns = self.shell.internal_ns
755 internal_ns = self.shell.internal_ns
756 user_ns_hidden = self.shell.user_ns_hidden
756 user_ns_hidden = self.shell.user_ns_hidden
757 out = [ i for i in user_ns
757 out = [ i for i in user_ns
758 if not i.startswith('_') \
758 if not i.startswith('_') \
759 and not (i in internal_ns or i in user_ns_hidden) ]
759 and not (i in internal_ns or i in user_ns_hidden) ]
760
760
761 typelist = parameter_s.split()
761 typelist = parameter_s.split()
762 if typelist:
762 if typelist:
763 typeset = set(typelist)
763 typeset = set(typelist)
764 out = [i for i in out if type(user_ns[i]).__name__ in typeset]
764 out = [i for i in out if type(user_ns[i]).__name__ in typeset]
765
765
766 out.sort()
766 out.sort()
767 return out
767 return out
768
768
769 @testdec.skip_doctest
769 @skip_doctest
770 def magic_who(self, parameter_s=''):
770 def magic_who(self, parameter_s=''):
771 """Print all interactive variables, with some minimal formatting.
771 """Print all interactive variables, with some minimal formatting.
772
772
773 If any arguments are given, only variables whose type matches one of
773 If any arguments are given, only variables whose type matches one of
774 these are printed. For example:
774 these are printed. For example:
775
775
776 %who function str
776 %who function str
777
777
778 will only list functions and strings, excluding all other types of
778 will only list functions and strings, excluding all other types of
779 variables. To find the proper type names, simply use type(var) at a
779 variables. To find the proper type names, simply use type(var) at a
780 command line to see how python prints type names. For example:
780 command line to see how python prints type names. For example:
781
781
782 In [1]: type('hello')\\
782 In [1]: type('hello')\\
783 Out[1]: <type 'str'>
783 Out[1]: <type 'str'>
784
784
785 indicates that the type name for strings is 'str'.
785 indicates that the type name for strings is 'str'.
786
786
787 %who always excludes executed names loaded through your configuration
787 %who always excludes executed names loaded through your configuration
788 file and things which are internal to IPython.
788 file and things which are internal to IPython.
789
789
790 This is deliberate, as typically you may load many modules and the
790 This is deliberate, as typically you may load many modules and the
791 purpose of %who is to show you only what you've manually defined.
791 purpose of %who is to show you only what you've manually defined.
792
792
793 Examples
793 Examples
794 --------
794 --------
795
795
796 Define two variables and list them with who::
796 Define two variables and list them with who::
797
797
798 In [1]: alpha = 123
798 In [1]: alpha = 123
799
799
800 In [2]: beta = 'test'
800 In [2]: beta = 'test'
801
801
802 In [3]: %who
802 In [3]: %who
803 alpha beta
803 alpha beta
804
804
805 In [4]: %who int
805 In [4]: %who int
806 alpha
806 alpha
807
807
808 In [5]: %who str
808 In [5]: %who str
809 beta
809 beta
810 """
810 """
811
811
812 varlist = self.magic_who_ls(parameter_s)
812 varlist = self.magic_who_ls(parameter_s)
813 if not varlist:
813 if not varlist:
814 if parameter_s:
814 if parameter_s:
815 print 'No variables match your requested type.'
815 print 'No variables match your requested type.'
816 else:
816 else:
817 print 'Interactive namespace is empty.'
817 print 'Interactive namespace is empty.'
818 return
818 return
819
819
820 # if we have variables, move on...
820 # if we have variables, move on...
821 count = 0
821 count = 0
822 for i in varlist:
822 for i in varlist:
823 print i+'\t',
823 print i+'\t',
824 count += 1
824 count += 1
825 if count > 8:
825 if count > 8:
826 count = 0
826 count = 0
827 print
827 print
828 print
828 print
829
829
830 @testdec.skip_doctest
830 @skip_doctest
831 def magic_whos(self, parameter_s=''):
831 def magic_whos(self, parameter_s=''):
832 """Like %who, but gives some extra information about each variable.
832 """Like %who, but gives some extra information about each variable.
833
833
834 The same type filtering of %who can be applied here.
834 The same type filtering of %who can be applied here.
835
835
836 For all variables, the type is printed. Additionally it prints:
836 For all variables, the type is printed. Additionally it prints:
837
837
838 - For {},[],(): their length.
838 - For {},[],(): their length.
839
839
840 - For numpy arrays, a summary with shape, number of
840 - For numpy arrays, a summary with shape, number of
841 elements, typecode and size in memory.
841 elements, typecode and size in memory.
842
842
843 - Everything else: a string representation, snipping their middle if
843 - Everything else: a string representation, snipping their middle if
844 too long.
844 too long.
845
845
846 Examples
846 Examples
847 --------
847 --------
848
848
849 Define two variables and list them with whos::
849 Define two variables and list them with whos::
850
850
851 In [1]: alpha = 123
851 In [1]: alpha = 123
852
852
853 In [2]: beta = 'test'
853 In [2]: beta = 'test'
854
854
855 In [3]: %whos
855 In [3]: %whos
856 Variable Type Data/Info
856 Variable Type Data/Info
857 --------------------------------
857 --------------------------------
858 alpha int 123
858 alpha int 123
859 beta str test
859 beta str test
860 """
860 """
861
861
862 varnames = self.magic_who_ls(parameter_s)
862 varnames = self.magic_who_ls(parameter_s)
863 if not varnames:
863 if not varnames:
864 if parameter_s:
864 if parameter_s:
865 print 'No variables match your requested type.'
865 print 'No variables match your requested type.'
866 else:
866 else:
867 print 'Interactive namespace is empty.'
867 print 'Interactive namespace is empty.'
868 return
868 return
869
869
870 # if we have variables, move on...
870 # if we have variables, move on...
871
871
872 # for these types, show len() instead of data:
872 # for these types, show len() instead of data:
873 seq_types = ['dict', 'list', 'tuple']
873 seq_types = ['dict', 'list', 'tuple']
874
874
875 # for numpy/Numeric arrays, display summary info
875 # for numpy/Numeric arrays, display summary info
876 try:
876 try:
877 import numpy
877 import numpy
878 except ImportError:
878 except ImportError:
879 ndarray_type = None
879 ndarray_type = None
880 else:
880 else:
881 ndarray_type = numpy.ndarray.__name__
881 ndarray_type = numpy.ndarray.__name__
882 try:
882 try:
883 import Numeric
883 import Numeric
884 except ImportError:
884 except ImportError:
885 array_type = None
885 array_type = None
886 else:
886 else:
887 array_type = Numeric.ArrayType.__name__
887 array_type = Numeric.ArrayType.__name__
888
888
889 # Find all variable names and types so we can figure out column sizes
889 # Find all variable names and types so we can figure out column sizes
890 def get_vars(i):
890 def get_vars(i):
891 return self.shell.user_ns[i]
891 return self.shell.user_ns[i]
892
892
893 # some types are well known and can be shorter
893 # some types are well known and can be shorter
894 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
894 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
895 def type_name(v):
895 def type_name(v):
896 tn = type(v).__name__
896 tn = type(v).__name__
897 return abbrevs.get(tn,tn)
897 return abbrevs.get(tn,tn)
898
898
899 varlist = map(get_vars,varnames)
899 varlist = map(get_vars,varnames)
900
900
901 typelist = []
901 typelist = []
902 for vv in varlist:
902 for vv in varlist:
903 tt = type_name(vv)
903 tt = type_name(vv)
904
904
905 if tt=='instance':
905 if tt=='instance':
906 typelist.append( abbrevs.get(str(vv.__class__),
906 typelist.append( abbrevs.get(str(vv.__class__),
907 str(vv.__class__)))
907 str(vv.__class__)))
908 else:
908 else:
909 typelist.append(tt)
909 typelist.append(tt)
910
910
911 # column labels and # of spaces as separator
911 # column labels and # of spaces as separator
912 varlabel = 'Variable'
912 varlabel = 'Variable'
913 typelabel = 'Type'
913 typelabel = 'Type'
914 datalabel = 'Data/Info'
914 datalabel = 'Data/Info'
915 colsep = 3
915 colsep = 3
916 # variable format strings
916 # variable format strings
917 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
917 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
918 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
918 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
919 aformat = "%s: %s elems, type `%s`, %s bytes"
919 aformat = "%s: %s elems, type `%s`, %s bytes"
920 # find the size of the columns to format the output nicely
920 # find the size of the columns to format the output nicely
921 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
921 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
922 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
922 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
923 # table header
923 # table header
924 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
924 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
925 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
925 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
926 # and the table itself
926 # and the table itself
927 kb = 1024
927 kb = 1024
928 Mb = 1048576 # kb**2
928 Mb = 1048576 # kb**2
929 for vname,var,vtype in zip(varnames,varlist,typelist):
929 for vname,var,vtype in zip(varnames,varlist,typelist):
930 print itpl(vformat),
930 print itpl(vformat),
931 if vtype in seq_types:
931 if vtype in seq_types:
932 print "n="+str(len(var))
932 print "n="+str(len(var))
933 elif vtype in [array_type,ndarray_type]:
933 elif vtype in [array_type,ndarray_type]:
934 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
934 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
935 if vtype==ndarray_type:
935 if vtype==ndarray_type:
936 # numpy
936 # numpy
937 vsize = var.size
937 vsize = var.size
938 vbytes = vsize*var.itemsize
938 vbytes = vsize*var.itemsize
939 vdtype = var.dtype
939 vdtype = var.dtype
940 else:
940 else:
941 # Numeric
941 # Numeric
942 vsize = Numeric.size(var)
942 vsize = Numeric.size(var)
943 vbytes = vsize*var.itemsize()
943 vbytes = vsize*var.itemsize()
944 vdtype = var.typecode()
944 vdtype = var.typecode()
945
945
946 if vbytes < 100000:
946 if vbytes < 100000:
947 print aformat % (vshape,vsize,vdtype,vbytes)
947 print aformat % (vshape,vsize,vdtype,vbytes)
948 else:
948 else:
949 print aformat % (vshape,vsize,vdtype,vbytes),
949 print aformat % (vshape,vsize,vdtype,vbytes),
950 if vbytes < Mb:
950 if vbytes < Mb:
951 print '(%s kb)' % (vbytes/kb,)
951 print '(%s kb)' % (vbytes/kb,)
952 else:
952 else:
953 print '(%s Mb)' % (vbytes/Mb,)
953 print '(%s Mb)' % (vbytes/Mb,)
954 else:
954 else:
955 try:
955 try:
956 vstr = str(var)
956 vstr = str(var)
957 except UnicodeEncodeError:
957 except UnicodeEncodeError:
958 vstr = unicode(var).encode(sys.getdefaultencoding(),
958 vstr = unicode(var).encode(sys.getdefaultencoding(),
959 'backslashreplace')
959 'backslashreplace')
960 vstr = vstr.replace('\n','\\n')
960 vstr = vstr.replace('\n','\\n')
961 if len(vstr) < 50:
961 if len(vstr) < 50:
962 print vstr
962 print vstr
963 else:
963 else:
964 printpl(vfmt_short)
964 printpl(vfmt_short)
965
965
966 def magic_reset(self, parameter_s=''):
966 def magic_reset(self, parameter_s=''):
967 """Resets the namespace by removing all names defined by the user.
967 """Resets the namespace by removing all names defined by the user.
968
968
969 Parameters
969 Parameters
970 ----------
970 ----------
971 -f : force reset without asking for confirmation.
971 -f : force reset without asking for confirmation.
972
972
973 -s : 'Soft' reset: Only clears your namespace, leaving history intact.
973 -s : 'Soft' reset: Only clears your namespace, leaving history intact.
974 References to objects may be kept. By default (without this option),
974 References to objects may be kept. By default (without this option),
975 we do a 'hard' reset, giving you a new session and removing all
975 we do a 'hard' reset, giving you a new session and removing all
976 references to objects from the current session.
976 references to objects from the current session.
977
977
978 Examples
978 Examples
979 --------
979 --------
980 In [6]: a = 1
980 In [6]: a = 1
981
981
982 In [7]: a
982 In [7]: a
983 Out[7]: 1
983 Out[7]: 1
984
984
985 In [8]: 'a' in _ip.user_ns
985 In [8]: 'a' in _ip.user_ns
986 Out[8]: True
986 Out[8]: True
987
987
988 In [9]: %reset -f
988 In [9]: %reset -f
989
989
990 In [1]: 'a' in _ip.user_ns
990 In [1]: 'a' in _ip.user_ns
991 Out[1]: False
991 Out[1]: False
992 """
992 """
993 opts, args = self.parse_options(parameter_s,'sf')
993 opts, args = self.parse_options(parameter_s,'sf')
994 if 'f' in opts:
994 if 'f' in opts:
995 ans = True
995 ans = True
996 else:
996 else:
997 ans = self.shell.ask_yes_no(
997 ans = self.shell.ask_yes_no(
998 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
998 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
999 if not ans:
999 if not ans:
1000 print 'Nothing done.'
1000 print 'Nothing done.'
1001 return
1001 return
1002
1002
1003 if 's' in opts: # Soft reset
1003 if 's' in opts: # Soft reset
1004 user_ns = self.shell.user_ns
1004 user_ns = self.shell.user_ns
1005 for i in self.magic_who_ls():
1005 for i in self.magic_who_ls():
1006 del(user_ns[i])
1006 del(user_ns[i])
1007
1007
1008 else: # Hard reset
1008 else: # Hard reset
1009 self.shell.reset(new_session = False)
1009 self.shell.reset(new_session = False)
1010
1010
1011
1011
1012
1012
1013 def magic_reset_selective(self, parameter_s=''):
1013 def magic_reset_selective(self, parameter_s=''):
1014 """Resets the namespace by removing names defined by the user.
1014 """Resets the namespace by removing names defined by the user.
1015
1015
1016 Input/Output history are left around in case you need them.
1016 Input/Output history are left around in case you need them.
1017
1017
1018 %reset_selective [-f] regex
1018 %reset_selective [-f] regex
1019
1019
1020 No action is taken if regex is not included
1020 No action is taken if regex is not included
1021
1021
1022 Options
1022 Options
1023 -f : force reset without asking for confirmation.
1023 -f : force reset without asking for confirmation.
1024
1024
1025 Examples
1025 Examples
1026 --------
1026 --------
1027
1027
1028 We first fully reset the namespace so your output looks identical to
1028 We first fully reset the namespace so your output looks identical to
1029 this example for pedagogical reasons; in practice you do not need a
1029 this example for pedagogical reasons; in practice you do not need a
1030 full reset.
1030 full reset.
1031
1031
1032 In [1]: %reset -f
1032 In [1]: %reset -f
1033
1033
1034 Now, with a clean namespace we can make a few variables and use
1034 Now, with a clean namespace we can make a few variables and use
1035 %reset_selective to only delete names that match our regexp:
1035 %reset_selective to only delete names that match our regexp:
1036
1036
1037 In [2]: a=1; b=2; c=3; b1m=4; b2m=5; b3m=6; b4m=7; b2s=8
1037 In [2]: a=1; b=2; c=3; b1m=4; b2m=5; b3m=6; b4m=7; b2s=8
1038
1038
1039 In [3]: who_ls
1039 In [3]: who_ls
1040 Out[3]: ['a', 'b', 'b1m', 'b2m', 'b2s', 'b3m', 'b4m', 'c']
1040 Out[3]: ['a', 'b', 'b1m', 'b2m', 'b2s', 'b3m', 'b4m', 'c']
1041
1041
1042 In [4]: %reset_selective -f b[2-3]m
1042 In [4]: %reset_selective -f b[2-3]m
1043
1043
1044 In [5]: who_ls
1044 In [5]: who_ls
1045 Out[5]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1045 Out[5]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1046
1046
1047 In [6]: %reset_selective -f d
1047 In [6]: %reset_selective -f d
1048
1048
1049 In [7]: who_ls
1049 In [7]: who_ls
1050 Out[7]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1050 Out[7]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1051
1051
1052 In [8]: %reset_selective -f c
1052 In [8]: %reset_selective -f c
1053
1053
1054 In [9]: who_ls
1054 In [9]: who_ls
1055 Out[9]: ['a', 'b', 'b1m', 'b2s', 'b4m']
1055 Out[9]: ['a', 'b', 'b1m', 'b2s', 'b4m']
1056
1056
1057 In [10]: %reset_selective -f b
1057 In [10]: %reset_selective -f b
1058
1058
1059 In [11]: who_ls
1059 In [11]: who_ls
1060 Out[11]: ['a']
1060 Out[11]: ['a']
1061 """
1061 """
1062
1062
1063 opts, regex = self.parse_options(parameter_s,'f')
1063 opts, regex = self.parse_options(parameter_s,'f')
1064
1064
1065 if opts.has_key('f'):
1065 if opts.has_key('f'):
1066 ans = True
1066 ans = True
1067 else:
1067 else:
1068 ans = self.shell.ask_yes_no(
1068 ans = self.shell.ask_yes_no(
1069 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1069 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1070 if not ans:
1070 if not ans:
1071 print 'Nothing done.'
1071 print 'Nothing done.'
1072 return
1072 return
1073 user_ns = self.shell.user_ns
1073 user_ns = self.shell.user_ns
1074 if not regex:
1074 if not regex:
1075 print 'No regex pattern specified. Nothing done.'
1075 print 'No regex pattern specified. Nothing done.'
1076 return
1076 return
1077 else:
1077 else:
1078 try:
1078 try:
1079 m = re.compile(regex)
1079 m = re.compile(regex)
1080 except TypeError:
1080 except TypeError:
1081 raise TypeError('regex must be a string or compiled pattern')
1081 raise TypeError('regex must be a string or compiled pattern')
1082 for i in self.magic_who_ls():
1082 for i in self.magic_who_ls():
1083 if m.search(i):
1083 if m.search(i):
1084 del(user_ns[i])
1084 del(user_ns[i])
1085
1085
1086 def magic_logstart(self,parameter_s=''):
1086 def magic_logstart(self,parameter_s=''):
1087 """Start logging anywhere in a session.
1087 """Start logging anywhere in a session.
1088
1088
1089 %logstart [-o|-r|-t] [log_name [log_mode]]
1089 %logstart [-o|-r|-t] [log_name [log_mode]]
1090
1090
1091 If no name is given, it defaults to a file named 'ipython_log.py' in your
1091 If no name is given, it defaults to a file named 'ipython_log.py' in your
1092 current directory, in 'rotate' mode (see below).
1092 current directory, in 'rotate' mode (see below).
1093
1093
1094 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1094 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1095 history up to that point and then continues logging.
1095 history up to that point and then continues logging.
1096
1096
1097 %logstart takes a second optional parameter: logging mode. This can be one
1097 %logstart takes a second optional parameter: logging mode. This can be one
1098 of (note that the modes are given unquoted):\\
1098 of (note that the modes are given unquoted):\\
1099 append: well, that says it.\\
1099 append: well, that says it.\\
1100 backup: rename (if exists) to name~ and start name.\\
1100 backup: rename (if exists) to name~ and start name.\\
1101 global: single logfile in your home dir, appended to.\\
1101 global: single logfile in your home dir, appended to.\\
1102 over : overwrite existing log.\\
1102 over : overwrite existing log.\\
1103 rotate: create rotating logs name.1~, name.2~, etc.
1103 rotate: create rotating logs name.1~, name.2~, etc.
1104
1104
1105 Options:
1105 Options:
1106
1106
1107 -o: log also IPython's output. In this mode, all commands which
1107 -o: log also IPython's output. In this mode, all commands which
1108 generate an Out[NN] prompt are recorded to the logfile, right after
1108 generate an Out[NN] prompt are recorded to the logfile, right after
1109 their corresponding input line. The output lines are always
1109 their corresponding input line. The output lines are always
1110 prepended with a '#[Out]# ' marker, so that the log remains valid
1110 prepended with a '#[Out]# ' marker, so that the log remains valid
1111 Python code.
1111 Python code.
1112
1112
1113 Since this marker is always the same, filtering only the output from
1113 Since this marker is always the same, filtering only the output from
1114 a log is very easy, using for example a simple awk call:
1114 a log is very easy, using for example a simple awk call:
1115
1115
1116 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1116 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1117
1117
1118 -r: log 'raw' input. Normally, IPython's logs contain the processed
1118 -r: log 'raw' input. Normally, IPython's logs contain the processed
1119 input, so that user lines are logged in their final form, converted
1119 input, so that user lines are logged in their final form, converted
1120 into valid Python. For example, %Exit is logged as
1120 into valid Python. For example, %Exit is logged as
1121 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1121 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1122 exactly as typed, with no transformations applied.
1122 exactly as typed, with no transformations applied.
1123
1123
1124 -t: put timestamps before each input line logged (these are put in
1124 -t: put timestamps before each input line logged (these are put in
1125 comments)."""
1125 comments)."""
1126
1126
1127 opts,par = self.parse_options(parameter_s,'ort')
1127 opts,par = self.parse_options(parameter_s,'ort')
1128 log_output = 'o' in opts
1128 log_output = 'o' in opts
1129 log_raw_input = 'r' in opts
1129 log_raw_input = 'r' in opts
1130 timestamp = 't' in opts
1130 timestamp = 't' in opts
1131
1131
1132 logger = self.shell.logger
1132 logger = self.shell.logger
1133
1133
1134 # if no args are given, the defaults set in the logger constructor by
1134 # if no args are given, the defaults set in the logger constructor by
1135 # ipytohn remain valid
1135 # ipytohn remain valid
1136 if par:
1136 if par:
1137 try:
1137 try:
1138 logfname,logmode = par.split()
1138 logfname,logmode = par.split()
1139 except:
1139 except:
1140 logfname = par
1140 logfname = par
1141 logmode = 'backup'
1141 logmode = 'backup'
1142 else:
1142 else:
1143 logfname = logger.logfname
1143 logfname = logger.logfname
1144 logmode = logger.logmode
1144 logmode = logger.logmode
1145 # put logfname into rc struct as if it had been called on the command
1145 # put logfname into rc struct as if it had been called on the command
1146 # line, so it ends up saved in the log header Save it in case we need
1146 # line, so it ends up saved in the log header Save it in case we need
1147 # to restore it...
1147 # to restore it...
1148 old_logfile = self.shell.logfile
1148 old_logfile = self.shell.logfile
1149 if logfname:
1149 if logfname:
1150 logfname = os.path.expanduser(logfname)
1150 logfname = os.path.expanduser(logfname)
1151 self.shell.logfile = logfname
1151 self.shell.logfile = logfname
1152
1152
1153 loghead = '# IPython log file\n\n'
1153 loghead = '# IPython log file\n\n'
1154 try:
1154 try:
1155 started = logger.logstart(logfname,loghead,logmode,
1155 started = logger.logstart(logfname,loghead,logmode,
1156 log_output,timestamp,log_raw_input)
1156 log_output,timestamp,log_raw_input)
1157 except:
1157 except:
1158 self.shell.logfile = old_logfile
1158 self.shell.logfile = old_logfile
1159 warn("Couldn't start log: %s" % sys.exc_info()[1])
1159 warn("Couldn't start log: %s" % sys.exc_info()[1])
1160 else:
1160 else:
1161 # log input history up to this point, optionally interleaving
1161 # log input history up to this point, optionally interleaving
1162 # output if requested
1162 # output if requested
1163
1163
1164 if timestamp:
1164 if timestamp:
1165 # disable timestamping for the previous history, since we've
1165 # disable timestamping for the previous history, since we've
1166 # lost those already (no time machine here).
1166 # lost those already (no time machine here).
1167 logger.timestamp = False
1167 logger.timestamp = False
1168
1168
1169 if log_raw_input:
1169 if log_raw_input:
1170 input_hist = self.shell.history_manager.input_hist_raw
1170 input_hist = self.shell.history_manager.input_hist_raw
1171 else:
1171 else:
1172 input_hist = self.shell.history_manager.input_hist_parsed
1172 input_hist = self.shell.history_manager.input_hist_parsed
1173
1173
1174 if log_output:
1174 if log_output:
1175 log_write = logger.log_write
1175 log_write = logger.log_write
1176 output_hist = self.shell.history_manager.output_hist
1176 output_hist = self.shell.history_manager.output_hist
1177 for n in range(1,len(input_hist)-1):
1177 for n in range(1,len(input_hist)-1):
1178 log_write(input_hist[n].rstrip())
1178 log_write(input_hist[n].rstrip())
1179 if n in output_hist:
1179 if n in output_hist:
1180 log_write(repr(output_hist[n]),'output')
1180 log_write(repr(output_hist[n]),'output')
1181 else:
1181 else:
1182 logger.log_write(''.join(input_hist[1:]))
1182 logger.log_write(''.join(input_hist[1:]))
1183 if timestamp:
1183 if timestamp:
1184 # re-enable timestamping
1184 # re-enable timestamping
1185 logger.timestamp = True
1185 logger.timestamp = True
1186
1186
1187 print ('Activating auto-logging. '
1187 print ('Activating auto-logging. '
1188 'Current session state plus future input saved.')
1188 'Current session state plus future input saved.')
1189 logger.logstate()
1189 logger.logstate()
1190
1190
1191 def magic_logstop(self,parameter_s=''):
1191 def magic_logstop(self,parameter_s=''):
1192 """Fully stop logging and close log file.
1192 """Fully stop logging and close log file.
1193
1193
1194 In order to start logging again, a new %logstart call needs to be made,
1194 In order to start logging again, a new %logstart call needs to be made,
1195 possibly (though not necessarily) with a new filename, mode and other
1195 possibly (though not necessarily) with a new filename, mode and other
1196 options."""
1196 options."""
1197 self.logger.logstop()
1197 self.logger.logstop()
1198
1198
1199 def magic_logoff(self,parameter_s=''):
1199 def magic_logoff(self,parameter_s=''):
1200 """Temporarily stop logging.
1200 """Temporarily stop logging.
1201
1201
1202 You must have previously started logging."""
1202 You must have previously started logging."""
1203 self.shell.logger.switch_log(0)
1203 self.shell.logger.switch_log(0)
1204
1204
1205 def magic_logon(self,parameter_s=''):
1205 def magic_logon(self,parameter_s=''):
1206 """Restart logging.
1206 """Restart logging.
1207
1207
1208 This function is for restarting logging which you've temporarily
1208 This function is for restarting logging which you've temporarily
1209 stopped with %logoff. For starting logging for the first time, you
1209 stopped with %logoff. For starting logging for the first time, you
1210 must use the %logstart function, which allows you to specify an
1210 must use the %logstart function, which allows you to specify an
1211 optional log filename."""
1211 optional log filename."""
1212
1212
1213 self.shell.logger.switch_log(1)
1213 self.shell.logger.switch_log(1)
1214
1214
1215 def magic_logstate(self,parameter_s=''):
1215 def magic_logstate(self,parameter_s=''):
1216 """Print the status of the logging system."""
1216 """Print the status of the logging system."""
1217
1217
1218 self.shell.logger.logstate()
1218 self.shell.logger.logstate()
1219
1219
1220 def magic_pdb(self, parameter_s=''):
1220 def magic_pdb(self, parameter_s=''):
1221 """Control the automatic calling of the pdb interactive debugger.
1221 """Control the automatic calling of the pdb interactive debugger.
1222
1222
1223 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1223 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1224 argument it works as a toggle.
1224 argument it works as a toggle.
1225
1225
1226 When an exception is triggered, IPython can optionally call the
1226 When an exception is triggered, IPython can optionally call the
1227 interactive pdb debugger after the traceback printout. %pdb toggles
1227 interactive pdb debugger after the traceback printout. %pdb toggles
1228 this feature on and off.
1228 this feature on and off.
1229
1229
1230 The initial state of this feature is set in your ipythonrc
1230 The initial state of this feature is set in your ipythonrc
1231 configuration file (the variable is called 'pdb').
1231 configuration file (the variable is called 'pdb').
1232
1232
1233 If you want to just activate the debugger AFTER an exception has fired,
1233 If you want to just activate the debugger AFTER an exception has fired,
1234 without having to type '%pdb on' and rerunning your code, you can use
1234 without having to type '%pdb on' and rerunning your code, you can use
1235 the %debug magic."""
1235 the %debug magic."""
1236
1236
1237 par = parameter_s.strip().lower()
1237 par = parameter_s.strip().lower()
1238
1238
1239 if par:
1239 if par:
1240 try:
1240 try:
1241 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1241 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1242 except KeyError:
1242 except KeyError:
1243 print ('Incorrect argument. Use on/1, off/0, '
1243 print ('Incorrect argument. Use on/1, off/0, '
1244 'or nothing for a toggle.')
1244 'or nothing for a toggle.')
1245 return
1245 return
1246 else:
1246 else:
1247 # toggle
1247 # toggle
1248 new_pdb = not self.shell.call_pdb
1248 new_pdb = not self.shell.call_pdb
1249
1249
1250 # set on the shell
1250 # set on the shell
1251 self.shell.call_pdb = new_pdb
1251 self.shell.call_pdb = new_pdb
1252 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1252 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1253
1253
1254 def magic_debug(self, parameter_s=''):
1254 def magic_debug(self, parameter_s=''):
1255 """Activate the interactive debugger in post-mortem mode.
1255 """Activate the interactive debugger in post-mortem mode.
1256
1256
1257 If an exception has just occurred, this lets you inspect its stack
1257 If an exception has just occurred, this lets you inspect its stack
1258 frames interactively. Note that this will always work only on the last
1258 frames interactively. Note that this will always work only on the last
1259 traceback that occurred, so you must call this quickly after an
1259 traceback that occurred, so you must call this quickly after an
1260 exception that you wish to inspect has fired, because if another one
1260 exception that you wish to inspect has fired, because if another one
1261 occurs, it clobbers the previous one.
1261 occurs, it clobbers the previous one.
1262
1262
1263 If you want IPython to automatically do this on every exception, see
1263 If you want IPython to automatically do this on every exception, see
1264 the %pdb magic for more details.
1264 the %pdb magic for more details.
1265 """
1265 """
1266 self.shell.debugger(force=True)
1266 self.shell.debugger(force=True)
1267
1267
1268 @testdec.skip_doctest
1268 @skip_doctest
1269 def magic_prun(self, parameter_s ='',user_mode=1,
1269 def magic_prun(self, parameter_s ='',user_mode=1,
1270 opts=None,arg_lst=None,prog_ns=None):
1270 opts=None,arg_lst=None,prog_ns=None):
1271
1271
1272 """Run a statement through the python code profiler.
1272 """Run a statement through the python code profiler.
1273
1273
1274 Usage:
1274 Usage:
1275 %prun [options] statement
1275 %prun [options] statement
1276
1276
1277 The given statement (which doesn't require quote marks) is run via the
1277 The given statement (which doesn't require quote marks) is run via the
1278 python profiler in a manner similar to the profile.run() function.
1278 python profiler in a manner similar to the profile.run() function.
1279 Namespaces are internally managed to work correctly; profile.run
1279 Namespaces are internally managed to work correctly; profile.run
1280 cannot be used in IPython because it makes certain assumptions about
1280 cannot be used in IPython because it makes certain assumptions about
1281 namespaces which do not hold under IPython.
1281 namespaces which do not hold under IPython.
1282
1282
1283 Options:
1283 Options:
1284
1284
1285 -l <limit>: you can place restrictions on what or how much of the
1285 -l <limit>: you can place restrictions on what or how much of the
1286 profile gets printed. The limit value can be:
1286 profile gets printed. The limit value can be:
1287
1287
1288 * A string: only information for function names containing this string
1288 * A string: only information for function names containing this string
1289 is printed.
1289 is printed.
1290
1290
1291 * An integer: only these many lines are printed.
1291 * An integer: only these many lines are printed.
1292
1292
1293 * A float (between 0 and 1): this fraction of the report is printed
1293 * A float (between 0 and 1): this fraction of the report is printed
1294 (for example, use a limit of 0.4 to see the topmost 40% only).
1294 (for example, use a limit of 0.4 to see the topmost 40% only).
1295
1295
1296 You can combine several limits with repeated use of the option. For
1296 You can combine several limits with repeated use of the option. For
1297 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1297 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1298 information about class constructors.
1298 information about class constructors.
1299
1299
1300 -r: return the pstats.Stats object generated by the profiling. This
1300 -r: return the pstats.Stats object generated by the profiling. This
1301 object has all the information about the profile in it, and you can
1301 object has all the information about the profile in it, and you can
1302 later use it for further analysis or in other functions.
1302 later use it for further analysis or in other functions.
1303
1303
1304 -s <key>: sort profile by given key. You can provide more than one key
1304 -s <key>: sort profile by given key. You can provide more than one key
1305 by using the option several times: '-s key1 -s key2 -s key3...'. The
1305 by using the option several times: '-s key1 -s key2 -s key3...'. The
1306 default sorting key is 'time'.
1306 default sorting key is 'time'.
1307
1307
1308 The following is copied verbatim from the profile documentation
1308 The following is copied verbatim from the profile documentation
1309 referenced below:
1309 referenced below:
1310
1310
1311 When more than one key is provided, additional keys are used as
1311 When more than one key is provided, additional keys are used as
1312 secondary criteria when the there is equality in all keys selected
1312 secondary criteria when the there is equality in all keys selected
1313 before them.
1313 before them.
1314
1314
1315 Abbreviations can be used for any key names, as long as the
1315 Abbreviations can be used for any key names, as long as the
1316 abbreviation is unambiguous. The following are the keys currently
1316 abbreviation is unambiguous. The following are the keys currently
1317 defined:
1317 defined:
1318
1318
1319 Valid Arg Meaning
1319 Valid Arg Meaning
1320 "calls" call count
1320 "calls" call count
1321 "cumulative" cumulative time
1321 "cumulative" cumulative time
1322 "file" file name
1322 "file" file name
1323 "module" file name
1323 "module" file name
1324 "pcalls" primitive call count
1324 "pcalls" primitive call count
1325 "line" line number
1325 "line" line number
1326 "name" function name
1326 "name" function name
1327 "nfl" name/file/line
1327 "nfl" name/file/line
1328 "stdname" standard name
1328 "stdname" standard name
1329 "time" internal time
1329 "time" internal time
1330
1330
1331 Note that all sorts on statistics are in descending order (placing
1331 Note that all sorts on statistics are in descending order (placing
1332 most time consuming items first), where as name, file, and line number
1332 most time consuming items first), where as name, file, and line number
1333 searches are in ascending order (i.e., alphabetical). The subtle
1333 searches are in ascending order (i.e., alphabetical). The subtle
1334 distinction between "nfl" and "stdname" is that the standard name is a
1334 distinction between "nfl" and "stdname" is that the standard name is a
1335 sort of the name as printed, which means that the embedded line
1335 sort of the name as printed, which means that the embedded line
1336 numbers get compared in an odd way. For example, lines 3, 20, and 40
1336 numbers get compared in an odd way. For example, lines 3, 20, and 40
1337 would (if the file names were the same) appear in the string order
1337 would (if the file names were the same) appear in the string order
1338 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1338 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1339 line numbers. In fact, sort_stats("nfl") is the same as
1339 line numbers. In fact, sort_stats("nfl") is the same as
1340 sort_stats("name", "file", "line").
1340 sort_stats("name", "file", "line").
1341
1341
1342 -T <filename>: save profile results as shown on screen to a text
1342 -T <filename>: save profile results as shown on screen to a text
1343 file. The profile is still shown on screen.
1343 file. The profile is still shown on screen.
1344
1344
1345 -D <filename>: save (via dump_stats) profile statistics to given
1345 -D <filename>: save (via dump_stats) profile statistics to given
1346 filename. This data is in a format understod by the pstats module, and
1346 filename. This data is in a format understod by the pstats module, and
1347 is generated by a call to the dump_stats() method of profile
1347 is generated by a call to the dump_stats() method of profile
1348 objects. The profile is still shown on screen.
1348 objects. The profile is still shown on screen.
1349
1349
1350 If you want to run complete programs under the profiler's control, use
1350 If you want to run complete programs under the profiler's control, use
1351 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1351 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1352 contains profiler specific options as described here.
1352 contains profiler specific options as described here.
1353
1353
1354 You can read the complete documentation for the profile module with::
1354 You can read the complete documentation for the profile module with::
1355
1355
1356 In [1]: import profile; profile.help()
1356 In [1]: import profile; profile.help()
1357 """
1357 """
1358
1358
1359 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1359 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1360 # protect user quote marks
1360 # protect user quote marks
1361 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1361 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1362
1362
1363 if user_mode: # regular user call
1363 if user_mode: # regular user call
1364 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1364 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1365 list_all=1)
1365 list_all=1)
1366 namespace = self.shell.user_ns
1366 namespace = self.shell.user_ns
1367 else: # called to run a program by %run -p
1367 else: # called to run a program by %run -p
1368 try:
1368 try:
1369 filename = get_py_filename(arg_lst[0])
1369 filename = get_py_filename(arg_lst[0])
1370 except IOError,msg:
1370 except IOError,msg:
1371 error(msg)
1371 error(msg)
1372 return
1372 return
1373
1373
1374 arg_str = 'execfile(filename,prog_ns)'
1374 arg_str = 'execfile(filename,prog_ns)'
1375 namespace = locals()
1375 namespace = locals()
1376
1376
1377 opts.merge(opts_def)
1377 opts.merge(opts_def)
1378
1378
1379 prof = profile.Profile()
1379 prof = profile.Profile()
1380 try:
1380 try:
1381 prof = prof.runctx(arg_str,namespace,namespace)
1381 prof = prof.runctx(arg_str,namespace,namespace)
1382 sys_exit = ''
1382 sys_exit = ''
1383 except SystemExit:
1383 except SystemExit:
1384 sys_exit = """*** SystemExit exception caught in code being profiled."""
1384 sys_exit = """*** SystemExit exception caught in code being profiled."""
1385
1385
1386 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1386 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1387
1387
1388 lims = opts.l
1388 lims = opts.l
1389 if lims:
1389 if lims:
1390 lims = [] # rebuild lims with ints/floats/strings
1390 lims = [] # rebuild lims with ints/floats/strings
1391 for lim in opts.l:
1391 for lim in opts.l:
1392 try:
1392 try:
1393 lims.append(int(lim))
1393 lims.append(int(lim))
1394 except ValueError:
1394 except ValueError:
1395 try:
1395 try:
1396 lims.append(float(lim))
1396 lims.append(float(lim))
1397 except ValueError:
1397 except ValueError:
1398 lims.append(lim)
1398 lims.append(lim)
1399
1399
1400 # Trap output.
1400 # Trap output.
1401 stdout_trap = StringIO()
1401 stdout_trap = StringIO()
1402
1402
1403 if hasattr(stats,'stream'):
1403 if hasattr(stats,'stream'):
1404 # In newer versions of python, the stats object has a 'stream'
1404 # In newer versions of python, the stats object has a 'stream'
1405 # attribute to write into.
1405 # attribute to write into.
1406 stats.stream = stdout_trap
1406 stats.stream = stdout_trap
1407 stats.print_stats(*lims)
1407 stats.print_stats(*lims)
1408 else:
1408 else:
1409 # For older versions, we manually redirect stdout during printing
1409 # For older versions, we manually redirect stdout during printing
1410 sys_stdout = sys.stdout
1410 sys_stdout = sys.stdout
1411 try:
1411 try:
1412 sys.stdout = stdout_trap
1412 sys.stdout = stdout_trap
1413 stats.print_stats(*lims)
1413 stats.print_stats(*lims)
1414 finally:
1414 finally:
1415 sys.stdout = sys_stdout
1415 sys.stdout = sys_stdout
1416
1416
1417 output = stdout_trap.getvalue()
1417 output = stdout_trap.getvalue()
1418 output = output.rstrip()
1418 output = output.rstrip()
1419
1419
1420 page.page(output)
1420 page.page(output)
1421 print sys_exit,
1421 print sys_exit,
1422
1422
1423 dump_file = opts.D[0]
1423 dump_file = opts.D[0]
1424 text_file = opts.T[0]
1424 text_file = opts.T[0]
1425 if dump_file:
1425 if dump_file:
1426 prof.dump_stats(dump_file)
1426 prof.dump_stats(dump_file)
1427 print '\n*** Profile stats marshalled to file',\
1427 print '\n*** Profile stats marshalled to file',\
1428 `dump_file`+'.',sys_exit
1428 `dump_file`+'.',sys_exit
1429 if text_file:
1429 if text_file:
1430 pfile = file(text_file,'w')
1430 pfile = file(text_file,'w')
1431 pfile.write(output)
1431 pfile.write(output)
1432 pfile.close()
1432 pfile.close()
1433 print '\n*** Profile printout saved to text file',\
1433 print '\n*** Profile printout saved to text file',\
1434 `text_file`+'.',sys_exit
1434 `text_file`+'.',sys_exit
1435
1435
1436 if opts.has_key('r'):
1436 if opts.has_key('r'):
1437 return stats
1437 return stats
1438 else:
1438 else:
1439 return None
1439 return None
1440
1440
1441 @testdec.skip_doctest
1441 @skip_doctest
1442 def magic_run(self, parameter_s ='',runner=None,
1442 def magic_run(self, parameter_s ='',runner=None,
1443 file_finder=get_py_filename):
1443 file_finder=get_py_filename):
1444 """Run the named file inside IPython as a program.
1444 """Run the named file inside IPython as a program.
1445
1445
1446 Usage:\\
1446 Usage:\\
1447 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1447 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1448
1448
1449 Parameters after the filename are passed as command-line arguments to
1449 Parameters after the filename are passed as command-line arguments to
1450 the program (put in sys.argv). Then, control returns to IPython's
1450 the program (put in sys.argv). Then, control returns to IPython's
1451 prompt.
1451 prompt.
1452
1452
1453 This is similar to running at a system prompt:\\
1453 This is similar to running at a system prompt:\\
1454 $ python file args\\
1454 $ python file args\\
1455 but with the advantage of giving you IPython's tracebacks, and of
1455 but with the advantage of giving you IPython's tracebacks, and of
1456 loading all variables into your interactive namespace for further use
1456 loading all variables into your interactive namespace for further use
1457 (unless -p is used, see below).
1457 (unless -p is used, see below).
1458
1458
1459 The file is executed in a namespace initially consisting only of
1459 The file is executed in a namespace initially consisting only of
1460 __name__=='__main__' and sys.argv constructed as indicated. It thus
1460 __name__=='__main__' and sys.argv constructed as indicated. It thus
1461 sees its environment as if it were being run as a stand-alone program
1461 sees its environment as if it were being run as a stand-alone program
1462 (except for sharing global objects such as previously imported
1462 (except for sharing global objects such as previously imported
1463 modules). But after execution, the IPython interactive namespace gets
1463 modules). But after execution, the IPython interactive namespace gets
1464 updated with all variables defined in the program (except for __name__
1464 updated with all variables defined in the program (except for __name__
1465 and sys.argv). This allows for very convenient loading of code for
1465 and sys.argv). This allows for very convenient loading of code for
1466 interactive work, while giving each program a 'clean sheet' to run in.
1466 interactive work, while giving each program a 'clean sheet' to run in.
1467
1467
1468 Options:
1468 Options:
1469
1469
1470 -n: __name__ is NOT set to '__main__', but to the running file's name
1470 -n: __name__ is NOT set to '__main__', but to the running file's name
1471 without extension (as python does under import). This allows running
1471 without extension (as python does under import). This allows running
1472 scripts and reloading the definitions in them without calling code
1472 scripts and reloading the definitions in them without calling code
1473 protected by an ' if __name__ == "__main__" ' clause.
1473 protected by an ' if __name__ == "__main__" ' clause.
1474
1474
1475 -i: run the file in IPython's namespace instead of an empty one. This
1475 -i: run the file in IPython's namespace instead of an empty one. This
1476 is useful if you are experimenting with code written in a text editor
1476 is useful if you are experimenting with code written in a text editor
1477 which depends on variables defined interactively.
1477 which depends on variables defined interactively.
1478
1478
1479 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1479 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1480 being run. This is particularly useful if IPython is being used to
1480 being run. This is particularly useful if IPython is being used to
1481 run unittests, which always exit with a sys.exit() call. In such
1481 run unittests, which always exit with a sys.exit() call. In such
1482 cases you are interested in the output of the test results, not in
1482 cases you are interested in the output of the test results, not in
1483 seeing a traceback of the unittest module.
1483 seeing a traceback of the unittest module.
1484
1484
1485 -t: print timing information at the end of the run. IPython will give
1485 -t: print timing information at the end of the run. IPython will give
1486 you an estimated CPU time consumption for your script, which under
1486 you an estimated CPU time consumption for your script, which under
1487 Unix uses the resource module to avoid the wraparound problems of
1487 Unix uses the resource module to avoid the wraparound problems of
1488 time.clock(). Under Unix, an estimate of time spent on system tasks
1488 time.clock(). Under Unix, an estimate of time spent on system tasks
1489 is also given (for Windows platforms this is reported as 0.0).
1489 is also given (for Windows platforms this is reported as 0.0).
1490
1490
1491 If -t is given, an additional -N<N> option can be given, where <N>
1491 If -t is given, an additional -N<N> option can be given, where <N>
1492 must be an integer indicating how many times you want the script to
1492 must be an integer indicating how many times you want the script to
1493 run. The final timing report will include total and per run results.
1493 run. The final timing report will include total and per run results.
1494
1494
1495 For example (testing the script uniq_stable.py):
1495 For example (testing the script uniq_stable.py):
1496
1496
1497 In [1]: run -t uniq_stable
1497 In [1]: run -t uniq_stable
1498
1498
1499 IPython CPU timings (estimated):\\
1499 IPython CPU timings (estimated):\\
1500 User : 0.19597 s.\\
1500 User : 0.19597 s.\\
1501 System: 0.0 s.\\
1501 System: 0.0 s.\\
1502
1502
1503 In [2]: run -t -N5 uniq_stable
1503 In [2]: run -t -N5 uniq_stable
1504
1504
1505 IPython CPU timings (estimated):\\
1505 IPython CPU timings (estimated):\\
1506 Total runs performed: 5\\
1506 Total runs performed: 5\\
1507 Times : Total Per run\\
1507 Times : Total Per run\\
1508 User : 0.910862 s, 0.1821724 s.\\
1508 User : 0.910862 s, 0.1821724 s.\\
1509 System: 0.0 s, 0.0 s.
1509 System: 0.0 s, 0.0 s.
1510
1510
1511 -d: run your program under the control of pdb, the Python debugger.
1511 -d: run your program under the control of pdb, the Python debugger.
1512 This allows you to execute your program step by step, watch variables,
1512 This allows you to execute your program step by step, watch variables,
1513 etc. Internally, what IPython does is similar to calling:
1513 etc. Internally, what IPython does is similar to calling:
1514
1514
1515 pdb.run('execfile("YOURFILENAME")')
1515 pdb.run('execfile("YOURFILENAME")')
1516
1516
1517 with a breakpoint set on line 1 of your file. You can change the line
1517 with a breakpoint set on line 1 of your file. You can change the line
1518 number for this automatic breakpoint to be <N> by using the -bN option
1518 number for this automatic breakpoint to be <N> by using the -bN option
1519 (where N must be an integer). For example:
1519 (where N must be an integer). For example:
1520
1520
1521 %run -d -b40 myscript
1521 %run -d -b40 myscript
1522
1522
1523 will set the first breakpoint at line 40 in myscript.py. Note that
1523 will set the first breakpoint at line 40 in myscript.py. Note that
1524 the first breakpoint must be set on a line which actually does
1524 the first breakpoint must be set on a line which actually does
1525 something (not a comment or docstring) for it to stop execution.
1525 something (not a comment or docstring) for it to stop execution.
1526
1526
1527 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1527 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1528 first enter 'c' (without qoutes) to start execution up to the first
1528 first enter 'c' (without qoutes) to start execution up to the first
1529 breakpoint.
1529 breakpoint.
1530
1530
1531 Entering 'help' gives information about the use of the debugger. You
1531 Entering 'help' gives information about the use of the debugger. You
1532 can easily see pdb's full documentation with "import pdb;pdb.help()"
1532 can easily see pdb's full documentation with "import pdb;pdb.help()"
1533 at a prompt.
1533 at a prompt.
1534
1534
1535 -p: run program under the control of the Python profiler module (which
1535 -p: run program under the control of the Python profiler module (which
1536 prints a detailed report of execution times, function calls, etc).
1536 prints a detailed report of execution times, function calls, etc).
1537
1537
1538 You can pass other options after -p which affect the behavior of the
1538 You can pass other options after -p which affect the behavior of the
1539 profiler itself. See the docs for %prun for details.
1539 profiler itself. See the docs for %prun for details.
1540
1540
1541 In this mode, the program's variables do NOT propagate back to the
1541 In this mode, the program's variables do NOT propagate back to the
1542 IPython interactive namespace (because they remain in the namespace
1542 IPython interactive namespace (because they remain in the namespace
1543 where the profiler executes them).
1543 where the profiler executes them).
1544
1544
1545 Internally this triggers a call to %prun, see its documentation for
1545 Internally this triggers a call to %prun, see its documentation for
1546 details on the options available specifically for profiling.
1546 details on the options available specifically for profiling.
1547
1547
1548 There is one special usage for which the text above doesn't apply:
1548 There is one special usage for which the text above doesn't apply:
1549 if the filename ends with .ipy, the file is run as ipython script,
1549 if the filename ends with .ipy, the file is run as ipython script,
1550 just as if the commands were written on IPython prompt.
1550 just as if the commands were written on IPython prompt.
1551 """
1551 """
1552
1552
1553 # get arguments and set sys.argv for program to be run.
1553 # get arguments and set sys.argv for program to be run.
1554 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1554 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1555 mode='list',list_all=1)
1555 mode='list',list_all=1)
1556
1556
1557 try:
1557 try:
1558 filename = file_finder(arg_lst[0])
1558 filename = file_finder(arg_lst[0])
1559 except IndexError:
1559 except IndexError:
1560 warn('you must provide at least a filename.')
1560 warn('you must provide at least a filename.')
1561 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1561 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1562 return
1562 return
1563 except IOError,msg:
1563 except IOError,msg:
1564 error(msg)
1564 error(msg)
1565 return
1565 return
1566
1566
1567 if filename.lower().endswith('.ipy'):
1567 if filename.lower().endswith('.ipy'):
1568 self.shell.safe_execfile_ipy(filename)
1568 self.shell.safe_execfile_ipy(filename)
1569 return
1569 return
1570
1570
1571 # Control the response to exit() calls made by the script being run
1571 # Control the response to exit() calls made by the script being run
1572 exit_ignore = opts.has_key('e')
1572 exit_ignore = opts.has_key('e')
1573
1573
1574 # Make sure that the running script gets a proper sys.argv as if it
1574 # Make sure that the running script gets a proper sys.argv as if it
1575 # were run from a system shell.
1575 # were run from a system shell.
1576 save_argv = sys.argv # save it for later restoring
1576 save_argv = sys.argv # save it for later restoring
1577 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1577 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1578
1578
1579 if opts.has_key('i'):
1579 if opts.has_key('i'):
1580 # Run in user's interactive namespace
1580 # Run in user's interactive namespace
1581 prog_ns = self.shell.user_ns
1581 prog_ns = self.shell.user_ns
1582 __name__save = self.shell.user_ns['__name__']
1582 __name__save = self.shell.user_ns['__name__']
1583 prog_ns['__name__'] = '__main__'
1583 prog_ns['__name__'] = '__main__'
1584 main_mod = self.shell.new_main_mod(prog_ns)
1584 main_mod = self.shell.new_main_mod(prog_ns)
1585 else:
1585 else:
1586 # Run in a fresh, empty namespace
1586 # Run in a fresh, empty namespace
1587 if opts.has_key('n'):
1587 if opts.has_key('n'):
1588 name = os.path.splitext(os.path.basename(filename))[0]
1588 name = os.path.splitext(os.path.basename(filename))[0]
1589 else:
1589 else:
1590 name = '__main__'
1590 name = '__main__'
1591
1591
1592 main_mod = self.shell.new_main_mod()
1592 main_mod = self.shell.new_main_mod()
1593 prog_ns = main_mod.__dict__
1593 prog_ns = main_mod.__dict__
1594 prog_ns['__name__'] = name
1594 prog_ns['__name__'] = name
1595
1595
1596 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1596 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1597 # set the __file__ global in the script's namespace
1597 # set the __file__ global in the script's namespace
1598 prog_ns['__file__'] = filename
1598 prog_ns['__file__'] = filename
1599
1599
1600 # pickle fix. See interactiveshell for an explanation. But we need to make sure
1600 # pickle fix. See interactiveshell for an explanation. But we need to make sure
1601 # that, if we overwrite __main__, we replace it at the end
1601 # that, if we overwrite __main__, we replace it at the end
1602 main_mod_name = prog_ns['__name__']
1602 main_mod_name = prog_ns['__name__']
1603
1603
1604 if main_mod_name == '__main__':
1604 if main_mod_name == '__main__':
1605 restore_main = sys.modules['__main__']
1605 restore_main = sys.modules['__main__']
1606 else:
1606 else:
1607 restore_main = False
1607 restore_main = False
1608
1608
1609 # This needs to be undone at the end to prevent holding references to
1609 # This needs to be undone at the end to prevent holding references to
1610 # every single object ever created.
1610 # every single object ever created.
1611 sys.modules[main_mod_name] = main_mod
1611 sys.modules[main_mod_name] = main_mod
1612
1612
1613 try:
1613 try:
1614 stats = None
1614 stats = None
1615 with self.readline_no_record:
1615 with self.readline_no_record:
1616 if opts.has_key('p'):
1616 if opts.has_key('p'):
1617 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1617 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1618 else:
1618 else:
1619 if opts.has_key('d'):
1619 if opts.has_key('d'):
1620 deb = debugger.Pdb(self.shell.colors)
1620 deb = debugger.Pdb(self.shell.colors)
1621 # reset Breakpoint state, which is moronically kept
1621 # reset Breakpoint state, which is moronically kept
1622 # in a class
1622 # in a class
1623 bdb.Breakpoint.next = 1
1623 bdb.Breakpoint.next = 1
1624 bdb.Breakpoint.bplist = {}
1624 bdb.Breakpoint.bplist = {}
1625 bdb.Breakpoint.bpbynumber = [None]
1625 bdb.Breakpoint.bpbynumber = [None]
1626 # Set an initial breakpoint to stop execution
1626 # Set an initial breakpoint to stop execution
1627 maxtries = 10
1627 maxtries = 10
1628 bp = int(opts.get('b',[1])[0])
1628 bp = int(opts.get('b',[1])[0])
1629 checkline = deb.checkline(filename,bp)
1629 checkline = deb.checkline(filename,bp)
1630 if not checkline:
1630 if not checkline:
1631 for bp in range(bp+1,bp+maxtries+1):
1631 for bp in range(bp+1,bp+maxtries+1):
1632 if deb.checkline(filename,bp):
1632 if deb.checkline(filename,bp):
1633 break
1633 break
1634 else:
1634 else:
1635 msg = ("\nI failed to find a valid line to set "
1635 msg = ("\nI failed to find a valid line to set "
1636 "a breakpoint\n"
1636 "a breakpoint\n"
1637 "after trying up to line: %s.\n"
1637 "after trying up to line: %s.\n"
1638 "Please set a valid breakpoint manually "
1638 "Please set a valid breakpoint manually "
1639 "with the -b option." % bp)
1639 "with the -b option." % bp)
1640 error(msg)
1640 error(msg)
1641 return
1641 return
1642 # if we find a good linenumber, set the breakpoint
1642 # if we find a good linenumber, set the breakpoint
1643 deb.do_break('%s:%s' % (filename,bp))
1643 deb.do_break('%s:%s' % (filename,bp))
1644 # Start file run
1644 # Start file run
1645 print "NOTE: Enter 'c' at the",
1645 print "NOTE: Enter 'c' at the",
1646 print "%s prompt to start your script." % deb.prompt
1646 print "%s prompt to start your script." % deb.prompt
1647 try:
1647 try:
1648 deb.run('execfile("%s")' % filename,prog_ns)
1648 deb.run('execfile("%s")' % filename,prog_ns)
1649
1649
1650 except:
1650 except:
1651 etype, value, tb = sys.exc_info()
1651 etype, value, tb = sys.exc_info()
1652 # Skip three frames in the traceback: the %run one,
1652 # Skip three frames in the traceback: the %run one,
1653 # one inside bdb.py, and the command-line typed by the
1653 # one inside bdb.py, and the command-line typed by the
1654 # user (run by exec in pdb itself).
1654 # user (run by exec in pdb itself).
1655 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1655 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1656 else:
1656 else:
1657 if runner is None:
1657 if runner is None:
1658 runner = self.shell.safe_execfile
1658 runner = self.shell.safe_execfile
1659 if opts.has_key('t'):
1659 if opts.has_key('t'):
1660 # timed execution
1660 # timed execution
1661 try:
1661 try:
1662 nruns = int(opts['N'][0])
1662 nruns = int(opts['N'][0])
1663 if nruns < 1:
1663 if nruns < 1:
1664 error('Number of runs must be >=1')
1664 error('Number of runs must be >=1')
1665 return
1665 return
1666 except (KeyError):
1666 except (KeyError):
1667 nruns = 1
1667 nruns = 1
1668 if nruns == 1:
1668 if nruns == 1:
1669 t0 = clock2()
1669 t0 = clock2()
1670 runner(filename,prog_ns,prog_ns,
1670 runner(filename,prog_ns,prog_ns,
1671 exit_ignore=exit_ignore)
1671 exit_ignore=exit_ignore)
1672 t1 = clock2()
1672 t1 = clock2()
1673 t_usr = t1[0]-t0[0]
1673 t_usr = t1[0]-t0[0]
1674 t_sys = t1[1]-t0[1]
1674 t_sys = t1[1]-t0[1]
1675 print "\nIPython CPU timings (estimated):"
1675 print "\nIPython CPU timings (estimated):"
1676 print " User : %10s s." % t_usr
1676 print " User : %10s s." % t_usr
1677 print " System: %10s s." % t_sys
1677 print " System: %10s s." % t_sys
1678 else:
1678 else:
1679 runs = range(nruns)
1679 runs = range(nruns)
1680 t0 = clock2()
1680 t0 = clock2()
1681 for nr in runs:
1681 for nr in runs:
1682 runner(filename,prog_ns,prog_ns,
1682 runner(filename,prog_ns,prog_ns,
1683 exit_ignore=exit_ignore)
1683 exit_ignore=exit_ignore)
1684 t1 = clock2()
1684 t1 = clock2()
1685 t_usr = t1[0]-t0[0]
1685 t_usr = t1[0]-t0[0]
1686 t_sys = t1[1]-t0[1]
1686 t_sys = t1[1]-t0[1]
1687 print "\nIPython CPU timings (estimated):"
1687 print "\nIPython CPU timings (estimated):"
1688 print "Total runs performed:",nruns
1688 print "Total runs performed:",nruns
1689 print " Times : %10s %10s" % ('Total','Per run')
1689 print " Times : %10s %10s" % ('Total','Per run')
1690 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1690 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1691 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1691 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1692
1692
1693 else:
1693 else:
1694 # regular execution
1694 # regular execution
1695 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1695 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1696
1696
1697 if opts.has_key('i'):
1697 if opts.has_key('i'):
1698 self.shell.user_ns['__name__'] = __name__save
1698 self.shell.user_ns['__name__'] = __name__save
1699 else:
1699 else:
1700 # The shell MUST hold a reference to prog_ns so after %run
1700 # The shell MUST hold a reference to prog_ns so after %run
1701 # exits, the python deletion mechanism doesn't zero it out
1701 # exits, the python deletion mechanism doesn't zero it out
1702 # (leaving dangling references).
1702 # (leaving dangling references).
1703 self.shell.cache_main_mod(prog_ns,filename)
1703 self.shell.cache_main_mod(prog_ns,filename)
1704 # update IPython interactive namespace
1704 # update IPython interactive namespace
1705
1705
1706 # Some forms of read errors on the file may mean the
1706 # Some forms of read errors on the file may mean the
1707 # __name__ key was never set; using pop we don't have to
1707 # __name__ key was never set; using pop we don't have to
1708 # worry about a possible KeyError.
1708 # worry about a possible KeyError.
1709 prog_ns.pop('__name__', None)
1709 prog_ns.pop('__name__', None)
1710
1710
1711 self.shell.user_ns.update(prog_ns)
1711 self.shell.user_ns.update(prog_ns)
1712 finally:
1712 finally:
1713 # It's a bit of a mystery why, but __builtins__ can change from
1713 # It's a bit of a mystery why, but __builtins__ can change from
1714 # being a module to becoming a dict missing some key data after
1714 # being a module to becoming a dict missing some key data after
1715 # %run. As best I can see, this is NOT something IPython is doing
1715 # %run. As best I can see, this is NOT something IPython is doing
1716 # at all, and similar problems have been reported before:
1716 # at all, and similar problems have been reported before:
1717 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1717 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1718 # Since this seems to be done by the interpreter itself, the best
1718 # Since this seems to be done by the interpreter itself, the best
1719 # we can do is to at least restore __builtins__ for the user on
1719 # we can do is to at least restore __builtins__ for the user on
1720 # exit.
1720 # exit.
1721 self.shell.user_ns['__builtins__'] = __builtin__
1721 self.shell.user_ns['__builtins__'] = __builtin__
1722
1722
1723 # Ensure key global structures are restored
1723 # Ensure key global structures are restored
1724 sys.argv = save_argv
1724 sys.argv = save_argv
1725 if restore_main:
1725 if restore_main:
1726 sys.modules['__main__'] = restore_main
1726 sys.modules['__main__'] = restore_main
1727 else:
1727 else:
1728 # Remove from sys.modules the reference to main_mod we'd
1728 # Remove from sys.modules the reference to main_mod we'd
1729 # added. Otherwise it will trap references to objects
1729 # added. Otherwise it will trap references to objects
1730 # contained therein.
1730 # contained therein.
1731 del sys.modules[main_mod_name]
1731 del sys.modules[main_mod_name]
1732
1732
1733 return stats
1733 return stats
1734
1734
1735 @testdec.skip_doctest
1735 @skip_doctest
1736 def magic_timeit(self, parameter_s =''):
1736 def magic_timeit(self, parameter_s =''):
1737 """Time execution of a Python statement or expression
1737 """Time execution of a Python statement or expression
1738
1738
1739 Usage:\\
1739 Usage:\\
1740 %timeit [-n<N> -r<R> [-t|-c]] statement
1740 %timeit [-n<N> -r<R> [-t|-c]] statement
1741
1741
1742 Time execution of a Python statement or expression using the timeit
1742 Time execution of a Python statement or expression using the timeit
1743 module.
1743 module.
1744
1744
1745 Options:
1745 Options:
1746 -n<N>: execute the given statement <N> times in a loop. If this value
1746 -n<N>: execute the given statement <N> times in a loop. If this value
1747 is not given, a fitting value is chosen.
1747 is not given, a fitting value is chosen.
1748
1748
1749 -r<R>: repeat the loop iteration <R> times and take the best result.
1749 -r<R>: repeat the loop iteration <R> times and take the best result.
1750 Default: 3
1750 Default: 3
1751
1751
1752 -t: use time.time to measure the time, which is the default on Unix.
1752 -t: use time.time to measure the time, which is the default on Unix.
1753 This function measures wall time.
1753 This function measures wall time.
1754
1754
1755 -c: use time.clock to measure the time, which is the default on
1755 -c: use time.clock to measure the time, which is the default on
1756 Windows and measures wall time. On Unix, resource.getrusage is used
1756 Windows and measures wall time. On Unix, resource.getrusage is used
1757 instead and returns the CPU user time.
1757 instead and returns the CPU user time.
1758
1758
1759 -p<P>: use a precision of <P> digits to display the timing result.
1759 -p<P>: use a precision of <P> digits to display the timing result.
1760 Default: 3
1760 Default: 3
1761
1761
1762
1762
1763 Examples:
1763 Examples:
1764
1764
1765 In [1]: %timeit pass
1765 In [1]: %timeit pass
1766 10000000 loops, best of 3: 53.3 ns per loop
1766 10000000 loops, best of 3: 53.3 ns per loop
1767
1767
1768 In [2]: u = None
1768 In [2]: u = None
1769
1769
1770 In [3]: %timeit u is None
1770 In [3]: %timeit u is None
1771 10000000 loops, best of 3: 184 ns per loop
1771 10000000 loops, best of 3: 184 ns per loop
1772
1772
1773 In [4]: %timeit -r 4 u == None
1773 In [4]: %timeit -r 4 u == None
1774 1000000 loops, best of 4: 242 ns per loop
1774 1000000 loops, best of 4: 242 ns per loop
1775
1775
1776 In [5]: import time
1776 In [5]: import time
1777
1777
1778 In [6]: %timeit -n1 time.sleep(2)
1778 In [6]: %timeit -n1 time.sleep(2)
1779 1 loops, best of 3: 2 s per loop
1779 1 loops, best of 3: 2 s per loop
1780
1780
1781
1781
1782 The times reported by %timeit will be slightly higher than those
1782 The times reported by %timeit will be slightly higher than those
1783 reported by the timeit.py script when variables are accessed. This is
1783 reported by the timeit.py script when variables are accessed. This is
1784 due to the fact that %timeit executes the statement in the namespace
1784 due to the fact that %timeit executes the statement in the namespace
1785 of the shell, compared with timeit.py, which uses a single setup
1785 of the shell, compared with timeit.py, which uses a single setup
1786 statement to import function or create variables. Generally, the bias
1786 statement to import function or create variables. Generally, the bias
1787 does not matter as long as results from timeit.py are not mixed with
1787 does not matter as long as results from timeit.py are not mixed with
1788 those from %timeit."""
1788 those from %timeit."""
1789
1789
1790 import timeit
1790 import timeit
1791 import math
1791 import math
1792
1792
1793 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1793 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1794 # certain terminals. Until we figure out a robust way of
1794 # certain terminals. Until we figure out a robust way of
1795 # auto-detecting if the terminal can deal with it, use plain 'us' for
1795 # auto-detecting if the terminal can deal with it, use plain 'us' for
1796 # microseconds. I am really NOT happy about disabling the proper
1796 # microseconds. I am really NOT happy about disabling the proper
1797 # 'micro' prefix, but crashing is worse... If anyone knows what the
1797 # 'micro' prefix, but crashing is worse... If anyone knows what the
1798 # right solution for this is, I'm all ears...
1798 # right solution for this is, I'm all ears...
1799 #
1799 #
1800 # Note: using
1800 # Note: using
1801 #
1801 #
1802 # s = u'\xb5'
1802 # s = u'\xb5'
1803 # s.encode(sys.getdefaultencoding())
1803 # s.encode(sys.getdefaultencoding())
1804 #
1804 #
1805 # is not sufficient, as I've seen terminals where that fails but
1805 # is not sufficient, as I've seen terminals where that fails but
1806 # print s
1806 # print s
1807 #
1807 #
1808 # succeeds
1808 # succeeds
1809 #
1809 #
1810 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1810 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1811
1811
1812 #units = [u"s", u"ms",u'\xb5',"ns"]
1812 #units = [u"s", u"ms",u'\xb5',"ns"]
1813 units = [u"s", u"ms",u'us',"ns"]
1813 units = [u"s", u"ms",u'us',"ns"]
1814
1814
1815 scaling = [1, 1e3, 1e6, 1e9]
1815 scaling = [1, 1e3, 1e6, 1e9]
1816
1816
1817 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1817 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1818 posix=False)
1818 posix=False)
1819 if stmt == "":
1819 if stmt == "":
1820 return
1820 return
1821 timefunc = timeit.default_timer
1821 timefunc = timeit.default_timer
1822 number = int(getattr(opts, "n", 0))
1822 number = int(getattr(opts, "n", 0))
1823 repeat = int(getattr(opts, "r", timeit.default_repeat))
1823 repeat = int(getattr(opts, "r", timeit.default_repeat))
1824 precision = int(getattr(opts, "p", 3))
1824 precision = int(getattr(opts, "p", 3))
1825 if hasattr(opts, "t"):
1825 if hasattr(opts, "t"):
1826 timefunc = time.time
1826 timefunc = time.time
1827 if hasattr(opts, "c"):
1827 if hasattr(opts, "c"):
1828 timefunc = clock
1828 timefunc = clock
1829
1829
1830 timer = timeit.Timer(timer=timefunc)
1830 timer = timeit.Timer(timer=timefunc)
1831 # this code has tight coupling to the inner workings of timeit.Timer,
1831 # this code has tight coupling to the inner workings of timeit.Timer,
1832 # but is there a better way to achieve that the code stmt has access
1832 # but is there a better way to achieve that the code stmt has access
1833 # to the shell namespace?
1833 # to the shell namespace?
1834
1834
1835 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1835 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1836 'setup': "pass"}
1836 'setup': "pass"}
1837 # Track compilation time so it can be reported if too long
1837 # Track compilation time so it can be reported if too long
1838 # Minimum time above which compilation time will be reported
1838 # Minimum time above which compilation time will be reported
1839 tc_min = 0.1
1839 tc_min = 0.1
1840
1840
1841 t0 = clock()
1841 t0 = clock()
1842 code = compile(src, "<magic-timeit>", "exec")
1842 code = compile(src, "<magic-timeit>", "exec")
1843 tc = clock()-t0
1843 tc = clock()-t0
1844
1844
1845 ns = {}
1845 ns = {}
1846 exec code in self.shell.user_ns, ns
1846 exec code in self.shell.user_ns, ns
1847 timer.inner = ns["inner"]
1847 timer.inner = ns["inner"]
1848
1848
1849 if number == 0:
1849 if number == 0:
1850 # determine number so that 0.2 <= total time < 2.0
1850 # determine number so that 0.2 <= total time < 2.0
1851 number = 1
1851 number = 1
1852 for i in range(1, 10):
1852 for i in range(1, 10):
1853 if timer.timeit(number) >= 0.2:
1853 if timer.timeit(number) >= 0.2:
1854 break
1854 break
1855 number *= 10
1855 number *= 10
1856
1856
1857 best = min(timer.repeat(repeat, number)) / number
1857 best = min(timer.repeat(repeat, number)) / number
1858
1858
1859 if best > 0.0 and best < 1000.0:
1859 if best > 0.0 and best < 1000.0:
1860 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1860 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1861 elif best >= 1000.0:
1861 elif best >= 1000.0:
1862 order = 0
1862 order = 0
1863 else:
1863 else:
1864 order = 3
1864 order = 3
1865 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1865 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1866 precision,
1866 precision,
1867 best * scaling[order],
1867 best * scaling[order],
1868 units[order])
1868 units[order])
1869 if tc > tc_min:
1869 if tc > tc_min:
1870 print "Compiler time: %.2f s" % tc
1870 print "Compiler time: %.2f s" % tc
1871
1871
1872 @testdec.skip_doctest
1872 @skip_doctest
1873 @needs_local_scope
1873 @needs_local_scope
1874 def magic_time(self,parameter_s = ''):
1874 def magic_time(self,parameter_s = ''):
1875 """Time execution of a Python statement or expression.
1875 """Time execution of a Python statement or expression.
1876
1876
1877 The CPU and wall clock times are printed, and the value of the
1877 The CPU and wall clock times are printed, and the value of the
1878 expression (if any) is returned. Note that under Win32, system time
1878 expression (if any) is returned. Note that under Win32, system time
1879 is always reported as 0, since it can not be measured.
1879 is always reported as 0, since it can not be measured.
1880
1880
1881 This function provides very basic timing functionality. In Python
1881 This function provides very basic timing functionality. In Python
1882 2.3, the timeit module offers more control and sophistication, so this
1882 2.3, the timeit module offers more control and sophistication, so this
1883 could be rewritten to use it (patches welcome).
1883 could be rewritten to use it (patches welcome).
1884
1884
1885 Some examples:
1885 Some examples:
1886
1886
1887 In [1]: time 2**128
1887 In [1]: time 2**128
1888 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1888 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1889 Wall time: 0.00
1889 Wall time: 0.00
1890 Out[1]: 340282366920938463463374607431768211456L
1890 Out[1]: 340282366920938463463374607431768211456L
1891
1891
1892 In [2]: n = 1000000
1892 In [2]: n = 1000000
1893
1893
1894 In [3]: time sum(range(n))
1894 In [3]: time sum(range(n))
1895 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1895 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1896 Wall time: 1.37
1896 Wall time: 1.37
1897 Out[3]: 499999500000L
1897 Out[3]: 499999500000L
1898
1898
1899 In [4]: time print 'hello world'
1899 In [4]: time print 'hello world'
1900 hello world
1900 hello world
1901 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1901 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1902 Wall time: 0.00
1902 Wall time: 0.00
1903
1903
1904 Note that the time needed by Python to compile the given expression
1904 Note that the time needed by Python to compile the given expression
1905 will be reported if it is more than 0.1s. In this example, the
1905 will be reported if it is more than 0.1s. In this example, the
1906 actual exponentiation is done by Python at compilation time, so while
1906 actual exponentiation is done by Python at compilation time, so while
1907 the expression can take a noticeable amount of time to compute, that
1907 the expression can take a noticeable amount of time to compute, that
1908 time is purely due to the compilation:
1908 time is purely due to the compilation:
1909
1909
1910 In [5]: time 3**9999;
1910 In [5]: time 3**9999;
1911 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1911 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1912 Wall time: 0.00 s
1912 Wall time: 0.00 s
1913
1913
1914 In [6]: time 3**999999;
1914 In [6]: time 3**999999;
1915 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1915 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1916 Wall time: 0.00 s
1916 Wall time: 0.00 s
1917 Compiler : 0.78 s
1917 Compiler : 0.78 s
1918 """
1918 """
1919
1919
1920 # fail immediately if the given expression can't be compiled
1920 # fail immediately if the given expression can't be compiled
1921
1921
1922 expr = self.shell.prefilter(parameter_s,False)
1922 expr = self.shell.prefilter(parameter_s,False)
1923
1923
1924 # Minimum time above which compilation time will be reported
1924 # Minimum time above which compilation time will be reported
1925 tc_min = 0.1
1925 tc_min = 0.1
1926
1926
1927 try:
1927 try:
1928 mode = 'eval'
1928 mode = 'eval'
1929 t0 = clock()
1929 t0 = clock()
1930 code = compile(expr,'<timed eval>',mode)
1930 code = compile(expr,'<timed eval>',mode)
1931 tc = clock()-t0
1931 tc = clock()-t0
1932 except SyntaxError:
1932 except SyntaxError:
1933 mode = 'exec'
1933 mode = 'exec'
1934 t0 = clock()
1934 t0 = clock()
1935 code = compile(expr,'<timed exec>',mode)
1935 code = compile(expr,'<timed exec>',mode)
1936 tc = clock()-t0
1936 tc = clock()-t0
1937 # skew measurement as little as possible
1937 # skew measurement as little as possible
1938 glob = self.shell.user_ns
1938 glob = self.shell.user_ns
1939 locs = self._magic_locals
1939 locs = self._magic_locals
1940 clk = clock2
1940 clk = clock2
1941 wtime = time.time
1941 wtime = time.time
1942 # time execution
1942 # time execution
1943 wall_st = wtime()
1943 wall_st = wtime()
1944 if mode=='eval':
1944 if mode=='eval':
1945 st = clk()
1945 st = clk()
1946 out = eval(code, glob, locs)
1946 out = eval(code, glob, locs)
1947 end = clk()
1947 end = clk()
1948 else:
1948 else:
1949 st = clk()
1949 st = clk()
1950 exec code in glob, locs
1950 exec code in glob, locs
1951 end = clk()
1951 end = clk()
1952 out = None
1952 out = None
1953 wall_end = wtime()
1953 wall_end = wtime()
1954 # Compute actual times and report
1954 # Compute actual times and report
1955 wall_time = wall_end-wall_st
1955 wall_time = wall_end-wall_st
1956 cpu_user = end[0]-st[0]
1956 cpu_user = end[0]-st[0]
1957 cpu_sys = end[1]-st[1]
1957 cpu_sys = end[1]-st[1]
1958 cpu_tot = cpu_user+cpu_sys
1958 cpu_tot = cpu_user+cpu_sys
1959 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1959 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1960 (cpu_user,cpu_sys,cpu_tot)
1960 (cpu_user,cpu_sys,cpu_tot)
1961 print "Wall time: %.2f s" % wall_time
1961 print "Wall time: %.2f s" % wall_time
1962 if tc > tc_min:
1962 if tc > tc_min:
1963 print "Compiler : %.2f s" % tc
1963 print "Compiler : %.2f s" % tc
1964 return out
1964 return out
1965
1965
1966 @testdec.skip_doctest
1966 @skip_doctest
1967 def magic_macro(self,parameter_s = ''):
1967 def magic_macro(self,parameter_s = ''):
1968 """Define a macro for future re-execution. It accepts ranges of history,
1968 """Define a macro for future re-execution. It accepts ranges of history,
1969 filenames or string objects.
1969 filenames or string objects.
1970
1970
1971 Usage:\\
1971 Usage:\\
1972 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1972 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1973
1973
1974 Options:
1974 Options:
1975
1975
1976 -r: use 'raw' input. By default, the 'processed' history is used,
1976 -r: use 'raw' input. By default, the 'processed' history is used,
1977 so that magics are loaded in their transformed version to valid
1977 so that magics are loaded in their transformed version to valid
1978 Python. If this option is given, the raw input as typed as the
1978 Python. If this option is given, the raw input as typed as the
1979 command line is used instead.
1979 command line is used instead.
1980
1980
1981 This will define a global variable called `name` which is a string
1981 This will define a global variable called `name` which is a string
1982 made of joining the slices and lines you specify (n1,n2,... numbers
1982 made of joining the slices and lines you specify (n1,n2,... numbers
1983 above) from your input history into a single string. This variable
1983 above) from your input history into a single string. This variable
1984 acts like an automatic function which re-executes those lines as if
1984 acts like an automatic function which re-executes those lines as if
1985 you had typed them. You just type 'name' at the prompt and the code
1985 you had typed them. You just type 'name' at the prompt and the code
1986 executes.
1986 executes.
1987
1987
1988 The syntax for indicating input ranges is described in %history.
1988 The syntax for indicating input ranges is described in %history.
1989
1989
1990 Note: as a 'hidden' feature, you can also use traditional python slice
1990 Note: as a 'hidden' feature, you can also use traditional python slice
1991 notation, where N:M means numbers N through M-1.
1991 notation, where N:M means numbers N through M-1.
1992
1992
1993 For example, if your history contains (%hist prints it):
1993 For example, if your history contains (%hist prints it):
1994
1994
1995 44: x=1
1995 44: x=1
1996 45: y=3
1996 45: y=3
1997 46: z=x+y
1997 46: z=x+y
1998 47: print x
1998 47: print x
1999 48: a=5
1999 48: a=5
2000 49: print 'x',x,'y',y
2000 49: print 'x',x,'y',y
2001
2001
2002 you can create a macro with lines 44 through 47 (included) and line 49
2002 you can create a macro with lines 44 through 47 (included) and line 49
2003 called my_macro with:
2003 called my_macro with:
2004
2004
2005 In [55]: %macro my_macro 44-47 49
2005 In [55]: %macro my_macro 44-47 49
2006
2006
2007 Now, typing `my_macro` (without quotes) will re-execute all this code
2007 Now, typing `my_macro` (without quotes) will re-execute all this code
2008 in one pass.
2008 in one pass.
2009
2009
2010 You don't need to give the line-numbers in order, and any given line
2010 You don't need to give the line-numbers in order, and any given line
2011 number can appear multiple times. You can assemble macros with any
2011 number can appear multiple times. You can assemble macros with any
2012 lines from your input history in any order.
2012 lines from your input history in any order.
2013
2013
2014 The macro is a simple object which holds its value in an attribute,
2014 The macro is a simple object which holds its value in an attribute,
2015 but IPython's display system checks for macros and executes them as
2015 but IPython's display system checks for macros and executes them as
2016 code instead of printing them when you type their name.
2016 code instead of printing them when you type their name.
2017
2017
2018 You can view a macro's contents by explicitly printing it with:
2018 You can view a macro's contents by explicitly printing it with:
2019
2019
2020 'print macro_name'.
2020 'print macro_name'.
2021
2021
2022 """
2022 """
2023
2023
2024 opts,args = self.parse_options(parameter_s,'r',mode='list')
2024 opts,args = self.parse_options(parameter_s,'r',mode='list')
2025 if not args: # List existing macros
2025 if not args: # List existing macros
2026 return sorted(k for k,v in self.shell.user_ns.iteritems() if\
2026 return sorted(k for k,v in self.shell.user_ns.iteritems() if\
2027 isinstance(v, Macro))
2027 isinstance(v, Macro))
2028 if len(args) == 1:
2028 if len(args) == 1:
2029 raise UsageError(
2029 raise UsageError(
2030 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2030 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2031 name, codefrom = args[0], " ".join(args[1:])
2031 name, codefrom = args[0], " ".join(args[1:])
2032
2032
2033 #print 'rng',ranges # dbg
2033 #print 'rng',ranges # dbg
2034 try:
2034 try:
2035 lines = self.shell.find_user_code(codefrom, 'r' in opts)
2035 lines = self.shell.find_user_code(codefrom, 'r' in opts)
2036 except (ValueError, TypeError) as e:
2036 except (ValueError, TypeError) as e:
2037 print e.args[0]
2037 print e.args[0]
2038 return
2038 return
2039 macro = Macro(lines)
2039 macro = Macro(lines)
2040 self.shell.define_macro(name, macro)
2040 self.shell.define_macro(name, macro)
2041 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2041 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2042 print '=== Macro contents: ==='
2042 print '=== Macro contents: ==='
2043 print macro,
2043 print macro,
2044
2044
2045 def magic_save(self,parameter_s = ''):
2045 def magic_save(self,parameter_s = ''):
2046 """Save a set of lines or a macro to a given filename.
2046 """Save a set of lines or a macro to a given filename.
2047
2047
2048 Usage:\\
2048 Usage:\\
2049 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2049 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2050
2050
2051 Options:
2051 Options:
2052
2052
2053 -r: use 'raw' input. By default, the 'processed' history is used,
2053 -r: use 'raw' input. By default, the 'processed' history is used,
2054 so that magics are loaded in their transformed version to valid
2054 so that magics are loaded in their transformed version to valid
2055 Python. If this option is given, the raw input as typed as the
2055 Python. If this option is given, the raw input as typed as the
2056 command line is used instead.
2056 command line is used instead.
2057
2057
2058 This function uses the same syntax as %history for input ranges,
2058 This function uses the same syntax as %history for input ranges,
2059 then saves the lines to the filename you specify.
2059 then saves the lines to the filename you specify.
2060
2060
2061 It adds a '.py' extension to the file if you don't do so yourself, and
2061 It adds a '.py' extension to the file if you don't do so yourself, and
2062 it asks for confirmation before overwriting existing files."""
2062 it asks for confirmation before overwriting existing files."""
2063
2063
2064 opts,args = self.parse_options(parameter_s,'r',mode='list')
2064 opts,args = self.parse_options(parameter_s,'r',mode='list')
2065 fname, codefrom = args[0], " ".join(args[1:])
2065 fname, codefrom = args[0], " ".join(args[1:])
2066 if not fname.endswith('.py'):
2066 if not fname.endswith('.py'):
2067 fname += '.py'
2067 fname += '.py'
2068 if os.path.isfile(fname):
2068 if os.path.isfile(fname):
2069 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2069 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2070 if ans.lower() not in ['y','yes']:
2070 if ans.lower() not in ['y','yes']:
2071 print 'Operation cancelled.'
2071 print 'Operation cancelled.'
2072 return
2072 return
2073 try:
2073 try:
2074 cmds = self.shell.find_user_code(codefrom, 'r' in opts)
2074 cmds = self.shell.find_user_code(codefrom, 'r' in opts)
2075 except (TypeError, ValueError) as e:
2075 except (TypeError, ValueError) as e:
2076 print e.args[0]
2076 print e.args[0]
2077 return
2077 return
2078 if isinstance(cmds, unicode):
2078 if isinstance(cmds, unicode):
2079 cmds = cmds.encode("utf-8")
2079 cmds = cmds.encode("utf-8")
2080 with open(fname,'w') as f:
2080 with open(fname,'w') as f:
2081 f.write("# coding: utf-8\n")
2081 f.write("# coding: utf-8\n")
2082 f.write(cmds)
2082 f.write(cmds)
2083 print 'The following commands were written to file `%s`:' % fname
2083 print 'The following commands were written to file `%s`:' % fname
2084 print cmds
2084 print cmds
2085
2085
2086 def magic_pastebin(self, parameter_s = ''):
2086 def magic_pastebin(self, parameter_s = ''):
2087 """Upload code to the 'Lodge it' paste bin, returning the URL."""
2087 """Upload code to the 'Lodge it' paste bin, returning the URL."""
2088 try:
2088 try:
2089 code = self.shell.find_user_code(parameter_s)
2089 code = self.shell.find_user_code(parameter_s)
2090 except (ValueError, TypeError) as e:
2090 except (ValueError, TypeError) as e:
2091 print e.args[0]
2091 print e.args[0]
2092 return
2092 return
2093 pbserver = ServerProxy('http://paste.pocoo.org/xmlrpc/')
2093 pbserver = ServerProxy('http://paste.pocoo.org/xmlrpc/')
2094 id = pbserver.pastes.newPaste("python", code)
2094 id = pbserver.pastes.newPaste("python", code)
2095 return "http://paste.pocoo.org/show/" + id
2095 return "http://paste.pocoo.org/show/" + id
2096
2096
2097 def magic_loadpy(self, arg_s):
2097 def magic_loadpy(self, arg_s):
2098 """Load a .py python script into the GUI console.
2098 """Load a .py python script into the GUI console.
2099
2099
2100 This magic command can either take a local filename or a url::
2100 This magic command can either take a local filename or a url::
2101
2101
2102 %loadpy myscript.py
2102 %loadpy myscript.py
2103 %loadpy http://www.example.com/myscript.py
2103 %loadpy http://www.example.com/myscript.py
2104 """
2104 """
2105 if not arg_s.endswith('.py'):
2105 if not arg_s.endswith('.py'):
2106 raise ValueError('%%load only works with .py files: %s' % arg_s)
2106 raise ValueError('%%load only works with .py files: %s' % arg_s)
2107 if arg_s.startswith('http'):
2107 if arg_s.startswith('http'):
2108 import urllib2
2108 import urllib2
2109 response = urllib2.urlopen(arg_s)
2109 response = urllib2.urlopen(arg_s)
2110 content = response.read()
2110 content = response.read()
2111 else:
2111 else:
2112 content = open(arg_s).read()
2112 content = open(arg_s).read()
2113 self.set_next_input(content)
2113 self.set_next_input(content)
2114
2114
2115 def _edit_macro(self,mname,macro):
2115 def _edit_macro(self,mname,macro):
2116 """open an editor with the macro data in a file"""
2116 """open an editor with the macro data in a file"""
2117 filename = self.shell.mktempfile(macro.value)
2117 filename = self.shell.mktempfile(macro.value)
2118 self.shell.hooks.editor(filename)
2118 self.shell.hooks.editor(filename)
2119
2119
2120 # and make a new macro object, to replace the old one
2120 # and make a new macro object, to replace the old one
2121 mfile = open(filename)
2121 mfile = open(filename)
2122 mvalue = mfile.read()
2122 mvalue = mfile.read()
2123 mfile.close()
2123 mfile.close()
2124 self.shell.user_ns[mname] = Macro(mvalue)
2124 self.shell.user_ns[mname] = Macro(mvalue)
2125
2125
2126 def magic_ed(self,parameter_s=''):
2126 def magic_ed(self,parameter_s=''):
2127 """Alias to %edit."""
2127 """Alias to %edit."""
2128 return self.magic_edit(parameter_s)
2128 return self.magic_edit(parameter_s)
2129
2129
2130 @testdec.skip_doctest
2130 @skip_doctest
2131 def magic_edit(self,parameter_s='',last_call=['','']):
2131 def magic_edit(self,parameter_s='',last_call=['','']):
2132 """Bring up an editor and execute the resulting code.
2132 """Bring up an editor and execute the resulting code.
2133
2133
2134 Usage:
2134 Usage:
2135 %edit [options] [args]
2135 %edit [options] [args]
2136
2136
2137 %edit runs IPython's editor hook. The default version of this hook is
2137 %edit runs IPython's editor hook. The default version of this hook is
2138 set to call the __IPYTHON__.rc.editor command. This is read from your
2138 set to call the __IPYTHON__.rc.editor command. This is read from your
2139 environment variable $EDITOR. If this isn't found, it will default to
2139 environment variable $EDITOR. If this isn't found, it will default to
2140 vi under Linux/Unix and to notepad under Windows. See the end of this
2140 vi under Linux/Unix and to notepad under Windows. See the end of this
2141 docstring for how to change the editor hook.
2141 docstring for how to change the editor hook.
2142
2142
2143 You can also set the value of this editor via the command line option
2143 You can also set the value of this editor via the command line option
2144 '-editor' or in your ipythonrc file. This is useful if you wish to use
2144 '-editor' or in your ipythonrc file. This is useful if you wish to use
2145 specifically for IPython an editor different from your typical default
2145 specifically for IPython an editor different from your typical default
2146 (and for Windows users who typically don't set environment variables).
2146 (and for Windows users who typically don't set environment variables).
2147
2147
2148 This command allows you to conveniently edit multi-line code right in
2148 This command allows you to conveniently edit multi-line code right in
2149 your IPython session.
2149 your IPython session.
2150
2150
2151 If called without arguments, %edit opens up an empty editor with a
2151 If called without arguments, %edit opens up an empty editor with a
2152 temporary file and will execute the contents of this file when you
2152 temporary file and will execute the contents of this file when you
2153 close it (don't forget to save it!).
2153 close it (don't forget to save it!).
2154
2154
2155
2155
2156 Options:
2156 Options:
2157
2157
2158 -n <number>: open the editor at a specified line number. By default,
2158 -n <number>: open the editor at a specified line number. By default,
2159 the IPython editor hook uses the unix syntax 'editor +N filename', but
2159 the IPython editor hook uses the unix syntax 'editor +N filename', but
2160 you can configure this by providing your own modified hook if your
2160 you can configure this by providing your own modified hook if your
2161 favorite editor supports line-number specifications with a different
2161 favorite editor supports line-number specifications with a different
2162 syntax.
2162 syntax.
2163
2163
2164 -p: this will call the editor with the same data as the previous time
2164 -p: this will call the editor with the same data as the previous time
2165 it was used, regardless of how long ago (in your current session) it
2165 it was used, regardless of how long ago (in your current session) it
2166 was.
2166 was.
2167
2167
2168 -r: use 'raw' input. This option only applies to input taken from the
2168 -r: use 'raw' input. This option only applies to input taken from the
2169 user's history. By default, the 'processed' history is used, so that
2169 user's history. By default, the 'processed' history is used, so that
2170 magics are loaded in their transformed version to valid Python. If
2170 magics are loaded in their transformed version to valid Python. If
2171 this option is given, the raw input as typed as the command line is
2171 this option is given, the raw input as typed as the command line is
2172 used instead. When you exit the editor, it will be executed by
2172 used instead. When you exit the editor, it will be executed by
2173 IPython's own processor.
2173 IPython's own processor.
2174
2174
2175 -x: do not execute the edited code immediately upon exit. This is
2175 -x: do not execute the edited code immediately upon exit. This is
2176 mainly useful if you are editing programs which need to be called with
2176 mainly useful if you are editing programs which need to be called with
2177 command line arguments, which you can then do using %run.
2177 command line arguments, which you can then do using %run.
2178
2178
2179
2179
2180 Arguments:
2180 Arguments:
2181
2181
2182 If arguments are given, the following possibilites exist:
2182 If arguments are given, the following possibilites exist:
2183
2183
2184 - If the argument is a filename, IPython will load that into the
2184 - If the argument is a filename, IPython will load that into the
2185 editor. It will execute its contents with execfile() when you exit,
2185 editor. It will execute its contents with execfile() when you exit,
2186 loading any code in the file into your interactive namespace.
2186 loading any code in the file into your interactive namespace.
2187
2187
2188 - The arguments are ranges of input history, e.g. "7 ~1/4-6".
2188 - The arguments are ranges of input history, e.g. "7 ~1/4-6".
2189 The syntax is the same as in the %history magic.
2189 The syntax is the same as in the %history magic.
2190
2190
2191 - If the argument is a string variable, its contents are loaded
2191 - If the argument is a string variable, its contents are loaded
2192 into the editor. You can thus edit any string which contains
2192 into the editor. You can thus edit any string which contains
2193 python code (including the result of previous edits).
2193 python code (including the result of previous edits).
2194
2194
2195 - If the argument is the name of an object (other than a string),
2195 - If the argument is the name of an object (other than a string),
2196 IPython will try to locate the file where it was defined and open the
2196 IPython will try to locate the file where it was defined and open the
2197 editor at the point where it is defined. You can use `%edit function`
2197 editor at the point where it is defined. You can use `%edit function`
2198 to load an editor exactly at the point where 'function' is defined,
2198 to load an editor exactly at the point where 'function' is defined,
2199 edit it and have the file be executed automatically.
2199 edit it and have the file be executed automatically.
2200
2200
2201 If the object is a macro (see %macro for details), this opens up your
2201 If the object is a macro (see %macro for details), this opens up your
2202 specified editor with a temporary file containing the macro's data.
2202 specified editor with a temporary file containing the macro's data.
2203 Upon exit, the macro is reloaded with the contents of the file.
2203 Upon exit, the macro is reloaded with the contents of the file.
2204
2204
2205 Note: opening at an exact line is only supported under Unix, and some
2205 Note: opening at an exact line is only supported under Unix, and some
2206 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2206 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2207 '+NUMBER' parameter necessary for this feature. Good editors like
2207 '+NUMBER' parameter necessary for this feature. Good editors like
2208 (X)Emacs, vi, jed, pico and joe all do.
2208 (X)Emacs, vi, jed, pico and joe all do.
2209
2209
2210 After executing your code, %edit will return as output the code you
2210 After executing your code, %edit will return as output the code you
2211 typed in the editor (except when it was an existing file). This way
2211 typed in the editor (except when it was an existing file). This way
2212 you can reload the code in further invocations of %edit as a variable,
2212 you can reload the code in further invocations of %edit as a variable,
2213 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2213 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2214 the output.
2214 the output.
2215
2215
2216 Note that %edit is also available through the alias %ed.
2216 Note that %edit is also available through the alias %ed.
2217
2217
2218 This is an example of creating a simple function inside the editor and
2218 This is an example of creating a simple function inside the editor and
2219 then modifying it. First, start up the editor:
2219 then modifying it. First, start up the editor:
2220
2220
2221 In [1]: ed
2221 In [1]: ed
2222 Editing... done. Executing edited code...
2222 Editing... done. Executing edited code...
2223 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2223 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2224
2224
2225 We can then call the function foo():
2225 We can then call the function foo():
2226
2226
2227 In [2]: foo()
2227 In [2]: foo()
2228 foo() was defined in an editing session
2228 foo() was defined in an editing session
2229
2229
2230 Now we edit foo. IPython automatically loads the editor with the
2230 Now we edit foo. IPython automatically loads the editor with the
2231 (temporary) file where foo() was previously defined:
2231 (temporary) file where foo() was previously defined:
2232
2232
2233 In [3]: ed foo
2233 In [3]: ed foo
2234 Editing... done. Executing edited code...
2234 Editing... done. Executing edited code...
2235
2235
2236 And if we call foo() again we get the modified version:
2236 And if we call foo() again we get the modified version:
2237
2237
2238 In [4]: foo()
2238 In [4]: foo()
2239 foo() has now been changed!
2239 foo() has now been changed!
2240
2240
2241 Here is an example of how to edit a code snippet successive
2241 Here is an example of how to edit a code snippet successive
2242 times. First we call the editor:
2242 times. First we call the editor:
2243
2243
2244 In [5]: ed
2244 In [5]: ed
2245 Editing... done. Executing edited code...
2245 Editing... done. Executing edited code...
2246 hello
2246 hello
2247 Out[5]: "print 'hello'n"
2247 Out[5]: "print 'hello'n"
2248
2248
2249 Now we call it again with the previous output (stored in _):
2249 Now we call it again with the previous output (stored in _):
2250
2250
2251 In [6]: ed _
2251 In [6]: ed _
2252 Editing... done. Executing edited code...
2252 Editing... done. Executing edited code...
2253 hello world
2253 hello world
2254 Out[6]: "print 'hello world'n"
2254 Out[6]: "print 'hello world'n"
2255
2255
2256 Now we call it with the output #8 (stored in _8, also as Out[8]):
2256 Now we call it with the output #8 (stored in _8, also as Out[8]):
2257
2257
2258 In [7]: ed _8
2258 In [7]: ed _8
2259 Editing... done. Executing edited code...
2259 Editing... done. Executing edited code...
2260 hello again
2260 hello again
2261 Out[7]: "print 'hello again'n"
2261 Out[7]: "print 'hello again'n"
2262
2262
2263
2263
2264 Changing the default editor hook:
2264 Changing the default editor hook:
2265
2265
2266 If you wish to write your own editor hook, you can put it in a
2266 If you wish to write your own editor hook, you can put it in a
2267 configuration file which you load at startup time. The default hook
2267 configuration file which you load at startup time. The default hook
2268 is defined in the IPython.core.hooks module, and you can use that as a
2268 is defined in the IPython.core.hooks module, and you can use that as a
2269 starting example for further modifications. That file also has
2269 starting example for further modifications. That file also has
2270 general instructions on how to set a new hook for use once you've
2270 general instructions on how to set a new hook for use once you've
2271 defined it."""
2271 defined it."""
2272
2272
2273 # FIXME: This function has become a convoluted mess. It needs a
2273 # FIXME: This function has become a convoluted mess. It needs a
2274 # ground-up rewrite with clean, simple logic.
2274 # ground-up rewrite with clean, simple logic.
2275
2275
2276 def make_filename(arg):
2276 def make_filename(arg):
2277 "Make a filename from the given args"
2277 "Make a filename from the given args"
2278 try:
2278 try:
2279 filename = get_py_filename(arg)
2279 filename = get_py_filename(arg)
2280 except IOError:
2280 except IOError:
2281 if args.endswith('.py'):
2281 if args.endswith('.py'):
2282 filename = arg
2282 filename = arg
2283 else:
2283 else:
2284 filename = None
2284 filename = None
2285 return filename
2285 return filename
2286
2286
2287 # custom exceptions
2287 # custom exceptions
2288 class DataIsObject(Exception): pass
2288 class DataIsObject(Exception): pass
2289
2289
2290 opts,args = self.parse_options(parameter_s,'prxn:')
2290 opts,args = self.parse_options(parameter_s,'prxn:')
2291 # Set a few locals from the options for convenience:
2291 # Set a few locals from the options for convenience:
2292 opts_prev = 'p' in opts
2292 opts_prev = 'p' in opts
2293 opts_raw = 'r' in opts
2293 opts_raw = 'r' in opts
2294
2294
2295 # Default line number value
2295 # Default line number value
2296 lineno = opts.get('n',None)
2296 lineno = opts.get('n',None)
2297
2297
2298 if opts_prev:
2298 if opts_prev:
2299 args = '_%s' % last_call[0]
2299 args = '_%s' % last_call[0]
2300 if not self.shell.user_ns.has_key(args):
2300 if not self.shell.user_ns.has_key(args):
2301 args = last_call[1]
2301 args = last_call[1]
2302
2302
2303 # use last_call to remember the state of the previous call, but don't
2303 # use last_call to remember the state of the previous call, but don't
2304 # let it be clobbered by successive '-p' calls.
2304 # let it be clobbered by successive '-p' calls.
2305 try:
2305 try:
2306 last_call[0] = self.shell.displayhook.prompt_count
2306 last_call[0] = self.shell.displayhook.prompt_count
2307 if not opts_prev:
2307 if not opts_prev:
2308 last_call[1] = parameter_s
2308 last_call[1] = parameter_s
2309 except:
2309 except:
2310 pass
2310 pass
2311
2311
2312 # by default this is done with temp files, except when the given
2312 # by default this is done with temp files, except when the given
2313 # arg is a filename
2313 # arg is a filename
2314 use_temp = True
2314 use_temp = True
2315
2315
2316 data = ''
2316 data = ''
2317 if args.endswith('.py'):
2317 if args.endswith('.py'):
2318 filename = make_filename(args)
2318 filename = make_filename(args)
2319 use_temp = False
2319 use_temp = False
2320 elif args:
2320 elif args:
2321 # Mode where user specifies ranges of lines, like in %macro.
2321 # Mode where user specifies ranges of lines, like in %macro.
2322 data = self.extract_input_lines(args, opts_raw)
2322 data = self.extract_input_lines(args, opts_raw)
2323 if not data:
2323 if not data:
2324 try:
2324 try:
2325 # Load the parameter given as a variable. If not a string,
2325 # Load the parameter given as a variable. If not a string,
2326 # process it as an object instead (below)
2326 # process it as an object instead (below)
2327
2327
2328 #print '*** args',args,'type',type(args) # dbg
2328 #print '*** args',args,'type',type(args) # dbg
2329 data = eval(args, self.shell.user_ns)
2329 data = eval(args, self.shell.user_ns)
2330 if not isinstance(data, basestring):
2330 if not isinstance(data, basestring):
2331 raise DataIsObject
2331 raise DataIsObject
2332
2332
2333 except (NameError,SyntaxError):
2333 except (NameError,SyntaxError):
2334 # given argument is not a variable, try as a filename
2334 # given argument is not a variable, try as a filename
2335 filename = make_filename(args)
2335 filename = make_filename(args)
2336 if filename is None:
2336 if filename is None:
2337 warn("Argument given (%s) can't be found as a variable "
2337 warn("Argument given (%s) can't be found as a variable "
2338 "or as a filename." % args)
2338 "or as a filename." % args)
2339 return
2339 return
2340 use_temp = False
2340 use_temp = False
2341
2341
2342 except DataIsObject:
2342 except DataIsObject:
2343 # macros have a special edit function
2343 # macros have a special edit function
2344 if isinstance(data, Macro):
2344 if isinstance(data, Macro):
2345 self._edit_macro(args,data)
2345 self._edit_macro(args,data)
2346 return
2346 return
2347
2347
2348 # For objects, try to edit the file where they are defined
2348 # For objects, try to edit the file where they are defined
2349 try:
2349 try:
2350 filename = inspect.getabsfile(data)
2350 filename = inspect.getabsfile(data)
2351 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2351 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2352 # class created by %edit? Try to find source
2352 # class created by %edit? Try to find source
2353 # by looking for method definitions instead, the
2353 # by looking for method definitions instead, the
2354 # __module__ in those classes is FakeModule.
2354 # __module__ in those classes is FakeModule.
2355 attrs = [getattr(data, aname) for aname in dir(data)]
2355 attrs = [getattr(data, aname) for aname in dir(data)]
2356 for attr in attrs:
2356 for attr in attrs:
2357 if not inspect.ismethod(attr):
2357 if not inspect.ismethod(attr):
2358 continue
2358 continue
2359 filename = inspect.getabsfile(attr)
2359 filename = inspect.getabsfile(attr)
2360 if filename and 'fakemodule' not in filename.lower():
2360 if filename and 'fakemodule' not in filename.lower():
2361 # change the attribute to be the edit target instead
2361 # change the attribute to be the edit target instead
2362 data = attr
2362 data = attr
2363 break
2363 break
2364
2364
2365 datafile = 1
2365 datafile = 1
2366 except TypeError:
2366 except TypeError:
2367 filename = make_filename(args)
2367 filename = make_filename(args)
2368 datafile = 1
2368 datafile = 1
2369 warn('Could not find file where `%s` is defined.\n'
2369 warn('Could not find file where `%s` is defined.\n'
2370 'Opening a file named `%s`' % (args,filename))
2370 'Opening a file named `%s`' % (args,filename))
2371 # Now, make sure we can actually read the source (if it was in
2371 # Now, make sure we can actually read the source (if it was in
2372 # a temp file it's gone by now).
2372 # a temp file it's gone by now).
2373 if datafile:
2373 if datafile:
2374 try:
2374 try:
2375 if lineno is None:
2375 if lineno is None:
2376 lineno = inspect.getsourcelines(data)[1]
2376 lineno = inspect.getsourcelines(data)[1]
2377 except IOError:
2377 except IOError:
2378 filename = make_filename(args)
2378 filename = make_filename(args)
2379 if filename is None:
2379 if filename is None:
2380 warn('The file `%s` where `%s` was defined cannot '
2380 warn('The file `%s` where `%s` was defined cannot '
2381 'be read.' % (filename,data))
2381 'be read.' % (filename,data))
2382 return
2382 return
2383 use_temp = False
2383 use_temp = False
2384
2384
2385 if use_temp:
2385 if use_temp:
2386 filename = self.shell.mktempfile(data)
2386 filename = self.shell.mktempfile(data)
2387 print 'IPython will make a temporary file named:',filename
2387 print 'IPython will make a temporary file named:',filename
2388
2388
2389 # do actual editing here
2389 # do actual editing here
2390 print 'Editing...',
2390 print 'Editing...',
2391 sys.stdout.flush()
2391 sys.stdout.flush()
2392 try:
2392 try:
2393 # Quote filenames that may have spaces in them
2393 # Quote filenames that may have spaces in them
2394 if ' ' in filename:
2394 if ' ' in filename:
2395 filename = "%s" % filename
2395 filename = "%s" % filename
2396 self.shell.hooks.editor(filename,lineno)
2396 self.shell.hooks.editor(filename,lineno)
2397 except TryNext:
2397 except TryNext:
2398 warn('Could not open editor')
2398 warn('Could not open editor')
2399 return
2399 return
2400
2400
2401 # XXX TODO: should this be generalized for all string vars?
2401 # XXX TODO: should this be generalized for all string vars?
2402 # For now, this is special-cased to blocks created by cpaste
2402 # For now, this is special-cased to blocks created by cpaste
2403 if args.strip() == 'pasted_block':
2403 if args.strip() == 'pasted_block':
2404 self.shell.user_ns['pasted_block'] = file_read(filename)
2404 self.shell.user_ns['pasted_block'] = file_read(filename)
2405
2405
2406 if 'x' in opts: # -x prevents actual execution
2406 if 'x' in opts: # -x prevents actual execution
2407 print
2407 print
2408 else:
2408 else:
2409 print 'done. Executing edited code...'
2409 print 'done. Executing edited code...'
2410 if opts_raw:
2410 if opts_raw:
2411 self.shell.run_cell(file_read(filename),
2411 self.shell.run_cell(file_read(filename),
2412 store_history=False)
2412 store_history=False)
2413 else:
2413 else:
2414 self.shell.safe_execfile(filename,self.shell.user_ns,
2414 self.shell.safe_execfile(filename,self.shell.user_ns,
2415 self.shell.user_ns)
2415 self.shell.user_ns)
2416
2416
2417
2417
2418 if use_temp:
2418 if use_temp:
2419 try:
2419 try:
2420 return open(filename).read()
2420 return open(filename).read()
2421 except IOError,msg:
2421 except IOError,msg:
2422 if msg.filename == filename:
2422 if msg.filename == filename:
2423 warn('File not found. Did you forget to save?')
2423 warn('File not found. Did you forget to save?')
2424 return
2424 return
2425 else:
2425 else:
2426 self.shell.showtraceback()
2426 self.shell.showtraceback()
2427
2427
2428 def magic_xmode(self,parameter_s = ''):
2428 def magic_xmode(self,parameter_s = ''):
2429 """Switch modes for the exception handlers.
2429 """Switch modes for the exception handlers.
2430
2430
2431 Valid modes: Plain, Context and Verbose.
2431 Valid modes: Plain, Context and Verbose.
2432
2432
2433 If called without arguments, acts as a toggle."""
2433 If called without arguments, acts as a toggle."""
2434
2434
2435 def xmode_switch_err(name):
2435 def xmode_switch_err(name):
2436 warn('Error changing %s exception modes.\n%s' %
2436 warn('Error changing %s exception modes.\n%s' %
2437 (name,sys.exc_info()[1]))
2437 (name,sys.exc_info()[1]))
2438
2438
2439 shell = self.shell
2439 shell = self.shell
2440 new_mode = parameter_s.strip().capitalize()
2440 new_mode = parameter_s.strip().capitalize()
2441 try:
2441 try:
2442 shell.InteractiveTB.set_mode(mode=new_mode)
2442 shell.InteractiveTB.set_mode(mode=new_mode)
2443 print 'Exception reporting mode:',shell.InteractiveTB.mode
2443 print 'Exception reporting mode:',shell.InteractiveTB.mode
2444 except:
2444 except:
2445 xmode_switch_err('user')
2445 xmode_switch_err('user')
2446
2446
2447 def magic_colors(self,parameter_s = ''):
2447 def magic_colors(self,parameter_s = ''):
2448 """Switch color scheme for prompts, info system and exception handlers.
2448 """Switch color scheme for prompts, info system and exception handlers.
2449
2449
2450 Currently implemented schemes: NoColor, Linux, LightBG.
2450 Currently implemented schemes: NoColor, Linux, LightBG.
2451
2451
2452 Color scheme names are not case-sensitive.
2452 Color scheme names are not case-sensitive.
2453
2453
2454 Examples
2454 Examples
2455 --------
2455 --------
2456 To get a plain black and white terminal::
2456 To get a plain black and white terminal::
2457
2457
2458 %colors nocolor
2458 %colors nocolor
2459 """
2459 """
2460
2460
2461 def color_switch_err(name):
2461 def color_switch_err(name):
2462 warn('Error changing %s color schemes.\n%s' %
2462 warn('Error changing %s color schemes.\n%s' %
2463 (name,sys.exc_info()[1]))
2463 (name,sys.exc_info()[1]))
2464
2464
2465
2465
2466 new_scheme = parameter_s.strip()
2466 new_scheme = parameter_s.strip()
2467 if not new_scheme:
2467 if not new_scheme:
2468 raise UsageError(
2468 raise UsageError(
2469 "%colors: you must specify a color scheme. See '%colors?'")
2469 "%colors: you must specify a color scheme. See '%colors?'")
2470 return
2470 return
2471 # local shortcut
2471 # local shortcut
2472 shell = self.shell
2472 shell = self.shell
2473
2473
2474 import IPython.utils.rlineimpl as readline
2474 import IPython.utils.rlineimpl as readline
2475
2475
2476 if not readline.have_readline and sys.platform == "win32":
2476 if not readline.have_readline and sys.platform == "win32":
2477 msg = """\
2477 msg = """\
2478 Proper color support under MS Windows requires the pyreadline library.
2478 Proper color support under MS Windows requires the pyreadline library.
2479 You can find it at:
2479 You can find it at:
2480 http://ipython.scipy.org/moin/PyReadline/Intro
2480 http://ipython.scipy.org/moin/PyReadline/Intro
2481 Gary's readline needs the ctypes module, from:
2481 Gary's readline needs the ctypes module, from:
2482 http://starship.python.net/crew/theller/ctypes
2482 http://starship.python.net/crew/theller/ctypes
2483 (Note that ctypes is already part of Python versions 2.5 and newer).
2483 (Note that ctypes is already part of Python versions 2.5 and newer).
2484
2484
2485 Defaulting color scheme to 'NoColor'"""
2485 Defaulting color scheme to 'NoColor'"""
2486 new_scheme = 'NoColor'
2486 new_scheme = 'NoColor'
2487 warn(msg)
2487 warn(msg)
2488
2488
2489 # readline option is 0
2489 # readline option is 0
2490 if not shell.has_readline:
2490 if not shell.has_readline:
2491 new_scheme = 'NoColor'
2491 new_scheme = 'NoColor'
2492
2492
2493 # Set prompt colors
2493 # Set prompt colors
2494 try:
2494 try:
2495 shell.displayhook.set_colors(new_scheme)
2495 shell.displayhook.set_colors(new_scheme)
2496 except:
2496 except:
2497 color_switch_err('prompt')
2497 color_switch_err('prompt')
2498 else:
2498 else:
2499 shell.colors = \
2499 shell.colors = \
2500 shell.displayhook.color_table.active_scheme_name
2500 shell.displayhook.color_table.active_scheme_name
2501 # Set exception colors
2501 # Set exception colors
2502 try:
2502 try:
2503 shell.InteractiveTB.set_colors(scheme = new_scheme)
2503 shell.InteractiveTB.set_colors(scheme = new_scheme)
2504 shell.SyntaxTB.set_colors(scheme = new_scheme)
2504 shell.SyntaxTB.set_colors(scheme = new_scheme)
2505 except:
2505 except:
2506 color_switch_err('exception')
2506 color_switch_err('exception')
2507
2507
2508 # Set info (for 'object?') colors
2508 # Set info (for 'object?') colors
2509 if shell.color_info:
2509 if shell.color_info:
2510 try:
2510 try:
2511 shell.inspector.set_active_scheme(new_scheme)
2511 shell.inspector.set_active_scheme(new_scheme)
2512 except:
2512 except:
2513 color_switch_err('object inspector')
2513 color_switch_err('object inspector')
2514 else:
2514 else:
2515 shell.inspector.set_active_scheme('NoColor')
2515 shell.inspector.set_active_scheme('NoColor')
2516
2516
2517 def magic_pprint(self, parameter_s=''):
2517 def magic_pprint(self, parameter_s=''):
2518 """Toggle pretty printing on/off."""
2518 """Toggle pretty printing on/off."""
2519 ptformatter = self.shell.display_formatter.formatters['text/plain']
2519 ptformatter = self.shell.display_formatter.formatters['text/plain']
2520 ptformatter.pprint = bool(1 - ptformatter.pprint)
2520 ptformatter.pprint = bool(1 - ptformatter.pprint)
2521 print 'Pretty printing has been turned', \
2521 print 'Pretty printing has been turned', \
2522 ['OFF','ON'][ptformatter.pprint]
2522 ['OFF','ON'][ptformatter.pprint]
2523
2523
2524 #......................................................................
2524 #......................................................................
2525 # Functions to implement unix shell-type things
2525 # Functions to implement unix shell-type things
2526
2526
2527 @testdec.skip_doctest
2527 @skip_doctest
2528 def magic_alias(self, parameter_s = ''):
2528 def magic_alias(self, parameter_s = ''):
2529 """Define an alias for a system command.
2529 """Define an alias for a system command.
2530
2530
2531 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2531 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2532
2532
2533 Then, typing 'alias_name params' will execute the system command 'cmd
2533 Then, typing 'alias_name params' will execute the system command 'cmd
2534 params' (from your underlying operating system).
2534 params' (from your underlying operating system).
2535
2535
2536 Aliases have lower precedence than magic functions and Python normal
2536 Aliases have lower precedence than magic functions and Python normal
2537 variables, so if 'foo' is both a Python variable and an alias, the
2537 variables, so if 'foo' is both a Python variable and an alias, the
2538 alias can not be executed until 'del foo' removes the Python variable.
2538 alias can not be executed until 'del foo' removes the Python variable.
2539
2539
2540 You can use the %l specifier in an alias definition to represent the
2540 You can use the %l specifier in an alias definition to represent the
2541 whole line when the alias is called. For example:
2541 whole line when the alias is called. For example:
2542
2542
2543 In [2]: alias bracket echo "Input in brackets: <%l>"
2543 In [2]: alias bracket echo "Input in brackets: <%l>"
2544 In [3]: bracket hello world
2544 In [3]: bracket hello world
2545 Input in brackets: <hello world>
2545 Input in brackets: <hello world>
2546
2546
2547 You can also define aliases with parameters using %s specifiers (one
2547 You can also define aliases with parameters using %s specifiers (one
2548 per parameter):
2548 per parameter):
2549
2549
2550 In [1]: alias parts echo first %s second %s
2550 In [1]: alias parts echo first %s second %s
2551 In [2]: %parts A B
2551 In [2]: %parts A B
2552 first A second B
2552 first A second B
2553 In [3]: %parts A
2553 In [3]: %parts A
2554 Incorrect number of arguments: 2 expected.
2554 Incorrect number of arguments: 2 expected.
2555 parts is an alias to: 'echo first %s second %s'
2555 parts is an alias to: 'echo first %s second %s'
2556
2556
2557 Note that %l and %s are mutually exclusive. You can only use one or
2557 Note that %l and %s are mutually exclusive. You can only use one or
2558 the other in your aliases.
2558 the other in your aliases.
2559
2559
2560 Aliases expand Python variables just like system calls using ! or !!
2560 Aliases expand Python variables just like system calls using ! or !!
2561 do: all expressions prefixed with '$' get expanded. For details of
2561 do: all expressions prefixed with '$' get expanded. For details of
2562 the semantic rules, see PEP-215:
2562 the semantic rules, see PEP-215:
2563 http://www.python.org/peps/pep-0215.html. This is the library used by
2563 http://www.python.org/peps/pep-0215.html. This is the library used by
2564 IPython for variable expansion. If you want to access a true shell
2564 IPython for variable expansion. If you want to access a true shell
2565 variable, an extra $ is necessary to prevent its expansion by IPython:
2565 variable, an extra $ is necessary to prevent its expansion by IPython:
2566
2566
2567 In [6]: alias show echo
2567 In [6]: alias show echo
2568 In [7]: PATH='A Python string'
2568 In [7]: PATH='A Python string'
2569 In [8]: show $PATH
2569 In [8]: show $PATH
2570 A Python string
2570 A Python string
2571 In [9]: show $$PATH
2571 In [9]: show $$PATH
2572 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2572 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2573
2573
2574 You can use the alias facility to acess all of $PATH. See the %rehash
2574 You can use the alias facility to acess all of $PATH. See the %rehash
2575 and %rehashx functions, which automatically create aliases for the
2575 and %rehashx functions, which automatically create aliases for the
2576 contents of your $PATH.
2576 contents of your $PATH.
2577
2577
2578 If called with no parameters, %alias prints the current alias table."""
2578 If called with no parameters, %alias prints the current alias table."""
2579
2579
2580 par = parameter_s.strip()
2580 par = parameter_s.strip()
2581 if not par:
2581 if not par:
2582 stored = self.db.get('stored_aliases', {} )
2582 stored = self.db.get('stored_aliases', {} )
2583 aliases = sorted(self.shell.alias_manager.aliases)
2583 aliases = sorted(self.shell.alias_manager.aliases)
2584 # for k, v in stored:
2584 # for k, v in stored:
2585 # atab.append(k, v[0])
2585 # atab.append(k, v[0])
2586
2586
2587 print "Total number of aliases:", len(aliases)
2587 print "Total number of aliases:", len(aliases)
2588 sys.stdout.flush()
2588 sys.stdout.flush()
2589 return aliases
2589 return aliases
2590
2590
2591 # Now try to define a new one
2591 # Now try to define a new one
2592 try:
2592 try:
2593 alias,cmd = par.split(None, 1)
2593 alias,cmd = par.split(None, 1)
2594 except:
2594 except:
2595 print oinspect.getdoc(self.magic_alias)
2595 print oinspect.getdoc(self.magic_alias)
2596 else:
2596 else:
2597 self.shell.alias_manager.soft_define_alias(alias, cmd)
2597 self.shell.alias_manager.soft_define_alias(alias, cmd)
2598 # end magic_alias
2598 # end magic_alias
2599
2599
2600 def magic_unalias(self, parameter_s = ''):
2600 def magic_unalias(self, parameter_s = ''):
2601 """Remove an alias"""
2601 """Remove an alias"""
2602
2602
2603 aname = parameter_s.strip()
2603 aname = parameter_s.strip()
2604 self.shell.alias_manager.undefine_alias(aname)
2604 self.shell.alias_manager.undefine_alias(aname)
2605 stored = self.db.get('stored_aliases', {} )
2605 stored = self.db.get('stored_aliases', {} )
2606 if aname in stored:
2606 if aname in stored:
2607 print "Removing %stored alias",aname
2607 print "Removing %stored alias",aname
2608 del stored[aname]
2608 del stored[aname]
2609 self.db['stored_aliases'] = stored
2609 self.db['stored_aliases'] = stored
2610
2610
2611 def magic_rehashx(self, parameter_s = ''):
2611 def magic_rehashx(self, parameter_s = ''):
2612 """Update the alias table with all executable files in $PATH.
2612 """Update the alias table with all executable files in $PATH.
2613
2613
2614 This version explicitly checks that every entry in $PATH is a file
2614 This version explicitly checks that every entry in $PATH is a file
2615 with execute access (os.X_OK), so it is much slower than %rehash.
2615 with execute access (os.X_OK), so it is much slower than %rehash.
2616
2616
2617 Under Windows, it checks executability as a match agains a
2617 Under Windows, it checks executability as a match agains a
2618 '|'-separated string of extensions, stored in the IPython config
2618 '|'-separated string of extensions, stored in the IPython config
2619 variable win_exec_ext. This defaults to 'exe|com|bat'.
2619 variable win_exec_ext. This defaults to 'exe|com|bat'.
2620
2620
2621 This function also resets the root module cache of module completer,
2621 This function also resets the root module cache of module completer,
2622 used on slow filesystems.
2622 used on slow filesystems.
2623 """
2623 """
2624 from IPython.core.alias import InvalidAliasError
2624 from IPython.core.alias import InvalidAliasError
2625
2625
2626 # for the benefit of module completer in ipy_completers.py
2626 # for the benefit of module completer in ipy_completers.py
2627 del self.db['rootmodules']
2627 del self.db['rootmodules']
2628
2628
2629 path = [os.path.abspath(os.path.expanduser(p)) for p in
2629 path = [os.path.abspath(os.path.expanduser(p)) for p in
2630 os.environ.get('PATH','').split(os.pathsep)]
2630 os.environ.get('PATH','').split(os.pathsep)]
2631 path = filter(os.path.isdir,path)
2631 path = filter(os.path.isdir,path)
2632
2632
2633 syscmdlist = []
2633 syscmdlist = []
2634 # Now define isexec in a cross platform manner.
2634 # Now define isexec in a cross platform manner.
2635 if os.name == 'posix':
2635 if os.name == 'posix':
2636 isexec = lambda fname:os.path.isfile(fname) and \
2636 isexec = lambda fname:os.path.isfile(fname) and \
2637 os.access(fname,os.X_OK)
2637 os.access(fname,os.X_OK)
2638 else:
2638 else:
2639 try:
2639 try:
2640 winext = os.environ['pathext'].replace(';','|').replace('.','')
2640 winext = os.environ['pathext'].replace(';','|').replace('.','')
2641 except KeyError:
2641 except KeyError:
2642 winext = 'exe|com|bat|py'
2642 winext = 'exe|com|bat|py'
2643 if 'py' not in winext:
2643 if 'py' not in winext:
2644 winext += '|py'
2644 winext += '|py'
2645 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2645 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2646 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2646 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2647 savedir = os.getcwd()
2647 savedir = os.getcwd()
2648
2648
2649 # Now walk the paths looking for executables to alias.
2649 # Now walk the paths looking for executables to alias.
2650 try:
2650 try:
2651 # write the whole loop for posix/Windows so we don't have an if in
2651 # write the whole loop for posix/Windows so we don't have an if in
2652 # the innermost part
2652 # the innermost part
2653 if os.name == 'posix':
2653 if os.name == 'posix':
2654 for pdir in path:
2654 for pdir in path:
2655 os.chdir(pdir)
2655 os.chdir(pdir)
2656 for ff in os.listdir(pdir):
2656 for ff in os.listdir(pdir):
2657 if isexec(ff):
2657 if isexec(ff):
2658 try:
2658 try:
2659 # Removes dots from the name since ipython
2659 # Removes dots from the name since ipython
2660 # will assume names with dots to be python.
2660 # will assume names with dots to be python.
2661 self.shell.alias_manager.define_alias(
2661 self.shell.alias_manager.define_alias(
2662 ff.replace('.',''), ff)
2662 ff.replace('.',''), ff)
2663 except InvalidAliasError:
2663 except InvalidAliasError:
2664 pass
2664 pass
2665 else:
2665 else:
2666 syscmdlist.append(ff)
2666 syscmdlist.append(ff)
2667 else:
2667 else:
2668 no_alias = self.shell.alias_manager.no_alias
2668 no_alias = self.shell.alias_manager.no_alias
2669 for pdir in path:
2669 for pdir in path:
2670 os.chdir(pdir)
2670 os.chdir(pdir)
2671 for ff in os.listdir(pdir):
2671 for ff in os.listdir(pdir):
2672 base, ext = os.path.splitext(ff)
2672 base, ext = os.path.splitext(ff)
2673 if isexec(ff) and base.lower() not in no_alias:
2673 if isexec(ff) and base.lower() not in no_alias:
2674 if ext.lower() == '.exe':
2674 if ext.lower() == '.exe':
2675 ff = base
2675 ff = base
2676 try:
2676 try:
2677 # Removes dots from the name since ipython
2677 # Removes dots from the name since ipython
2678 # will assume names with dots to be python.
2678 # will assume names with dots to be python.
2679 self.shell.alias_manager.define_alias(
2679 self.shell.alias_manager.define_alias(
2680 base.lower().replace('.',''), ff)
2680 base.lower().replace('.',''), ff)
2681 except InvalidAliasError:
2681 except InvalidAliasError:
2682 pass
2682 pass
2683 syscmdlist.append(ff)
2683 syscmdlist.append(ff)
2684 db = self.db
2684 db = self.db
2685 db['syscmdlist'] = syscmdlist
2685 db['syscmdlist'] = syscmdlist
2686 finally:
2686 finally:
2687 os.chdir(savedir)
2687 os.chdir(savedir)
2688
2688
2689 @testdec.skip_doctest
2689 @skip_doctest
2690 def magic_pwd(self, parameter_s = ''):
2690 def magic_pwd(self, parameter_s = ''):
2691 """Return the current working directory path.
2691 """Return the current working directory path.
2692
2692
2693 Examples
2693 Examples
2694 --------
2694 --------
2695 ::
2695 ::
2696
2696
2697 In [9]: pwd
2697 In [9]: pwd
2698 Out[9]: '/home/tsuser/sprint/ipython'
2698 Out[9]: '/home/tsuser/sprint/ipython'
2699 """
2699 """
2700 return os.getcwd()
2700 return os.getcwd()
2701
2701
2702 @testdec.skip_doctest
2702 @skip_doctest
2703 def magic_cd(self, parameter_s=''):
2703 def magic_cd(self, parameter_s=''):
2704 """Change the current working directory.
2704 """Change the current working directory.
2705
2705
2706 This command automatically maintains an internal list of directories
2706 This command automatically maintains an internal list of directories
2707 you visit during your IPython session, in the variable _dh. The
2707 you visit during your IPython session, in the variable _dh. The
2708 command %dhist shows this history nicely formatted. You can also
2708 command %dhist shows this history nicely formatted. You can also
2709 do 'cd -<tab>' to see directory history conveniently.
2709 do 'cd -<tab>' to see directory history conveniently.
2710
2710
2711 Usage:
2711 Usage:
2712
2712
2713 cd 'dir': changes to directory 'dir'.
2713 cd 'dir': changes to directory 'dir'.
2714
2714
2715 cd -: changes to the last visited directory.
2715 cd -: changes to the last visited directory.
2716
2716
2717 cd -<n>: changes to the n-th directory in the directory history.
2717 cd -<n>: changes to the n-th directory in the directory history.
2718
2718
2719 cd --foo: change to directory that matches 'foo' in history
2719 cd --foo: change to directory that matches 'foo' in history
2720
2720
2721 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2721 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2722 (note: cd <bookmark_name> is enough if there is no
2722 (note: cd <bookmark_name> is enough if there is no
2723 directory <bookmark_name>, but a bookmark with the name exists.)
2723 directory <bookmark_name>, but a bookmark with the name exists.)
2724 'cd -b <tab>' allows you to tab-complete bookmark names.
2724 'cd -b <tab>' allows you to tab-complete bookmark names.
2725
2725
2726 Options:
2726 Options:
2727
2727
2728 -q: quiet. Do not print the working directory after the cd command is
2728 -q: quiet. Do not print the working directory after the cd command is
2729 executed. By default IPython's cd command does print this directory,
2729 executed. By default IPython's cd command does print this directory,
2730 since the default prompts do not display path information.
2730 since the default prompts do not display path information.
2731
2731
2732 Note that !cd doesn't work for this purpose because the shell where
2732 Note that !cd doesn't work for this purpose because the shell where
2733 !command runs is immediately discarded after executing 'command'.
2733 !command runs is immediately discarded after executing 'command'.
2734
2734
2735 Examples
2735 Examples
2736 --------
2736 --------
2737 ::
2737 ::
2738
2738
2739 In [10]: cd parent/child
2739 In [10]: cd parent/child
2740 /home/tsuser/parent/child
2740 /home/tsuser/parent/child
2741 """
2741 """
2742
2742
2743 parameter_s = parameter_s.strip()
2743 parameter_s = parameter_s.strip()
2744 #bkms = self.shell.persist.get("bookmarks",{})
2744 #bkms = self.shell.persist.get("bookmarks",{})
2745
2745
2746 oldcwd = os.getcwd()
2746 oldcwd = os.getcwd()
2747 numcd = re.match(r'(-)(\d+)$',parameter_s)
2747 numcd = re.match(r'(-)(\d+)$',parameter_s)
2748 # jump in directory history by number
2748 # jump in directory history by number
2749 if numcd:
2749 if numcd:
2750 nn = int(numcd.group(2))
2750 nn = int(numcd.group(2))
2751 try:
2751 try:
2752 ps = self.shell.user_ns['_dh'][nn]
2752 ps = self.shell.user_ns['_dh'][nn]
2753 except IndexError:
2753 except IndexError:
2754 print 'The requested directory does not exist in history.'
2754 print 'The requested directory does not exist in history.'
2755 return
2755 return
2756 else:
2756 else:
2757 opts = {}
2757 opts = {}
2758 elif parameter_s.startswith('--'):
2758 elif parameter_s.startswith('--'):
2759 ps = None
2759 ps = None
2760 fallback = None
2760 fallback = None
2761 pat = parameter_s[2:]
2761 pat = parameter_s[2:]
2762 dh = self.shell.user_ns['_dh']
2762 dh = self.shell.user_ns['_dh']
2763 # first search only by basename (last component)
2763 # first search only by basename (last component)
2764 for ent in reversed(dh):
2764 for ent in reversed(dh):
2765 if pat in os.path.basename(ent) and os.path.isdir(ent):
2765 if pat in os.path.basename(ent) and os.path.isdir(ent):
2766 ps = ent
2766 ps = ent
2767 break
2767 break
2768
2768
2769 if fallback is None and pat in ent and os.path.isdir(ent):
2769 if fallback is None and pat in ent and os.path.isdir(ent):
2770 fallback = ent
2770 fallback = ent
2771
2771
2772 # if we have no last part match, pick the first full path match
2772 # if we have no last part match, pick the first full path match
2773 if ps is None:
2773 if ps is None:
2774 ps = fallback
2774 ps = fallback
2775
2775
2776 if ps is None:
2776 if ps is None:
2777 print "No matching entry in directory history"
2777 print "No matching entry in directory history"
2778 return
2778 return
2779 else:
2779 else:
2780 opts = {}
2780 opts = {}
2781
2781
2782
2782
2783 else:
2783 else:
2784 #turn all non-space-escaping backslashes to slashes,
2784 #turn all non-space-escaping backslashes to slashes,
2785 # for c:\windows\directory\names\
2785 # for c:\windows\directory\names\
2786 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2786 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2787 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2787 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2788 # jump to previous
2788 # jump to previous
2789 if ps == '-':
2789 if ps == '-':
2790 try:
2790 try:
2791 ps = self.shell.user_ns['_dh'][-2]
2791 ps = self.shell.user_ns['_dh'][-2]
2792 except IndexError:
2792 except IndexError:
2793 raise UsageError('%cd -: No previous directory to change to.')
2793 raise UsageError('%cd -: No previous directory to change to.')
2794 # jump to bookmark if needed
2794 # jump to bookmark if needed
2795 else:
2795 else:
2796 if not os.path.isdir(ps) or opts.has_key('b'):
2796 if not os.path.isdir(ps) or opts.has_key('b'):
2797 bkms = self.db.get('bookmarks', {})
2797 bkms = self.db.get('bookmarks', {})
2798
2798
2799 if bkms.has_key(ps):
2799 if bkms.has_key(ps):
2800 target = bkms[ps]
2800 target = bkms[ps]
2801 print '(bookmark:%s) -> %s' % (ps,target)
2801 print '(bookmark:%s) -> %s' % (ps,target)
2802 ps = target
2802 ps = target
2803 else:
2803 else:
2804 if opts.has_key('b'):
2804 if opts.has_key('b'):
2805 raise UsageError("Bookmark '%s' not found. "
2805 raise UsageError("Bookmark '%s' not found. "
2806 "Use '%%bookmark -l' to see your bookmarks." % ps)
2806 "Use '%%bookmark -l' to see your bookmarks." % ps)
2807
2807
2808 # at this point ps should point to the target dir
2808 # at this point ps should point to the target dir
2809 if ps:
2809 if ps:
2810 try:
2810 try:
2811 os.chdir(os.path.expanduser(ps))
2811 os.chdir(os.path.expanduser(ps))
2812 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2812 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2813 set_term_title('IPython: ' + abbrev_cwd())
2813 set_term_title('IPython: ' + abbrev_cwd())
2814 except OSError:
2814 except OSError:
2815 print sys.exc_info()[1]
2815 print sys.exc_info()[1]
2816 else:
2816 else:
2817 cwd = os.getcwd()
2817 cwd = os.getcwd()
2818 dhist = self.shell.user_ns['_dh']
2818 dhist = self.shell.user_ns['_dh']
2819 if oldcwd != cwd:
2819 if oldcwd != cwd:
2820 dhist.append(cwd)
2820 dhist.append(cwd)
2821 self.db['dhist'] = compress_dhist(dhist)[-100:]
2821 self.db['dhist'] = compress_dhist(dhist)[-100:]
2822
2822
2823 else:
2823 else:
2824 os.chdir(self.shell.home_dir)
2824 os.chdir(self.shell.home_dir)
2825 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2825 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2826 set_term_title('IPython: ' + '~')
2826 set_term_title('IPython: ' + '~')
2827 cwd = os.getcwd()
2827 cwd = os.getcwd()
2828 dhist = self.shell.user_ns['_dh']
2828 dhist = self.shell.user_ns['_dh']
2829
2829
2830 if oldcwd != cwd:
2830 if oldcwd != cwd:
2831 dhist.append(cwd)
2831 dhist.append(cwd)
2832 self.db['dhist'] = compress_dhist(dhist)[-100:]
2832 self.db['dhist'] = compress_dhist(dhist)[-100:]
2833 if not 'q' in opts and self.shell.user_ns['_dh']:
2833 if not 'q' in opts and self.shell.user_ns['_dh']:
2834 print self.shell.user_ns['_dh'][-1]
2834 print self.shell.user_ns['_dh'][-1]
2835
2835
2836
2836
2837 def magic_env(self, parameter_s=''):
2837 def magic_env(self, parameter_s=''):
2838 """List environment variables."""
2838 """List environment variables."""
2839
2839
2840 return os.environ.data
2840 return os.environ.data
2841
2841
2842 def magic_pushd(self, parameter_s=''):
2842 def magic_pushd(self, parameter_s=''):
2843 """Place the current dir on stack and change directory.
2843 """Place the current dir on stack and change directory.
2844
2844
2845 Usage:\\
2845 Usage:\\
2846 %pushd ['dirname']
2846 %pushd ['dirname']
2847 """
2847 """
2848
2848
2849 dir_s = self.shell.dir_stack
2849 dir_s = self.shell.dir_stack
2850 tgt = os.path.expanduser(parameter_s)
2850 tgt = os.path.expanduser(parameter_s)
2851 cwd = os.getcwd().replace(self.home_dir,'~')
2851 cwd = os.getcwd().replace(self.home_dir,'~')
2852 if tgt:
2852 if tgt:
2853 self.magic_cd(parameter_s)
2853 self.magic_cd(parameter_s)
2854 dir_s.insert(0,cwd)
2854 dir_s.insert(0,cwd)
2855 return self.magic_dirs()
2855 return self.magic_dirs()
2856
2856
2857 def magic_popd(self, parameter_s=''):
2857 def magic_popd(self, parameter_s=''):
2858 """Change to directory popped off the top of the stack.
2858 """Change to directory popped off the top of the stack.
2859 """
2859 """
2860 if not self.shell.dir_stack:
2860 if not self.shell.dir_stack:
2861 raise UsageError("%popd on empty stack")
2861 raise UsageError("%popd on empty stack")
2862 top = self.shell.dir_stack.pop(0)
2862 top = self.shell.dir_stack.pop(0)
2863 self.magic_cd(top)
2863 self.magic_cd(top)
2864 print "popd ->",top
2864 print "popd ->",top
2865
2865
2866 def magic_dirs(self, parameter_s=''):
2866 def magic_dirs(self, parameter_s=''):
2867 """Return the current directory stack."""
2867 """Return the current directory stack."""
2868
2868
2869 return self.shell.dir_stack
2869 return self.shell.dir_stack
2870
2870
2871 def magic_dhist(self, parameter_s=''):
2871 def magic_dhist(self, parameter_s=''):
2872 """Print your history of visited directories.
2872 """Print your history of visited directories.
2873
2873
2874 %dhist -> print full history\\
2874 %dhist -> print full history\\
2875 %dhist n -> print last n entries only\\
2875 %dhist n -> print last n entries only\\
2876 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2876 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2877
2877
2878 This history is automatically maintained by the %cd command, and
2878 This history is automatically maintained by the %cd command, and
2879 always available as the global list variable _dh. You can use %cd -<n>
2879 always available as the global list variable _dh. You can use %cd -<n>
2880 to go to directory number <n>.
2880 to go to directory number <n>.
2881
2881
2882 Note that most of time, you should view directory history by entering
2882 Note that most of time, you should view directory history by entering
2883 cd -<TAB>.
2883 cd -<TAB>.
2884
2884
2885 """
2885 """
2886
2886
2887 dh = self.shell.user_ns['_dh']
2887 dh = self.shell.user_ns['_dh']
2888 if parameter_s:
2888 if parameter_s:
2889 try:
2889 try:
2890 args = map(int,parameter_s.split())
2890 args = map(int,parameter_s.split())
2891 except:
2891 except:
2892 self.arg_err(Magic.magic_dhist)
2892 self.arg_err(Magic.magic_dhist)
2893 return
2893 return
2894 if len(args) == 1:
2894 if len(args) == 1:
2895 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2895 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2896 elif len(args) == 2:
2896 elif len(args) == 2:
2897 ini,fin = args
2897 ini,fin = args
2898 else:
2898 else:
2899 self.arg_err(Magic.magic_dhist)
2899 self.arg_err(Magic.magic_dhist)
2900 return
2900 return
2901 else:
2901 else:
2902 ini,fin = 0,len(dh)
2902 ini,fin = 0,len(dh)
2903 nlprint(dh,
2903 nlprint(dh,
2904 header = 'Directory history (kept in _dh)',
2904 header = 'Directory history (kept in _dh)',
2905 start=ini,stop=fin)
2905 start=ini,stop=fin)
2906
2906
2907 @testdec.skip_doctest
2907 @skip_doctest
2908 def magic_sc(self, parameter_s=''):
2908 def magic_sc(self, parameter_s=''):
2909 """Shell capture - execute a shell command and capture its output.
2909 """Shell capture - execute a shell command and capture its output.
2910
2910
2911 DEPRECATED. Suboptimal, retained for backwards compatibility.
2911 DEPRECATED. Suboptimal, retained for backwards compatibility.
2912
2912
2913 You should use the form 'var = !command' instead. Example:
2913 You should use the form 'var = !command' instead. Example:
2914
2914
2915 "%sc -l myfiles = ls ~" should now be written as
2915 "%sc -l myfiles = ls ~" should now be written as
2916
2916
2917 "myfiles = !ls ~"
2917 "myfiles = !ls ~"
2918
2918
2919 myfiles.s, myfiles.l and myfiles.n still apply as documented
2919 myfiles.s, myfiles.l and myfiles.n still apply as documented
2920 below.
2920 below.
2921
2921
2922 --
2922 --
2923 %sc [options] varname=command
2923 %sc [options] varname=command
2924
2924
2925 IPython will run the given command using commands.getoutput(), and
2925 IPython will run the given command using commands.getoutput(), and
2926 will then update the user's interactive namespace with a variable
2926 will then update the user's interactive namespace with a variable
2927 called varname, containing the value of the call. Your command can
2927 called varname, containing the value of the call. Your command can
2928 contain shell wildcards, pipes, etc.
2928 contain shell wildcards, pipes, etc.
2929
2929
2930 The '=' sign in the syntax is mandatory, and the variable name you
2930 The '=' sign in the syntax is mandatory, and the variable name you
2931 supply must follow Python's standard conventions for valid names.
2931 supply must follow Python's standard conventions for valid names.
2932
2932
2933 (A special format without variable name exists for internal use)
2933 (A special format without variable name exists for internal use)
2934
2934
2935 Options:
2935 Options:
2936
2936
2937 -l: list output. Split the output on newlines into a list before
2937 -l: list output. Split the output on newlines into a list before
2938 assigning it to the given variable. By default the output is stored
2938 assigning it to the given variable. By default the output is stored
2939 as a single string.
2939 as a single string.
2940
2940
2941 -v: verbose. Print the contents of the variable.
2941 -v: verbose. Print the contents of the variable.
2942
2942
2943 In most cases you should not need to split as a list, because the
2943 In most cases you should not need to split as a list, because the
2944 returned value is a special type of string which can automatically
2944 returned value is a special type of string which can automatically
2945 provide its contents either as a list (split on newlines) or as a
2945 provide its contents either as a list (split on newlines) or as a
2946 space-separated string. These are convenient, respectively, either
2946 space-separated string. These are convenient, respectively, either
2947 for sequential processing or to be passed to a shell command.
2947 for sequential processing or to be passed to a shell command.
2948
2948
2949 For example:
2949 For example:
2950
2950
2951 # all-random
2951 # all-random
2952
2952
2953 # Capture into variable a
2953 # Capture into variable a
2954 In [1]: sc a=ls *py
2954 In [1]: sc a=ls *py
2955
2955
2956 # a is a string with embedded newlines
2956 # a is a string with embedded newlines
2957 In [2]: a
2957 In [2]: a
2958 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2958 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2959
2959
2960 # which can be seen as a list:
2960 # which can be seen as a list:
2961 In [3]: a.l
2961 In [3]: a.l
2962 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2962 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2963
2963
2964 # or as a whitespace-separated string:
2964 # or as a whitespace-separated string:
2965 In [4]: a.s
2965 In [4]: a.s
2966 Out[4]: 'setup.py win32_manual_post_install.py'
2966 Out[4]: 'setup.py win32_manual_post_install.py'
2967
2967
2968 # a.s is useful to pass as a single command line:
2968 # a.s is useful to pass as a single command line:
2969 In [5]: !wc -l $a.s
2969 In [5]: !wc -l $a.s
2970 146 setup.py
2970 146 setup.py
2971 130 win32_manual_post_install.py
2971 130 win32_manual_post_install.py
2972 276 total
2972 276 total
2973
2973
2974 # while the list form is useful to loop over:
2974 # while the list form is useful to loop over:
2975 In [6]: for f in a.l:
2975 In [6]: for f in a.l:
2976 ...: !wc -l $f
2976 ...: !wc -l $f
2977 ...:
2977 ...:
2978 146 setup.py
2978 146 setup.py
2979 130 win32_manual_post_install.py
2979 130 win32_manual_post_install.py
2980
2980
2981 Similiarly, the lists returned by the -l option are also special, in
2981 Similiarly, the lists returned by the -l option are also special, in
2982 the sense that you can equally invoke the .s attribute on them to
2982 the sense that you can equally invoke the .s attribute on them to
2983 automatically get a whitespace-separated string from their contents:
2983 automatically get a whitespace-separated string from their contents:
2984
2984
2985 In [7]: sc -l b=ls *py
2985 In [7]: sc -l b=ls *py
2986
2986
2987 In [8]: b
2987 In [8]: b
2988 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2988 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2989
2989
2990 In [9]: b.s
2990 In [9]: b.s
2991 Out[9]: 'setup.py win32_manual_post_install.py'
2991 Out[9]: 'setup.py win32_manual_post_install.py'
2992
2992
2993 In summary, both the lists and strings used for ouptut capture have
2993 In summary, both the lists and strings used for ouptut capture have
2994 the following special attributes:
2994 the following special attributes:
2995
2995
2996 .l (or .list) : value as list.
2996 .l (or .list) : value as list.
2997 .n (or .nlstr): value as newline-separated string.
2997 .n (or .nlstr): value as newline-separated string.
2998 .s (or .spstr): value as space-separated string.
2998 .s (or .spstr): value as space-separated string.
2999 """
2999 """
3000
3000
3001 opts,args = self.parse_options(parameter_s,'lv')
3001 opts,args = self.parse_options(parameter_s,'lv')
3002 # Try to get a variable name and command to run
3002 # Try to get a variable name and command to run
3003 try:
3003 try:
3004 # the variable name must be obtained from the parse_options
3004 # the variable name must be obtained from the parse_options
3005 # output, which uses shlex.split to strip options out.
3005 # output, which uses shlex.split to strip options out.
3006 var,_ = args.split('=',1)
3006 var,_ = args.split('=',1)
3007 var = var.strip()
3007 var = var.strip()
3008 # But the the command has to be extracted from the original input
3008 # But the the command has to be extracted from the original input
3009 # parameter_s, not on what parse_options returns, to avoid the
3009 # parameter_s, not on what parse_options returns, to avoid the
3010 # quote stripping which shlex.split performs on it.
3010 # quote stripping which shlex.split performs on it.
3011 _,cmd = parameter_s.split('=',1)
3011 _,cmd = parameter_s.split('=',1)
3012 except ValueError:
3012 except ValueError:
3013 var,cmd = '',''
3013 var,cmd = '',''
3014 # If all looks ok, proceed
3014 # If all looks ok, proceed
3015 split = 'l' in opts
3015 split = 'l' in opts
3016 out = self.shell.getoutput(cmd, split=split)
3016 out = self.shell.getoutput(cmd, split=split)
3017 if opts.has_key('v'):
3017 if opts.has_key('v'):
3018 print '%s ==\n%s' % (var,pformat(out))
3018 print '%s ==\n%s' % (var,pformat(out))
3019 if var:
3019 if var:
3020 self.shell.user_ns.update({var:out})
3020 self.shell.user_ns.update({var:out})
3021 else:
3021 else:
3022 return out
3022 return out
3023
3023
3024 def magic_sx(self, parameter_s=''):
3024 def magic_sx(self, parameter_s=''):
3025 """Shell execute - run a shell command and capture its output.
3025 """Shell execute - run a shell command and capture its output.
3026
3026
3027 %sx command
3027 %sx command
3028
3028
3029 IPython will run the given command using commands.getoutput(), and
3029 IPython will run the given command using commands.getoutput(), and
3030 return the result formatted as a list (split on '\\n'). Since the
3030 return the result formatted as a list (split on '\\n'). Since the
3031 output is _returned_, it will be stored in ipython's regular output
3031 output is _returned_, it will be stored in ipython's regular output
3032 cache Out[N] and in the '_N' automatic variables.
3032 cache Out[N] and in the '_N' automatic variables.
3033
3033
3034 Notes:
3034 Notes:
3035
3035
3036 1) If an input line begins with '!!', then %sx is automatically
3036 1) If an input line begins with '!!', then %sx is automatically
3037 invoked. That is, while:
3037 invoked. That is, while:
3038 !ls
3038 !ls
3039 causes ipython to simply issue system('ls'), typing
3039 causes ipython to simply issue system('ls'), typing
3040 !!ls
3040 !!ls
3041 is a shorthand equivalent to:
3041 is a shorthand equivalent to:
3042 %sx ls
3042 %sx ls
3043
3043
3044 2) %sx differs from %sc in that %sx automatically splits into a list,
3044 2) %sx differs from %sc in that %sx automatically splits into a list,
3045 like '%sc -l'. The reason for this is to make it as easy as possible
3045 like '%sc -l'. The reason for this is to make it as easy as possible
3046 to process line-oriented shell output via further python commands.
3046 to process line-oriented shell output via further python commands.
3047 %sc is meant to provide much finer control, but requires more
3047 %sc is meant to provide much finer control, but requires more
3048 typing.
3048 typing.
3049
3049
3050 3) Just like %sc -l, this is a list with special attributes:
3050 3) Just like %sc -l, this is a list with special attributes:
3051
3051
3052 .l (or .list) : value as list.
3052 .l (or .list) : value as list.
3053 .n (or .nlstr): value as newline-separated string.
3053 .n (or .nlstr): value as newline-separated string.
3054 .s (or .spstr): value as whitespace-separated string.
3054 .s (or .spstr): value as whitespace-separated string.
3055
3055
3056 This is very useful when trying to use such lists as arguments to
3056 This is very useful when trying to use such lists as arguments to
3057 system commands."""
3057 system commands."""
3058
3058
3059 if parameter_s:
3059 if parameter_s:
3060 return self.shell.getoutput(parameter_s)
3060 return self.shell.getoutput(parameter_s)
3061
3061
3062
3062
3063 def magic_bookmark(self, parameter_s=''):
3063 def magic_bookmark(self, parameter_s=''):
3064 """Manage IPython's bookmark system.
3064 """Manage IPython's bookmark system.
3065
3065
3066 %bookmark <name> - set bookmark to current dir
3066 %bookmark <name> - set bookmark to current dir
3067 %bookmark <name> <dir> - set bookmark to <dir>
3067 %bookmark <name> <dir> - set bookmark to <dir>
3068 %bookmark -l - list all bookmarks
3068 %bookmark -l - list all bookmarks
3069 %bookmark -d <name> - remove bookmark
3069 %bookmark -d <name> - remove bookmark
3070 %bookmark -r - remove all bookmarks
3070 %bookmark -r - remove all bookmarks
3071
3071
3072 You can later on access a bookmarked folder with:
3072 You can later on access a bookmarked folder with:
3073 %cd -b <name>
3073 %cd -b <name>
3074 or simply '%cd <name>' if there is no directory called <name> AND
3074 or simply '%cd <name>' if there is no directory called <name> AND
3075 there is such a bookmark defined.
3075 there is such a bookmark defined.
3076
3076
3077 Your bookmarks persist through IPython sessions, but they are
3077 Your bookmarks persist through IPython sessions, but they are
3078 associated with each profile."""
3078 associated with each profile."""
3079
3079
3080 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3080 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3081 if len(args) > 2:
3081 if len(args) > 2:
3082 raise UsageError("%bookmark: too many arguments")
3082 raise UsageError("%bookmark: too many arguments")
3083
3083
3084 bkms = self.db.get('bookmarks',{})
3084 bkms = self.db.get('bookmarks',{})
3085
3085
3086 if opts.has_key('d'):
3086 if opts.has_key('d'):
3087 try:
3087 try:
3088 todel = args[0]
3088 todel = args[0]
3089 except IndexError:
3089 except IndexError:
3090 raise UsageError(
3090 raise UsageError(
3091 "%bookmark -d: must provide a bookmark to delete")
3091 "%bookmark -d: must provide a bookmark to delete")
3092 else:
3092 else:
3093 try:
3093 try:
3094 del bkms[todel]
3094 del bkms[todel]
3095 except KeyError:
3095 except KeyError:
3096 raise UsageError(
3096 raise UsageError(
3097 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3097 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3098
3098
3099 elif opts.has_key('r'):
3099 elif opts.has_key('r'):
3100 bkms = {}
3100 bkms = {}
3101 elif opts.has_key('l'):
3101 elif opts.has_key('l'):
3102 bks = bkms.keys()
3102 bks = bkms.keys()
3103 bks.sort()
3103 bks.sort()
3104 if bks:
3104 if bks:
3105 size = max(map(len,bks))
3105 size = max(map(len,bks))
3106 else:
3106 else:
3107 size = 0
3107 size = 0
3108 fmt = '%-'+str(size)+'s -> %s'
3108 fmt = '%-'+str(size)+'s -> %s'
3109 print 'Current bookmarks:'
3109 print 'Current bookmarks:'
3110 for bk in bks:
3110 for bk in bks:
3111 print fmt % (bk,bkms[bk])
3111 print fmt % (bk,bkms[bk])
3112 else:
3112 else:
3113 if not args:
3113 if not args:
3114 raise UsageError("%bookmark: You must specify the bookmark name")
3114 raise UsageError("%bookmark: You must specify the bookmark name")
3115 elif len(args)==1:
3115 elif len(args)==1:
3116 bkms[args[0]] = os.getcwd()
3116 bkms[args[0]] = os.getcwd()
3117 elif len(args)==2:
3117 elif len(args)==2:
3118 bkms[args[0]] = args[1]
3118 bkms[args[0]] = args[1]
3119 self.db['bookmarks'] = bkms
3119 self.db['bookmarks'] = bkms
3120
3120
3121 def magic_pycat(self, parameter_s=''):
3121 def magic_pycat(self, parameter_s=''):
3122 """Show a syntax-highlighted file through a pager.
3122 """Show a syntax-highlighted file through a pager.
3123
3123
3124 This magic is similar to the cat utility, but it will assume the file
3124 This magic is similar to the cat utility, but it will assume the file
3125 to be Python source and will show it with syntax highlighting. """
3125 to be Python source and will show it with syntax highlighting. """
3126
3126
3127 try:
3127 try:
3128 filename = get_py_filename(parameter_s)
3128 filename = get_py_filename(parameter_s)
3129 cont = file_read(filename)
3129 cont = file_read(filename)
3130 except IOError:
3130 except IOError:
3131 try:
3131 try:
3132 cont = eval(parameter_s,self.user_ns)
3132 cont = eval(parameter_s,self.user_ns)
3133 except NameError:
3133 except NameError:
3134 cont = None
3134 cont = None
3135 if cont is None:
3135 if cont is None:
3136 print "Error: no such file or variable"
3136 print "Error: no such file or variable"
3137 return
3137 return
3138
3138
3139 page.page(self.shell.pycolorize(cont))
3139 page.page(self.shell.pycolorize(cont))
3140
3140
3141 def _rerun_pasted(self):
3141 def _rerun_pasted(self):
3142 """ Rerun a previously pasted command.
3142 """ Rerun a previously pasted command.
3143 """
3143 """
3144 b = self.user_ns.get('pasted_block', None)
3144 b = self.user_ns.get('pasted_block', None)
3145 if b is None:
3145 if b is None:
3146 raise UsageError('No previous pasted block available')
3146 raise UsageError('No previous pasted block available')
3147 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3147 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3148 exec b in self.user_ns
3148 exec b in self.user_ns
3149
3149
3150 def _get_pasted_lines(self, sentinel):
3150 def _get_pasted_lines(self, sentinel):
3151 """ Yield pasted lines until the user enters the given sentinel value.
3151 """ Yield pasted lines until the user enters the given sentinel value.
3152 """
3152 """
3153 from IPython.core import interactiveshell
3153 from IPython.core import interactiveshell
3154 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3154 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3155 while True:
3155 while True:
3156 l = interactiveshell.raw_input_original(':')
3156 l = interactiveshell.raw_input_original(':')
3157 if l == sentinel:
3157 if l == sentinel:
3158 return
3158 return
3159 else:
3159 else:
3160 yield l
3160 yield l
3161
3161
3162 def _strip_pasted_lines_for_code(self, raw_lines):
3162 def _strip_pasted_lines_for_code(self, raw_lines):
3163 """ Strip non-code parts of a sequence of lines to return a block of
3163 """ Strip non-code parts of a sequence of lines to return a block of
3164 code.
3164 code.
3165 """
3165 """
3166 # Regular expressions that declare text we strip from the input:
3166 # Regular expressions that declare text we strip from the input:
3167 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3167 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3168 r'^\s*(\s?>)+', # Python input prompt
3168 r'^\s*(\s?>)+', # Python input prompt
3169 r'^\s*\.{3,}', # Continuation prompts
3169 r'^\s*\.{3,}', # Continuation prompts
3170 r'^\++',
3170 r'^\++',
3171 ]
3171 ]
3172
3172
3173 strip_from_start = map(re.compile,strip_re)
3173 strip_from_start = map(re.compile,strip_re)
3174
3174
3175 lines = []
3175 lines = []
3176 for l in raw_lines:
3176 for l in raw_lines:
3177 for pat in strip_from_start:
3177 for pat in strip_from_start:
3178 l = pat.sub('',l)
3178 l = pat.sub('',l)
3179 lines.append(l)
3179 lines.append(l)
3180
3180
3181 block = "\n".join(lines) + '\n'
3181 block = "\n".join(lines) + '\n'
3182 #print "block:\n",block
3182 #print "block:\n",block
3183 return block
3183 return block
3184
3184
3185 def _execute_block(self, block, par):
3185 def _execute_block(self, block, par):
3186 """ Execute a block, or store it in a variable, per the user's request.
3186 """ Execute a block, or store it in a variable, per the user's request.
3187 """
3187 """
3188 if not par:
3188 if not par:
3189 b = textwrap.dedent(block)
3189 b = textwrap.dedent(block)
3190 self.user_ns['pasted_block'] = b
3190 self.user_ns['pasted_block'] = b
3191 exec b in self.user_ns
3191 exec b in self.user_ns
3192 else:
3192 else:
3193 self.user_ns[par] = SList(block.splitlines())
3193 self.user_ns[par] = SList(block.splitlines())
3194 print "Block assigned to '%s'" % par
3194 print "Block assigned to '%s'" % par
3195
3195
3196 def magic_quickref(self,arg):
3196 def magic_quickref(self,arg):
3197 """ Show a quick reference sheet """
3197 """ Show a quick reference sheet """
3198 import IPython.core.usage
3198 import IPython.core.usage
3199 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3199 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3200
3200
3201 page.page(qr)
3201 page.page(qr)
3202
3202
3203 def magic_doctest_mode(self,parameter_s=''):
3203 def magic_doctest_mode(self,parameter_s=''):
3204 """Toggle doctest mode on and off.
3204 """Toggle doctest mode on and off.
3205
3205
3206 This mode is intended to make IPython behave as much as possible like a
3206 This mode is intended to make IPython behave as much as possible like a
3207 plain Python shell, from the perspective of how its prompts, exceptions
3207 plain Python shell, from the perspective of how its prompts, exceptions
3208 and output look. This makes it easy to copy and paste parts of a
3208 and output look. This makes it easy to copy and paste parts of a
3209 session into doctests. It does so by:
3209 session into doctests. It does so by:
3210
3210
3211 - Changing the prompts to the classic ``>>>`` ones.
3211 - Changing the prompts to the classic ``>>>`` ones.
3212 - Changing the exception reporting mode to 'Plain'.
3212 - Changing the exception reporting mode to 'Plain'.
3213 - Disabling pretty-printing of output.
3213 - Disabling pretty-printing of output.
3214
3214
3215 Note that IPython also supports the pasting of code snippets that have
3215 Note that IPython also supports the pasting of code snippets that have
3216 leading '>>>' and '...' prompts in them. This means that you can paste
3216 leading '>>>' and '...' prompts in them. This means that you can paste
3217 doctests from files or docstrings (even if they have leading
3217 doctests from files or docstrings (even if they have leading
3218 whitespace), and the code will execute correctly. You can then use
3218 whitespace), and the code will execute correctly. You can then use
3219 '%history -t' to see the translated history; this will give you the
3219 '%history -t' to see the translated history; this will give you the
3220 input after removal of all the leading prompts and whitespace, which
3220 input after removal of all the leading prompts and whitespace, which
3221 can be pasted back into an editor.
3221 can be pasted back into an editor.
3222
3222
3223 With these features, you can switch into this mode easily whenever you
3223 With these features, you can switch into this mode easily whenever you
3224 need to do testing and changes to doctests, without having to leave
3224 need to do testing and changes to doctests, without having to leave
3225 your existing IPython session.
3225 your existing IPython session.
3226 """
3226 """
3227
3227
3228 from IPython.utils.ipstruct import Struct
3228 from IPython.utils.ipstruct import Struct
3229
3229
3230 # Shorthands
3230 # Shorthands
3231 shell = self.shell
3231 shell = self.shell
3232 oc = shell.displayhook
3232 oc = shell.displayhook
3233 meta = shell.meta
3233 meta = shell.meta
3234 disp_formatter = self.shell.display_formatter
3234 disp_formatter = self.shell.display_formatter
3235 ptformatter = disp_formatter.formatters['text/plain']
3235 ptformatter = disp_formatter.formatters['text/plain']
3236 # dstore is a data store kept in the instance metadata bag to track any
3236 # dstore is a data store kept in the instance metadata bag to track any
3237 # changes we make, so we can undo them later.
3237 # changes we make, so we can undo them later.
3238 dstore = meta.setdefault('doctest_mode',Struct())
3238 dstore = meta.setdefault('doctest_mode',Struct())
3239 save_dstore = dstore.setdefault
3239 save_dstore = dstore.setdefault
3240
3240
3241 # save a few values we'll need to recover later
3241 # save a few values we'll need to recover later
3242 mode = save_dstore('mode',False)
3242 mode = save_dstore('mode',False)
3243 save_dstore('rc_pprint',ptformatter.pprint)
3243 save_dstore('rc_pprint',ptformatter.pprint)
3244 save_dstore('xmode',shell.InteractiveTB.mode)
3244 save_dstore('xmode',shell.InteractiveTB.mode)
3245 save_dstore('rc_separate_out',shell.separate_out)
3245 save_dstore('rc_separate_out',shell.separate_out)
3246 save_dstore('rc_separate_out2',shell.separate_out2)
3246 save_dstore('rc_separate_out2',shell.separate_out2)
3247 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3247 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3248 save_dstore('rc_separate_in',shell.separate_in)
3248 save_dstore('rc_separate_in',shell.separate_in)
3249 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
3249 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
3250
3250
3251 if mode == False:
3251 if mode == False:
3252 # turn on
3252 # turn on
3253 oc.prompt1.p_template = '>>> '
3253 oc.prompt1.p_template = '>>> '
3254 oc.prompt2.p_template = '... '
3254 oc.prompt2.p_template = '... '
3255 oc.prompt_out.p_template = ''
3255 oc.prompt_out.p_template = ''
3256
3256
3257 # Prompt separators like plain python
3257 # Prompt separators like plain python
3258 oc.input_sep = oc.prompt1.sep = ''
3258 oc.input_sep = oc.prompt1.sep = ''
3259 oc.output_sep = ''
3259 oc.output_sep = ''
3260 oc.output_sep2 = ''
3260 oc.output_sep2 = ''
3261
3261
3262 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3262 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3263 oc.prompt_out.pad_left = False
3263 oc.prompt_out.pad_left = False
3264
3264
3265 ptformatter.pprint = False
3265 ptformatter.pprint = False
3266 disp_formatter.plain_text_only = True
3266 disp_formatter.plain_text_only = True
3267
3267
3268 shell.magic_xmode('Plain')
3268 shell.magic_xmode('Plain')
3269 else:
3269 else:
3270 # turn off
3270 # turn off
3271 oc.prompt1.p_template = shell.prompt_in1
3271 oc.prompt1.p_template = shell.prompt_in1
3272 oc.prompt2.p_template = shell.prompt_in2
3272 oc.prompt2.p_template = shell.prompt_in2
3273 oc.prompt_out.p_template = shell.prompt_out
3273 oc.prompt_out.p_template = shell.prompt_out
3274
3274
3275 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3275 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3276
3276
3277 oc.output_sep = dstore.rc_separate_out
3277 oc.output_sep = dstore.rc_separate_out
3278 oc.output_sep2 = dstore.rc_separate_out2
3278 oc.output_sep2 = dstore.rc_separate_out2
3279
3279
3280 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3280 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3281 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3281 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3282
3282
3283 ptformatter.pprint = dstore.rc_pprint
3283 ptformatter.pprint = dstore.rc_pprint
3284 disp_formatter.plain_text_only = dstore.rc_plain_text_only
3284 disp_formatter.plain_text_only = dstore.rc_plain_text_only
3285
3285
3286 shell.magic_xmode(dstore.xmode)
3286 shell.magic_xmode(dstore.xmode)
3287
3287
3288 # Store new mode and inform
3288 # Store new mode and inform
3289 dstore.mode = bool(1-int(mode))
3289 dstore.mode = bool(1-int(mode))
3290 mode_label = ['OFF','ON'][dstore.mode]
3290 mode_label = ['OFF','ON'][dstore.mode]
3291 print 'Doctest mode is:', mode_label
3291 print 'Doctest mode is:', mode_label
3292
3292
3293 def magic_gui(self, parameter_s=''):
3293 def magic_gui(self, parameter_s=''):
3294 """Enable or disable IPython GUI event loop integration.
3294 """Enable or disable IPython GUI event loop integration.
3295
3295
3296 %gui [GUINAME]
3296 %gui [GUINAME]
3297
3297
3298 This magic replaces IPython's threaded shells that were activated
3298 This magic replaces IPython's threaded shells that were activated
3299 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3299 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3300 can now be enabled, disabled and changed at runtime and keyboard
3300 can now be enabled, disabled and changed at runtime and keyboard
3301 interrupts should work without any problems. The following toolkits
3301 interrupts should work without any problems. The following toolkits
3302 are supported: wxPython, PyQt4, PyGTK, and Tk::
3302 are supported: wxPython, PyQt4, PyGTK, and Tk::
3303
3303
3304 %gui wx # enable wxPython event loop integration
3304 %gui wx # enable wxPython event loop integration
3305 %gui qt4|qt # enable PyQt4 event loop integration
3305 %gui qt4|qt # enable PyQt4 event loop integration
3306 %gui gtk # enable PyGTK event loop integration
3306 %gui gtk # enable PyGTK event loop integration
3307 %gui tk # enable Tk event loop integration
3307 %gui tk # enable Tk event loop integration
3308 %gui # disable all event loop integration
3308 %gui # disable all event loop integration
3309
3309
3310 WARNING: after any of these has been called you can simply create
3310 WARNING: after any of these has been called you can simply create
3311 an application object, but DO NOT start the event loop yourself, as
3311 an application object, but DO NOT start the event loop yourself, as
3312 we have already handled that.
3312 we have already handled that.
3313 """
3313 """
3314 from IPython.lib.inputhook import enable_gui
3314 from IPython.lib.inputhook import enable_gui
3315 opts, arg = self.parse_options(parameter_s, '')
3315 opts, arg = self.parse_options(parameter_s, '')
3316 if arg=='': arg = None
3316 if arg=='': arg = None
3317 return enable_gui(arg)
3317 return enable_gui(arg)
3318
3318
3319 def magic_load_ext(self, module_str):
3319 def magic_load_ext(self, module_str):
3320 """Load an IPython extension by its module name."""
3320 """Load an IPython extension by its module name."""
3321 return self.extension_manager.load_extension(module_str)
3321 return self.extension_manager.load_extension(module_str)
3322
3322
3323 def magic_unload_ext(self, module_str):
3323 def magic_unload_ext(self, module_str):
3324 """Unload an IPython extension by its module name."""
3324 """Unload an IPython extension by its module name."""
3325 self.extension_manager.unload_extension(module_str)
3325 self.extension_manager.unload_extension(module_str)
3326
3326
3327 def magic_reload_ext(self, module_str):
3327 def magic_reload_ext(self, module_str):
3328 """Reload an IPython extension by its module name."""
3328 """Reload an IPython extension by its module name."""
3329 self.extension_manager.reload_extension(module_str)
3329 self.extension_manager.reload_extension(module_str)
3330
3330
3331 @testdec.skip_doctest
3331 @skip_doctest
3332 def magic_install_profiles(self, s):
3332 def magic_install_profiles(self, s):
3333 """Install the default IPython profiles into the .ipython dir.
3333 """Install the default IPython profiles into the .ipython dir.
3334
3334
3335 If the default profiles have already been installed, they will not
3335 If the default profiles have already been installed, they will not
3336 be overwritten. You can force overwriting them by using the ``-o``
3336 be overwritten. You can force overwriting them by using the ``-o``
3337 option::
3337 option::
3338
3338
3339 In [1]: %install_profiles -o
3339 In [1]: %install_profiles -o
3340 """
3340 """
3341 if '-o' in s:
3341 if '-o' in s:
3342 overwrite = True
3342 overwrite = True
3343 else:
3343 else:
3344 overwrite = False
3344 overwrite = False
3345 from IPython.config import profile
3345 from IPython.config import profile
3346 profile_dir = os.path.split(profile.__file__)[0]
3346 profile_dir = os.path.split(profile.__file__)[0]
3347 ipython_dir = self.ipython_dir
3347 ipython_dir = self.ipython_dir
3348 files = os.listdir(profile_dir)
3348 files = os.listdir(profile_dir)
3349
3349
3350 to_install = []
3350 to_install = []
3351 for f in files:
3351 for f in files:
3352 if f.startswith('ipython_config'):
3352 if f.startswith('ipython_config'):
3353 src = os.path.join(profile_dir, f)
3353 src = os.path.join(profile_dir, f)
3354 dst = os.path.join(ipython_dir, f)
3354 dst = os.path.join(ipython_dir, f)
3355 if (not os.path.isfile(dst)) or overwrite:
3355 if (not os.path.isfile(dst)) or overwrite:
3356 to_install.append((f, src, dst))
3356 to_install.append((f, src, dst))
3357 if len(to_install)>0:
3357 if len(to_install)>0:
3358 print "Installing profiles to: ", ipython_dir
3358 print "Installing profiles to: ", ipython_dir
3359 for (f, src, dst) in to_install:
3359 for (f, src, dst) in to_install:
3360 shutil.copy(src, dst)
3360 shutil.copy(src, dst)
3361 print " %s" % f
3361 print " %s" % f
3362
3362
3363 def magic_install_default_config(self, s):
3363 def magic_install_default_config(self, s):
3364 """Install IPython's default config file into the .ipython dir.
3364 """Install IPython's default config file into the .ipython dir.
3365
3365
3366 If the default config file (:file:`ipython_config.py`) is already
3366 If the default config file (:file:`ipython_config.py`) is already
3367 installed, it will not be overwritten. You can force overwriting
3367 installed, it will not be overwritten. You can force overwriting
3368 by using the ``-o`` option::
3368 by using the ``-o`` option::
3369
3369
3370 In [1]: %install_default_config
3370 In [1]: %install_default_config
3371 """
3371 """
3372 if '-o' in s:
3372 if '-o' in s:
3373 overwrite = True
3373 overwrite = True
3374 else:
3374 else:
3375 overwrite = False
3375 overwrite = False
3376 from IPython.config import default
3376 from IPython.config import default
3377 config_dir = os.path.split(default.__file__)[0]
3377 config_dir = os.path.split(default.__file__)[0]
3378 ipython_dir = self.ipython_dir
3378 ipython_dir = self.ipython_dir
3379 default_config_file_name = 'ipython_config.py'
3379 default_config_file_name = 'ipython_config.py'
3380 src = os.path.join(config_dir, default_config_file_name)
3380 src = os.path.join(config_dir, default_config_file_name)
3381 dst = os.path.join(ipython_dir, default_config_file_name)
3381 dst = os.path.join(ipython_dir, default_config_file_name)
3382 if (not os.path.isfile(dst)) or overwrite:
3382 if (not os.path.isfile(dst)) or overwrite:
3383 shutil.copy(src, dst)
3383 shutil.copy(src, dst)
3384 print "Installing default config file: %s" % dst
3384 print "Installing default config file: %s" % dst
3385
3385
3386 # Pylab support: simple wrappers that activate pylab, load gui input
3386 # Pylab support: simple wrappers that activate pylab, load gui input
3387 # handling and modify slightly %run
3387 # handling and modify slightly %run
3388
3388
3389 @testdec.skip_doctest
3389 @skip_doctest
3390 def _pylab_magic_run(self, parameter_s=''):
3390 def _pylab_magic_run(self, parameter_s=''):
3391 Magic.magic_run(self, parameter_s,
3391 Magic.magic_run(self, parameter_s,
3392 runner=mpl_runner(self.shell.safe_execfile))
3392 runner=mpl_runner(self.shell.safe_execfile))
3393
3393
3394 _pylab_magic_run.__doc__ = magic_run.__doc__
3394 _pylab_magic_run.__doc__ = magic_run.__doc__
3395
3395
3396 @testdec.skip_doctest
3396 @skip_doctest
3397 def magic_pylab(self, s):
3397 def magic_pylab(self, s):
3398 """Load numpy and matplotlib to work interactively.
3398 """Load numpy and matplotlib to work interactively.
3399
3399
3400 %pylab [GUINAME]
3400 %pylab [GUINAME]
3401
3401
3402 This function lets you activate pylab (matplotlib, numpy and
3402 This function lets you activate pylab (matplotlib, numpy and
3403 interactive support) at any point during an IPython session.
3403 interactive support) at any point during an IPython session.
3404
3404
3405 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3405 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3406 pylab and mlab, as well as all names from numpy and pylab.
3406 pylab and mlab, as well as all names from numpy and pylab.
3407
3407
3408 Parameters
3408 Parameters
3409 ----------
3409 ----------
3410 guiname : optional
3410 guiname : optional
3411 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk', 'osx' or
3411 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk', 'osx' or
3412 'tk'). If given, the corresponding Matplotlib backend is used,
3412 'tk'). If given, the corresponding Matplotlib backend is used,
3413 otherwise matplotlib's default (which you can override in your
3413 otherwise matplotlib's default (which you can override in your
3414 matplotlib config file) is used.
3414 matplotlib config file) is used.
3415
3415
3416 Examples
3416 Examples
3417 --------
3417 --------
3418 In this case, where the MPL default is TkAgg:
3418 In this case, where the MPL default is TkAgg:
3419 In [2]: %pylab
3419 In [2]: %pylab
3420
3420
3421 Welcome to pylab, a matplotlib-based Python environment.
3421 Welcome to pylab, a matplotlib-based Python environment.
3422 Backend in use: TkAgg
3422 Backend in use: TkAgg
3423 For more information, type 'help(pylab)'.
3423 For more information, type 'help(pylab)'.
3424
3424
3425 But you can explicitly request a different backend:
3425 But you can explicitly request a different backend:
3426 In [3]: %pylab qt
3426 In [3]: %pylab qt
3427
3427
3428 Welcome to pylab, a matplotlib-based Python environment.
3428 Welcome to pylab, a matplotlib-based Python environment.
3429 Backend in use: Qt4Agg
3429 Backend in use: Qt4Agg
3430 For more information, type 'help(pylab)'.
3430 For more information, type 'help(pylab)'.
3431 """
3431 """
3432 self.shell.enable_pylab(s)
3432 self.shell.enable_pylab(s)
3433
3433
3434 def magic_tb(self, s):
3434 def magic_tb(self, s):
3435 """Print the last traceback with the currently active exception mode.
3435 """Print the last traceback with the currently active exception mode.
3436
3436
3437 See %xmode for changing exception reporting modes."""
3437 See %xmode for changing exception reporting modes."""
3438 self.shell.showtraceback()
3438 self.shell.showtraceback()
3439
3439
3440 @testdec.skip_doctest
3440 @skip_doctest
3441 def magic_precision(self, s=''):
3441 def magic_precision(self, s=''):
3442 """Set floating point precision for pretty printing.
3442 """Set floating point precision for pretty printing.
3443
3443
3444 Can set either integer precision or a format string.
3444 Can set either integer precision or a format string.
3445
3445
3446 If numpy has been imported and precision is an int,
3446 If numpy has been imported and precision is an int,
3447 numpy display precision will also be set, via ``numpy.set_printoptions``.
3447 numpy display precision will also be set, via ``numpy.set_printoptions``.
3448
3448
3449 If no argument is given, defaults will be restored.
3449 If no argument is given, defaults will be restored.
3450
3450
3451 Examples
3451 Examples
3452 --------
3452 --------
3453 ::
3453 ::
3454
3454
3455 In [1]: from math import pi
3455 In [1]: from math import pi
3456
3456
3457 In [2]: %precision 3
3457 In [2]: %precision 3
3458 Out[2]: '%.3f'
3458 Out[2]: '%.3f'
3459
3459
3460 In [3]: pi
3460 In [3]: pi
3461 Out[3]: 3.142
3461 Out[3]: 3.142
3462
3462
3463 In [4]: %precision %i
3463 In [4]: %precision %i
3464 Out[4]: '%i'
3464 Out[4]: '%i'
3465
3465
3466 In [5]: pi
3466 In [5]: pi
3467 Out[5]: 3
3467 Out[5]: 3
3468
3468
3469 In [6]: %precision %e
3469 In [6]: %precision %e
3470 Out[6]: '%e'
3470 Out[6]: '%e'
3471
3471
3472 In [7]: pi**10
3472 In [7]: pi**10
3473 Out[7]: 9.364805e+04
3473 Out[7]: 9.364805e+04
3474
3474
3475 In [8]: %precision
3475 In [8]: %precision
3476 Out[8]: '%r'
3476 Out[8]: '%r'
3477
3477
3478 In [9]: pi**10
3478 In [9]: pi**10
3479 Out[9]: 93648.047476082982
3479 Out[9]: 93648.047476082982
3480
3480
3481 """
3481 """
3482
3482
3483 ptformatter = self.shell.display_formatter.formatters['text/plain']
3483 ptformatter = self.shell.display_formatter.formatters['text/plain']
3484 ptformatter.float_precision = s
3484 ptformatter.float_precision = s
3485 return ptformatter.float_format
3485 return ptformatter.float_format
3486
3486
3487 # end Magic
3487 # end Magic
@@ -1,294 +1,294 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3
3
4 """Magic command interface for interactive parallel work."""
4 """Magic command interface for interactive parallel work."""
5
5
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7 # Copyright (C) 2008-2009 The IPython Development Team
7 # Copyright (C) 2008-2009 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 import ast
17 import ast
18 import re
18 import re
19
19
20 from IPython.core.plugin import Plugin
20 from IPython.core.plugin import Plugin
21 from IPython.utils.traitlets import Bool, Any, Instance
21 from IPython.utils.traitlets import Bool, Any, Instance
22 from IPython.testing import decorators as testdec
22 from IPython.testing.skipdoctest import skip_doctest
23
23
24 #-----------------------------------------------------------------------------
24 #-----------------------------------------------------------------------------
25 # Definitions of magic functions for use with IPython
25 # Definitions of magic functions for use with IPython
26 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
27
27
28
28
29 NO_ACTIVE_VIEW = """
29 NO_ACTIVE_VIEW = """
30 Use activate() on a DirectView object to activate it for magics.
30 Use activate() on a DirectView object to activate it for magics.
31 """
31 """
32
32
33
33
34 class ParalleMagic(Plugin):
34 class ParalleMagic(Plugin):
35 """A component to manage the %result, %px and %autopx magics."""
35 """A component to manage the %result, %px and %autopx magics."""
36
36
37 active_view = Instance('IPython.parallel.client.view.DirectView')
37 active_view = Instance('IPython.parallel.client.view.DirectView')
38 verbose = Bool(False, config=True)
38 verbose = Bool(False, config=True)
39 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
39 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
40
40
41 def __init__(self, shell=None, config=None):
41 def __init__(self, shell=None, config=None):
42 super(ParalleMagic, self).__init__(shell=shell, config=config)
42 super(ParalleMagic, self).__init__(shell=shell, config=config)
43 self._define_magics()
43 self._define_magics()
44 # A flag showing if autopx is activated or not
44 # A flag showing if autopx is activated or not
45 self.autopx = False
45 self.autopx = False
46
46
47 def _define_magics(self):
47 def _define_magics(self):
48 """Define the magic functions."""
48 """Define the magic functions."""
49 self.shell.define_magic('result', self.magic_result)
49 self.shell.define_magic('result', self.magic_result)
50 self.shell.define_magic('px', self.magic_px)
50 self.shell.define_magic('px', self.magic_px)
51 self.shell.define_magic('autopx', self.magic_autopx)
51 self.shell.define_magic('autopx', self.magic_autopx)
52
52
53 @testdec.skip_doctest
53 @skip_doctest
54 def magic_result(self, ipself, parameter_s=''):
54 def magic_result(self, ipself, parameter_s=''):
55 """Print the result of command i on all engines..
55 """Print the result of command i on all engines..
56
56
57 To use this a :class:`DirectView` instance must be created
57 To use this a :class:`DirectView` instance must be created
58 and then activated by calling its :meth:`activate` method.
58 and then activated by calling its :meth:`activate` method.
59
59
60 Then you can do the following::
60 Then you can do the following::
61
61
62 In [23]: %result
62 In [23]: %result
63 Out[23]:
63 Out[23]:
64 <Results List>
64 <Results List>
65 [0] In [6]: a = 10
65 [0] In [6]: a = 10
66 [1] In [6]: a = 10
66 [1] In [6]: a = 10
67
67
68 In [22]: %result 6
68 In [22]: %result 6
69 Out[22]:
69 Out[22]:
70 <Results List>
70 <Results List>
71 [0] In [6]: a = 10
71 [0] In [6]: a = 10
72 [1] In [6]: a = 10
72 [1] In [6]: a = 10
73 """
73 """
74 if self.active_view is None:
74 if self.active_view is None:
75 print NO_ACTIVE_VIEW
75 print NO_ACTIVE_VIEW
76 return
76 return
77
77
78 try:
78 try:
79 index = int(parameter_s)
79 index = int(parameter_s)
80 except:
80 except:
81 index = None
81 index = None
82 result = self.active_view.get_result(index)
82 result = self.active_view.get_result(index)
83 return result
83 return result
84
84
85 @testdec.skip_doctest
85 @skip_doctest
86 def magic_px(self, ipself, parameter_s=''):
86 def magic_px(self, ipself, parameter_s=''):
87 """Executes the given python command in parallel.
87 """Executes the given python command in parallel.
88
88
89 To use this a :class:`DirectView` instance must be created
89 To use this a :class:`DirectView` instance must be created
90 and then activated by calling its :meth:`activate` method.
90 and then activated by calling its :meth:`activate` method.
91
91
92 Then you can do the following::
92 Then you can do the following::
93
93
94 In [24]: %px a = 5
94 In [24]: %px a = 5
95 Parallel execution on engines: all
95 Parallel execution on engines: all
96 Out[24]:
96 Out[24]:
97 <Results List>
97 <Results List>
98 [0] In [7]: a = 5
98 [0] In [7]: a = 5
99 [1] In [7]: a = 5
99 [1] In [7]: a = 5
100 """
100 """
101
101
102 if self.active_view is None:
102 if self.active_view is None:
103 print NO_ACTIVE_VIEW
103 print NO_ACTIVE_VIEW
104 return
104 return
105 print "Parallel execution on engines: %s" % self.active_view.targets
105 print "Parallel execution on engines: %s" % self.active_view.targets
106 result = self.active_view.execute(parameter_s, block=False)
106 result = self.active_view.execute(parameter_s, block=False)
107 if self.active_view.block:
107 if self.active_view.block:
108 result.get()
108 result.get()
109 self._maybe_display_output(result)
109 self._maybe_display_output(result)
110
110
111 @testdec.skip_doctest
111 @skip_doctest
112 def magic_autopx(self, ipself, parameter_s=''):
112 def magic_autopx(self, ipself, parameter_s=''):
113 """Toggles auto parallel mode.
113 """Toggles auto parallel mode.
114
114
115 To use this a :class:`DirectView` instance must be created
115 To use this a :class:`DirectView` instance must be created
116 and then activated by calling its :meth:`activate` method. Once this
116 and then activated by calling its :meth:`activate` method. Once this
117 is called, all commands typed at the command line are send to
117 is called, all commands typed at the command line are send to
118 the engines to be executed in parallel. To control which engine
118 the engines to be executed in parallel. To control which engine
119 are used, set the ``targets`` attributed of the multiengine client
119 are used, set the ``targets`` attributed of the multiengine client
120 before entering ``%autopx`` mode.
120 before entering ``%autopx`` mode.
121
121
122 Then you can do the following::
122 Then you can do the following::
123
123
124 In [25]: %autopx
124 In [25]: %autopx
125 %autopx to enabled
125 %autopx to enabled
126
126
127 In [26]: a = 10
127 In [26]: a = 10
128 Parallel execution on engines: [0,1,2,3]
128 Parallel execution on engines: [0,1,2,3]
129 In [27]: print a
129 In [27]: print a
130 Parallel execution on engines: [0,1,2,3]
130 Parallel execution on engines: [0,1,2,3]
131 [stdout:0] 10
131 [stdout:0] 10
132 [stdout:1] 10
132 [stdout:1] 10
133 [stdout:2] 10
133 [stdout:2] 10
134 [stdout:3] 10
134 [stdout:3] 10
135
135
136
136
137 In [27]: %autopx
137 In [27]: %autopx
138 %autopx disabled
138 %autopx disabled
139 """
139 """
140 if self.autopx:
140 if self.autopx:
141 self._disable_autopx()
141 self._disable_autopx()
142 else:
142 else:
143 self._enable_autopx()
143 self._enable_autopx()
144
144
145 def _enable_autopx(self):
145 def _enable_autopx(self):
146 """Enable %autopx mode by saving the original run_cell and installing
146 """Enable %autopx mode by saving the original run_cell and installing
147 pxrun_cell.
147 pxrun_cell.
148 """
148 """
149 if self.active_view is None:
149 if self.active_view is None:
150 print NO_ACTIVE_VIEW
150 print NO_ACTIVE_VIEW
151 return
151 return
152
152
153 # override run_cell and run_code
153 # override run_cell and run_code
154 self._original_run_cell = self.shell.run_cell
154 self._original_run_cell = self.shell.run_cell
155 self.shell.run_cell = self.pxrun_cell
155 self.shell.run_cell = self.pxrun_cell
156 self._original_run_code = self.shell.run_code
156 self._original_run_code = self.shell.run_code
157 self.shell.run_code = self.pxrun_code
157 self.shell.run_code = self.pxrun_code
158
158
159 self.autopx = True
159 self.autopx = True
160 print "%autopx enabled"
160 print "%autopx enabled"
161
161
162 def _disable_autopx(self):
162 def _disable_autopx(self):
163 """Disable %autopx by restoring the original InteractiveShell.run_cell.
163 """Disable %autopx by restoring the original InteractiveShell.run_cell.
164 """
164 """
165 if self.autopx:
165 if self.autopx:
166 self.shell.run_cell = self._original_run_cell
166 self.shell.run_cell = self._original_run_cell
167 self.shell.run_code = self._original_run_code
167 self.shell.run_code = self._original_run_code
168 self.autopx = False
168 self.autopx = False
169 print "%autopx disabled"
169 print "%autopx disabled"
170
170
171 def _maybe_display_output(self, result):
171 def _maybe_display_output(self, result):
172 """Maybe display the output of a parallel result.
172 """Maybe display the output of a parallel result.
173
173
174 If self.active_view.block is True, wait for the result
174 If self.active_view.block is True, wait for the result
175 and display the result. Otherwise, this is a noop.
175 and display the result. Otherwise, this is a noop.
176 """
176 """
177 targets = self.active_view.targets
177 targets = self.active_view.targets
178 if isinstance(targets, int):
178 if isinstance(targets, int):
179 targets = [targets]
179 targets = [targets]
180 if targets == 'all':
180 if targets == 'all':
181 targets = self.active_view.client.ids
181 targets = self.active_view.client.ids
182 stdout = [s.rstrip() for s in result.stdout]
182 stdout = [s.rstrip() for s in result.stdout]
183 if any(stdout):
183 if any(stdout):
184 for i,eid in enumerate(targets):
184 for i,eid in enumerate(targets):
185 print '[stdout:%i]'%eid, stdout[i]
185 print '[stdout:%i]'%eid, stdout[i]
186
186
187
187
188 def pxrun_cell(self, raw_cell, store_history=True):
188 def pxrun_cell(self, raw_cell, store_history=True):
189 """drop-in replacement for InteractiveShell.run_cell.
189 """drop-in replacement for InteractiveShell.run_cell.
190
190
191 This executes code remotely, instead of in the local namespace.
191 This executes code remotely, instead of in the local namespace.
192
192
193 See InteractiveShell.run_cell for details.
193 See InteractiveShell.run_cell for details.
194 """
194 """
195
195
196 if (not raw_cell) or raw_cell.isspace():
196 if (not raw_cell) or raw_cell.isspace():
197 return
197 return
198
198
199 ipself = self.shell
199 ipself = self.shell
200
200
201 with ipself.builtin_trap:
201 with ipself.builtin_trap:
202 cell = ipself.prefilter_manager.prefilter_lines(raw_cell)
202 cell = ipself.prefilter_manager.prefilter_lines(raw_cell)
203
203
204 # Store raw and processed history
204 # Store raw and processed history
205 if store_history:
205 if store_history:
206 ipself.history_manager.store_inputs(ipself.execution_count,
206 ipself.history_manager.store_inputs(ipself.execution_count,
207 cell, raw_cell)
207 cell, raw_cell)
208
208
209 # ipself.logger.log(cell, raw_cell)
209 # ipself.logger.log(cell, raw_cell)
210
210
211 cell_name = ipself.compile.cache(cell, ipself.execution_count)
211 cell_name = ipself.compile.cache(cell, ipself.execution_count)
212
212
213 try:
213 try:
214 code_ast = ast.parse(cell, filename=cell_name)
214 code_ast = ast.parse(cell, filename=cell_name)
215 except (OverflowError, SyntaxError, ValueError, TypeError, MemoryError):
215 except (OverflowError, SyntaxError, ValueError, TypeError, MemoryError):
216 # Case 1
216 # Case 1
217 ipself.showsyntaxerror()
217 ipself.showsyntaxerror()
218 ipself.execution_count += 1
218 ipself.execution_count += 1
219 return None
219 return None
220 except NameError:
220 except NameError:
221 # ignore name errors, because we don't know the remote keys
221 # ignore name errors, because we don't know the remote keys
222 pass
222 pass
223
223
224 if store_history:
224 if store_history:
225 # Write output to the database. Does nothing unless
225 # Write output to the database. Does nothing unless
226 # history output logging is enabled.
226 # history output logging is enabled.
227 ipself.history_manager.store_output(ipself.execution_count)
227 ipself.history_manager.store_output(ipself.execution_count)
228 # Each cell is a *single* input, regardless of how many lines it has
228 # Each cell is a *single* input, regardless of how many lines it has
229 ipself.execution_count += 1
229 ipself.execution_count += 1
230
230
231 if re.search(r'get_ipython\(\)\.magic\(u?"%?autopx', cell):
231 if re.search(r'get_ipython\(\)\.magic\(u?"%?autopx', cell):
232 self._disable_autopx()
232 self._disable_autopx()
233 return False
233 return False
234 else:
234 else:
235 try:
235 try:
236 result = self.active_view.execute(cell, block=False)
236 result = self.active_view.execute(cell, block=False)
237 except:
237 except:
238 ipself.showtraceback()
238 ipself.showtraceback()
239 return True
239 return True
240 else:
240 else:
241 if self.active_view.block:
241 if self.active_view.block:
242 try:
242 try:
243 result.get()
243 result.get()
244 except:
244 except:
245 self.shell.showtraceback()
245 self.shell.showtraceback()
246 return True
246 return True
247 else:
247 else:
248 self._maybe_display_output(result)
248 self._maybe_display_output(result)
249 return False
249 return False
250
250
251 def pxrun_code(self, code_obj):
251 def pxrun_code(self, code_obj):
252 """drop-in replacement for InteractiveShell.run_code.
252 """drop-in replacement for InteractiveShell.run_code.
253
253
254 This executes code remotely, instead of in the local namespace.
254 This executes code remotely, instead of in the local namespace.
255
255
256 See InteractiveShell.run_code for details.
256 See InteractiveShell.run_code for details.
257 """
257 """
258 ipself = self.shell
258 ipself = self.shell
259 # check code object for the autopx magic
259 # check code object for the autopx magic
260 if 'get_ipython' in code_obj.co_names and 'magic' in code_obj.co_names and \
260 if 'get_ipython' in code_obj.co_names and 'magic' in code_obj.co_names and \
261 any( [ isinstance(c, basestring) and 'autopx' in c for c in code_obj.co_consts ]):
261 any( [ isinstance(c, basestring) and 'autopx' in c for c in code_obj.co_consts ]):
262 self._disable_autopx()
262 self._disable_autopx()
263 return False
263 return False
264 else:
264 else:
265 try:
265 try:
266 result = self.active_view.execute(code_obj, block=False)
266 result = self.active_view.execute(code_obj, block=False)
267 except:
267 except:
268 ipself.showtraceback()
268 ipself.showtraceback()
269 return True
269 return True
270 else:
270 else:
271 if self.active_view.block:
271 if self.active_view.block:
272 try:
272 try:
273 result.get()
273 result.get()
274 except:
274 except:
275 self.shell.showtraceback()
275 self.shell.showtraceback()
276 return True
276 return True
277 else:
277 else:
278 self._maybe_display_output(result)
278 self._maybe_display_output(result)
279 return False
279 return False
280
280
281
281
282
282
283
283
284 _loaded = False
284 _loaded = False
285
285
286
286
287 def load_ipython_extension(ip):
287 def load_ipython_extension(ip):
288 """Load the extension in IPython."""
288 """Load the extension in IPython."""
289 global _loaded
289 global _loaded
290 if not _loaded:
290 if not _loaded:
291 plugin = ParalleMagic(shell=ip, config=ip.config)
291 plugin = ParalleMagic(shell=ip, config=ip.config)
292 ip.plugin_manager.register_plugin('parallelmagic', plugin)
292 ip.plugin_manager.register_plugin('parallelmagic', plugin)
293 _loaded = True
293 _loaded = True
294
294
@@ -1,558 +1,558 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Subclass of InteractiveShell for terminal based frontends."""
2 """Subclass of InteractiveShell for terminal based frontends."""
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 # Copyright (C) 2008-2010 The IPython Development Team
7 # Copyright (C) 2008-2010 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 import __builtin__
17 import __builtin__
18 import bdb
18 import bdb
19 from contextlib import nested
19 from contextlib import nested
20 import os
20 import os
21 import re
21 import re
22 import sys
22 import sys
23
23
24 from IPython.core.error import TryNext
24 from IPython.core.error import TryNext
25 from IPython.core.usage import interactive_usage, default_banner
25 from IPython.core.usage import interactive_usage, default_banner
26 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
26 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
27 from IPython.lib.inputhook import enable_gui
27 from IPython.lib.inputhook import enable_gui
28 from IPython.lib.pylabtools import pylab_activate
28 from IPython.lib.pylabtools import pylab_activate
29 from IPython.testing import decorators as testdec
29 from IPython.testing.skipdoctest import skip_doctest
30 from IPython.utils.terminal import toggle_set_term_title, set_term_title
30 from IPython.utils.terminal import toggle_set_term_title, set_term_title
31 from IPython.utils.process import abbrev_cwd
31 from IPython.utils.process import abbrev_cwd
32 from IPython.utils.warn import warn
32 from IPython.utils.warn import warn
33 from IPython.utils.text import num_ini_spaces
33 from IPython.utils.text import num_ini_spaces
34 from IPython.utils.traitlets import Int, Str, CBool, Unicode
34 from IPython.utils.traitlets import Int, Str, CBool, Unicode
35
35
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37 # Utilities
37 # Utilities
38 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
39
39
40 def get_default_editor():
40 def get_default_editor():
41 try:
41 try:
42 ed = os.environ['EDITOR']
42 ed = os.environ['EDITOR']
43 except KeyError:
43 except KeyError:
44 if os.name == 'posix':
44 if os.name == 'posix':
45 ed = 'vi' # the only one guaranteed to be there!
45 ed = 'vi' # the only one guaranteed to be there!
46 else:
46 else:
47 ed = 'notepad' # same in Windows!
47 ed = 'notepad' # same in Windows!
48 return ed
48 return ed
49
49
50
50
51 # store the builtin raw_input globally, and use this always, in case user code
51 # store the builtin raw_input globally, and use this always, in case user code
52 # overwrites it (like wx.py.PyShell does)
52 # overwrites it (like wx.py.PyShell does)
53 raw_input_original = raw_input
53 raw_input_original = raw_input
54
54
55 #-----------------------------------------------------------------------------
55 #-----------------------------------------------------------------------------
56 # Main class
56 # Main class
57 #-----------------------------------------------------------------------------
57 #-----------------------------------------------------------------------------
58
58
59 class TerminalInteractiveShell(InteractiveShell):
59 class TerminalInteractiveShell(InteractiveShell):
60
60
61 autoedit_syntax = CBool(False, config=True)
61 autoedit_syntax = CBool(False, config=True)
62 banner = Unicode('')
62 banner = Unicode('')
63 banner1 = Unicode(default_banner, config=True)
63 banner1 = Unicode(default_banner, config=True)
64 banner2 = Unicode('', config=True)
64 banner2 = Unicode('', config=True)
65 confirm_exit = CBool(True, config=True)
65 confirm_exit = CBool(True, config=True)
66 # This display_banner only controls whether or not self.show_banner()
66 # This display_banner only controls whether or not self.show_banner()
67 # is called when mainloop/interact are called. The default is False
67 # is called when mainloop/interact are called. The default is False
68 # because for the terminal based application, the banner behavior
68 # because for the terminal based application, the banner behavior
69 # is controlled by Global.display_banner, which IPythonApp looks at
69 # is controlled by Global.display_banner, which IPythonApp looks at
70 # to determine if *it* should call show_banner() by hand or not.
70 # to determine if *it* should call show_banner() by hand or not.
71 display_banner = CBool(False) # This isn't configurable!
71 display_banner = CBool(False) # This isn't configurable!
72 embedded = CBool(False)
72 embedded = CBool(False)
73 embedded_active = CBool(False)
73 embedded_active = CBool(False)
74 editor = Unicode(get_default_editor(), config=True)
74 editor = Unicode(get_default_editor(), config=True)
75 pager = Unicode('less', config=True)
75 pager = Unicode('less', config=True)
76
76
77 screen_length = Int(0, config=True)
77 screen_length = Int(0, config=True)
78 term_title = CBool(False, config=True)
78 term_title = CBool(False, config=True)
79
79
80 def __init__(self, config=None, ipython_dir=None, user_ns=None,
80 def __init__(self, config=None, ipython_dir=None, user_ns=None,
81 user_global_ns=None, custom_exceptions=((),None),
81 user_global_ns=None, custom_exceptions=((),None),
82 usage=None, banner1=None, banner2=None,
82 usage=None, banner1=None, banner2=None,
83 display_banner=None):
83 display_banner=None):
84
84
85 super(TerminalInteractiveShell, self).__init__(
85 super(TerminalInteractiveShell, self).__init__(
86 config=config, ipython_dir=ipython_dir, user_ns=user_ns,
86 config=config, ipython_dir=ipython_dir, user_ns=user_ns,
87 user_global_ns=user_global_ns, custom_exceptions=custom_exceptions
87 user_global_ns=user_global_ns, custom_exceptions=custom_exceptions
88 )
88 )
89 self.init_term_title()
89 self.init_term_title()
90 self.init_usage(usage)
90 self.init_usage(usage)
91 self.init_banner(banner1, banner2, display_banner)
91 self.init_banner(banner1, banner2, display_banner)
92
92
93 #-------------------------------------------------------------------------
93 #-------------------------------------------------------------------------
94 # Things related to the terminal
94 # Things related to the terminal
95 #-------------------------------------------------------------------------
95 #-------------------------------------------------------------------------
96
96
97 @property
97 @property
98 def usable_screen_length(self):
98 def usable_screen_length(self):
99 if self.screen_length == 0:
99 if self.screen_length == 0:
100 return 0
100 return 0
101 else:
101 else:
102 num_lines_bot = self.separate_in.count('\n')+1
102 num_lines_bot = self.separate_in.count('\n')+1
103 return self.screen_length - num_lines_bot
103 return self.screen_length - num_lines_bot
104
104
105 def init_term_title(self):
105 def init_term_title(self):
106 # Enable or disable the terminal title.
106 # Enable or disable the terminal title.
107 if self.term_title:
107 if self.term_title:
108 toggle_set_term_title(True)
108 toggle_set_term_title(True)
109 set_term_title('IPython: ' + abbrev_cwd())
109 set_term_title('IPython: ' + abbrev_cwd())
110 else:
110 else:
111 toggle_set_term_title(False)
111 toggle_set_term_title(False)
112
112
113 #-------------------------------------------------------------------------
113 #-------------------------------------------------------------------------
114 # Things related to aliases
114 # Things related to aliases
115 #-------------------------------------------------------------------------
115 #-------------------------------------------------------------------------
116
116
117 def init_alias(self):
117 def init_alias(self):
118 # The parent class defines aliases that can be safely used with any
118 # The parent class defines aliases that can be safely used with any
119 # frontend.
119 # frontend.
120 super(TerminalInteractiveShell, self).init_alias()
120 super(TerminalInteractiveShell, self).init_alias()
121
121
122 # Now define aliases that only make sense on the terminal, because they
122 # Now define aliases that only make sense on the terminal, because they
123 # need direct access to the console in a way that we can't emulate in
123 # need direct access to the console in a way that we can't emulate in
124 # GUI or web frontend
124 # GUI or web frontend
125 if os.name == 'posix':
125 if os.name == 'posix':
126 aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
126 aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
127 ('man', 'man')]
127 ('man', 'man')]
128 elif os.name == 'nt':
128 elif os.name == 'nt':
129 aliases = [('cls', 'cls')]
129 aliases = [('cls', 'cls')]
130
130
131
131
132 for name, cmd in aliases:
132 for name, cmd in aliases:
133 self.alias_manager.define_alias(name, cmd)
133 self.alias_manager.define_alias(name, cmd)
134
134
135 #-------------------------------------------------------------------------
135 #-------------------------------------------------------------------------
136 # Things related to the banner and usage
136 # Things related to the banner and usage
137 #-------------------------------------------------------------------------
137 #-------------------------------------------------------------------------
138
138
139 def _banner1_changed(self):
139 def _banner1_changed(self):
140 self.compute_banner()
140 self.compute_banner()
141
141
142 def _banner2_changed(self):
142 def _banner2_changed(self):
143 self.compute_banner()
143 self.compute_banner()
144
144
145 def _term_title_changed(self, name, new_value):
145 def _term_title_changed(self, name, new_value):
146 self.init_term_title()
146 self.init_term_title()
147
147
148 def init_banner(self, banner1, banner2, display_banner):
148 def init_banner(self, banner1, banner2, display_banner):
149 if banner1 is not None:
149 if banner1 is not None:
150 self.banner1 = banner1
150 self.banner1 = banner1
151 if banner2 is not None:
151 if banner2 is not None:
152 self.banner2 = banner2
152 self.banner2 = banner2
153 if display_banner is not None:
153 if display_banner is not None:
154 self.display_banner = display_banner
154 self.display_banner = display_banner
155 self.compute_banner()
155 self.compute_banner()
156
156
157 def show_banner(self, banner=None):
157 def show_banner(self, banner=None):
158 if banner is None:
158 if banner is None:
159 banner = self.banner
159 banner = self.banner
160 self.write(banner)
160 self.write(banner)
161
161
162 def compute_banner(self):
162 def compute_banner(self):
163 self.banner = self.banner1
163 self.banner = self.banner1
164 if self.profile:
164 if self.profile:
165 self.banner += '\nIPython profile: %s\n' % self.profile
165 self.banner += '\nIPython profile: %s\n' % self.profile
166 if self.banner2:
166 if self.banner2:
167 self.banner += '\n' + self.banner2
167 self.banner += '\n' + self.banner2
168
168
169 def init_usage(self, usage=None):
169 def init_usage(self, usage=None):
170 if usage is None:
170 if usage is None:
171 self.usage = interactive_usage
171 self.usage = interactive_usage
172 else:
172 else:
173 self.usage = usage
173 self.usage = usage
174
174
175 #-------------------------------------------------------------------------
175 #-------------------------------------------------------------------------
176 # Mainloop and code execution logic
176 # Mainloop and code execution logic
177 #-------------------------------------------------------------------------
177 #-------------------------------------------------------------------------
178
178
179 def mainloop(self, display_banner=None):
179 def mainloop(self, display_banner=None):
180 """Start the mainloop.
180 """Start the mainloop.
181
181
182 If an optional banner argument is given, it will override the
182 If an optional banner argument is given, it will override the
183 internally created default banner.
183 internally created default banner.
184 """
184 """
185
185
186 with nested(self.builtin_trap, self.display_trap):
186 with nested(self.builtin_trap, self.display_trap):
187
187
188 while 1:
188 while 1:
189 try:
189 try:
190 self.interact(display_banner=display_banner)
190 self.interact(display_banner=display_banner)
191 #self.interact_with_readline()
191 #self.interact_with_readline()
192 # XXX for testing of a readline-decoupled repl loop, call
192 # XXX for testing of a readline-decoupled repl loop, call
193 # interact_with_readline above
193 # interact_with_readline above
194 break
194 break
195 except KeyboardInterrupt:
195 except KeyboardInterrupt:
196 # this should not be necessary, but KeyboardInterrupt
196 # this should not be necessary, but KeyboardInterrupt
197 # handling seems rather unpredictable...
197 # handling seems rather unpredictable...
198 self.write("\nKeyboardInterrupt in interact()\n")
198 self.write("\nKeyboardInterrupt in interact()\n")
199
199
200 def interact(self, display_banner=None):
200 def interact(self, display_banner=None):
201 """Closely emulate the interactive Python console."""
201 """Closely emulate the interactive Python console."""
202
202
203 # batch run -> do not interact
203 # batch run -> do not interact
204 if self.exit_now:
204 if self.exit_now:
205 return
205 return
206
206
207 if display_banner is None:
207 if display_banner is None:
208 display_banner = self.display_banner
208 display_banner = self.display_banner
209 if display_banner:
209 if display_banner:
210 self.show_banner()
210 self.show_banner()
211
211
212 more = False
212 more = False
213
213
214 # Mark activity in the builtins
214 # Mark activity in the builtins
215 __builtin__.__dict__['__IPYTHON__active'] += 1
215 __builtin__.__dict__['__IPYTHON__active'] += 1
216
216
217 if self.has_readline:
217 if self.has_readline:
218 self.readline_startup_hook(self.pre_readline)
218 self.readline_startup_hook(self.pre_readline)
219 # exit_now is set by a call to %Exit or %Quit, through the
219 # exit_now is set by a call to %Exit or %Quit, through the
220 # ask_exit callback.
220 # ask_exit callback.
221
221
222 while not self.exit_now:
222 while not self.exit_now:
223 self.hooks.pre_prompt_hook()
223 self.hooks.pre_prompt_hook()
224 if more:
224 if more:
225 try:
225 try:
226 prompt = self.hooks.generate_prompt(True)
226 prompt = self.hooks.generate_prompt(True)
227 except:
227 except:
228 self.showtraceback()
228 self.showtraceback()
229 if self.autoindent:
229 if self.autoindent:
230 self.rl_do_indent = True
230 self.rl_do_indent = True
231
231
232 else:
232 else:
233 try:
233 try:
234 prompt = self.hooks.generate_prompt(False)
234 prompt = self.hooks.generate_prompt(False)
235 except:
235 except:
236 self.showtraceback()
236 self.showtraceback()
237 try:
237 try:
238 line = self.raw_input(prompt)
238 line = self.raw_input(prompt)
239 if self.exit_now:
239 if self.exit_now:
240 # quick exit on sys.std[in|out] close
240 # quick exit on sys.std[in|out] close
241 break
241 break
242 if self.autoindent:
242 if self.autoindent:
243 self.rl_do_indent = False
243 self.rl_do_indent = False
244
244
245 except KeyboardInterrupt:
245 except KeyboardInterrupt:
246 #double-guard against keyboardinterrupts during kbdint handling
246 #double-guard against keyboardinterrupts during kbdint handling
247 try:
247 try:
248 self.write('\nKeyboardInterrupt\n')
248 self.write('\nKeyboardInterrupt\n')
249 self.input_splitter.reset()
249 self.input_splitter.reset()
250 more = False
250 more = False
251 except KeyboardInterrupt:
251 except KeyboardInterrupt:
252 pass
252 pass
253 except EOFError:
253 except EOFError:
254 if self.autoindent:
254 if self.autoindent:
255 self.rl_do_indent = False
255 self.rl_do_indent = False
256 if self.has_readline:
256 if self.has_readline:
257 self.readline_startup_hook(None)
257 self.readline_startup_hook(None)
258 self.write('\n')
258 self.write('\n')
259 self.exit()
259 self.exit()
260 except bdb.BdbQuit:
260 except bdb.BdbQuit:
261 warn('The Python debugger has exited with a BdbQuit exception.\n'
261 warn('The Python debugger has exited with a BdbQuit exception.\n'
262 'Because of how pdb handles the stack, it is impossible\n'
262 'Because of how pdb handles the stack, it is impossible\n'
263 'for IPython to properly format this particular exception.\n'
263 'for IPython to properly format this particular exception.\n'
264 'IPython will resume normal operation.')
264 'IPython will resume normal operation.')
265 except:
265 except:
266 # exceptions here are VERY RARE, but they can be triggered
266 # exceptions here are VERY RARE, but they can be triggered
267 # asynchronously by signal handlers, for example.
267 # asynchronously by signal handlers, for example.
268 self.showtraceback()
268 self.showtraceback()
269 else:
269 else:
270 self.input_splitter.push(line)
270 self.input_splitter.push(line)
271 more = self.input_splitter.push_accepts_more()
271 more = self.input_splitter.push_accepts_more()
272 if (self.SyntaxTB.last_syntax_error and
272 if (self.SyntaxTB.last_syntax_error and
273 self.autoedit_syntax):
273 self.autoedit_syntax):
274 self.edit_syntax_error()
274 self.edit_syntax_error()
275 if not more:
275 if not more:
276 source_raw = self.input_splitter.source_raw_reset()[1]
276 source_raw = self.input_splitter.source_raw_reset()[1]
277 self.run_cell(source_raw)
277 self.run_cell(source_raw)
278
278
279 # We are off again...
279 # We are off again...
280 __builtin__.__dict__['__IPYTHON__active'] -= 1
280 __builtin__.__dict__['__IPYTHON__active'] -= 1
281
281
282 # Turn off the exit flag, so the mainloop can be restarted if desired
282 # Turn off the exit flag, so the mainloop can be restarted if desired
283 self.exit_now = False
283 self.exit_now = False
284
284
285 def raw_input(self, prompt=''):
285 def raw_input(self, prompt=''):
286 """Write a prompt and read a line.
286 """Write a prompt and read a line.
287
287
288 The returned line does not include the trailing newline.
288 The returned line does not include the trailing newline.
289 When the user enters the EOF key sequence, EOFError is raised.
289 When the user enters the EOF key sequence, EOFError is raised.
290
290
291 Optional inputs:
291 Optional inputs:
292
292
293 - prompt(''): a string to be printed to prompt the user.
293 - prompt(''): a string to be printed to prompt the user.
294
294
295 - continue_prompt(False): whether this line is the first one or a
295 - continue_prompt(False): whether this line is the first one or a
296 continuation in a sequence of inputs.
296 continuation in a sequence of inputs.
297 """
297 """
298 # Code run by the user may have modified the readline completer state.
298 # Code run by the user may have modified the readline completer state.
299 # We must ensure that our completer is back in place.
299 # We must ensure that our completer is back in place.
300
300
301 if self.has_readline:
301 if self.has_readline:
302 self.set_readline_completer()
302 self.set_readline_completer()
303
303
304 try:
304 try:
305 line = raw_input_original(prompt).decode(self.stdin_encoding)
305 line = raw_input_original(prompt).decode(self.stdin_encoding)
306 except ValueError:
306 except ValueError:
307 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
307 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
308 " or sys.stdout.close()!\nExiting IPython!")
308 " or sys.stdout.close()!\nExiting IPython!")
309 self.ask_exit()
309 self.ask_exit()
310 return ""
310 return ""
311
311
312 # Try to be reasonably smart about not re-indenting pasted input more
312 # Try to be reasonably smart about not re-indenting pasted input more
313 # than necessary. We do this by trimming out the auto-indent initial
313 # than necessary. We do this by trimming out the auto-indent initial
314 # spaces, if the user's actual input started itself with whitespace.
314 # spaces, if the user's actual input started itself with whitespace.
315 if self.autoindent:
315 if self.autoindent:
316 if num_ini_spaces(line) > self.indent_current_nsp:
316 if num_ini_spaces(line) > self.indent_current_nsp:
317 line = line[self.indent_current_nsp:]
317 line = line[self.indent_current_nsp:]
318 self.indent_current_nsp = 0
318 self.indent_current_nsp = 0
319
319
320 return line
320 return line
321
321
322 #-------------------------------------------------------------------------
322 #-------------------------------------------------------------------------
323 # Methods to support auto-editing of SyntaxErrors.
323 # Methods to support auto-editing of SyntaxErrors.
324 #-------------------------------------------------------------------------
324 #-------------------------------------------------------------------------
325
325
326 def edit_syntax_error(self):
326 def edit_syntax_error(self):
327 """The bottom half of the syntax error handler called in the main loop.
327 """The bottom half of the syntax error handler called in the main loop.
328
328
329 Loop until syntax error is fixed or user cancels.
329 Loop until syntax error is fixed or user cancels.
330 """
330 """
331
331
332 while self.SyntaxTB.last_syntax_error:
332 while self.SyntaxTB.last_syntax_error:
333 # copy and clear last_syntax_error
333 # copy and clear last_syntax_error
334 err = self.SyntaxTB.clear_err_state()
334 err = self.SyntaxTB.clear_err_state()
335 if not self._should_recompile(err):
335 if not self._should_recompile(err):
336 return
336 return
337 try:
337 try:
338 # may set last_syntax_error again if a SyntaxError is raised
338 # may set last_syntax_error again if a SyntaxError is raised
339 self.safe_execfile(err.filename,self.user_ns)
339 self.safe_execfile(err.filename,self.user_ns)
340 except:
340 except:
341 self.showtraceback()
341 self.showtraceback()
342 else:
342 else:
343 try:
343 try:
344 f = file(err.filename)
344 f = file(err.filename)
345 try:
345 try:
346 # This should be inside a display_trap block and I
346 # This should be inside a display_trap block and I
347 # think it is.
347 # think it is.
348 sys.displayhook(f.read())
348 sys.displayhook(f.read())
349 finally:
349 finally:
350 f.close()
350 f.close()
351 except:
351 except:
352 self.showtraceback()
352 self.showtraceback()
353
353
354 def _should_recompile(self,e):
354 def _should_recompile(self,e):
355 """Utility routine for edit_syntax_error"""
355 """Utility routine for edit_syntax_error"""
356
356
357 if e.filename in ('<ipython console>','<input>','<string>',
357 if e.filename in ('<ipython console>','<input>','<string>',
358 '<console>','<BackgroundJob compilation>',
358 '<console>','<BackgroundJob compilation>',
359 None):
359 None):
360
360
361 return False
361 return False
362 try:
362 try:
363 if (self.autoedit_syntax and
363 if (self.autoedit_syntax and
364 not self.ask_yes_no('Return to editor to correct syntax error? '
364 not self.ask_yes_no('Return to editor to correct syntax error? '
365 '[Y/n] ','y')):
365 '[Y/n] ','y')):
366 return False
366 return False
367 except EOFError:
367 except EOFError:
368 return False
368 return False
369
369
370 def int0(x):
370 def int0(x):
371 try:
371 try:
372 return int(x)
372 return int(x)
373 except TypeError:
373 except TypeError:
374 return 0
374 return 0
375 # always pass integer line and offset values to editor hook
375 # always pass integer line and offset values to editor hook
376 try:
376 try:
377 self.hooks.fix_error_editor(e.filename,
377 self.hooks.fix_error_editor(e.filename,
378 int0(e.lineno),int0(e.offset),e.msg)
378 int0(e.lineno),int0(e.offset),e.msg)
379 except TryNext:
379 except TryNext:
380 warn('Could not open editor')
380 warn('Could not open editor')
381 return False
381 return False
382 return True
382 return True
383
383
384 #-------------------------------------------------------------------------
384 #-------------------------------------------------------------------------
385 # Things related to GUI support and pylab
385 # Things related to GUI support and pylab
386 #-------------------------------------------------------------------------
386 #-------------------------------------------------------------------------
387
387
388 def enable_pylab(self, gui=None):
388 def enable_pylab(self, gui=None):
389 """Activate pylab support at runtime.
389 """Activate pylab support at runtime.
390
390
391 This turns on support for matplotlib, preloads into the interactive
391 This turns on support for matplotlib, preloads into the interactive
392 namespace all of numpy and pylab, and configures IPython to correcdtly
392 namespace all of numpy and pylab, and configures IPython to correcdtly
393 interact with the GUI event loop. The GUI backend to be used can be
393 interact with the GUI event loop. The GUI backend to be used can be
394 optionally selected with the optional :param:`gui` argument.
394 optionally selected with the optional :param:`gui` argument.
395
395
396 Parameters
396 Parameters
397 ----------
397 ----------
398 gui : optional, string
398 gui : optional, string
399
399
400 If given, dictates the choice of matplotlib GUI backend to use
400 If given, dictates the choice of matplotlib GUI backend to use
401 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
401 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
402 'gtk'), otherwise we use the default chosen by matplotlib (as
402 'gtk'), otherwise we use the default chosen by matplotlib (as
403 dictated by the matplotlib build-time options plus the user's
403 dictated by the matplotlib build-time options plus the user's
404 matplotlibrc configuration file).
404 matplotlibrc configuration file).
405 """
405 """
406 # We want to prevent the loading of pylab to pollute the user's
406 # We want to prevent the loading of pylab to pollute the user's
407 # namespace as shown by the %who* magics, so we execute the activation
407 # namespace as shown by the %who* magics, so we execute the activation
408 # code in an empty namespace, and we update *both* user_ns and
408 # code in an empty namespace, and we update *both* user_ns and
409 # user_ns_hidden with this information.
409 # user_ns_hidden with this information.
410 ns = {}
410 ns = {}
411 gui = pylab_activate(ns, gui)
411 gui = pylab_activate(ns, gui)
412 self.user_ns.update(ns)
412 self.user_ns.update(ns)
413 self.user_ns_hidden.update(ns)
413 self.user_ns_hidden.update(ns)
414 # Now we must activate the gui pylab wants to use, and fix %run to take
414 # Now we must activate the gui pylab wants to use, and fix %run to take
415 # plot updates into account
415 # plot updates into account
416 enable_gui(gui)
416 enable_gui(gui)
417 self.magic_run = self._pylab_magic_run
417 self.magic_run = self._pylab_magic_run
418
418
419 #-------------------------------------------------------------------------
419 #-------------------------------------------------------------------------
420 # Things related to exiting
420 # Things related to exiting
421 #-------------------------------------------------------------------------
421 #-------------------------------------------------------------------------
422
422
423 def ask_exit(self):
423 def ask_exit(self):
424 """ Ask the shell to exit. Can be overiden and used as a callback. """
424 """ Ask the shell to exit. Can be overiden and used as a callback. """
425 self.exit_now = True
425 self.exit_now = True
426
426
427 def exit(self):
427 def exit(self):
428 """Handle interactive exit.
428 """Handle interactive exit.
429
429
430 This method calls the ask_exit callback."""
430 This method calls the ask_exit callback."""
431 if self.confirm_exit:
431 if self.confirm_exit:
432 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
432 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
433 self.ask_exit()
433 self.ask_exit()
434 else:
434 else:
435 self.ask_exit()
435 self.ask_exit()
436
436
437 #------------------------------------------------------------------------
437 #------------------------------------------------------------------------
438 # Magic overrides
438 # Magic overrides
439 #------------------------------------------------------------------------
439 #------------------------------------------------------------------------
440 # Once the base class stops inheriting from magic, this code needs to be
440 # Once the base class stops inheriting from magic, this code needs to be
441 # moved into a separate machinery as well. For now, at least isolate here
441 # moved into a separate machinery as well. For now, at least isolate here
442 # the magics which this class needs to implement differently from the base
442 # the magics which this class needs to implement differently from the base
443 # class, or that are unique to it.
443 # class, or that are unique to it.
444
444
445 def magic_autoindent(self, parameter_s = ''):
445 def magic_autoindent(self, parameter_s = ''):
446 """Toggle autoindent on/off (if available)."""
446 """Toggle autoindent on/off (if available)."""
447
447
448 self.shell.set_autoindent()
448 self.shell.set_autoindent()
449 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
449 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
450
450
451 @testdec.skip_doctest
451 @skip_doctest
452 def magic_cpaste(self, parameter_s=''):
452 def magic_cpaste(self, parameter_s=''):
453 """Paste & execute a pre-formatted code block from clipboard.
453 """Paste & execute a pre-formatted code block from clipboard.
454
454
455 You must terminate the block with '--' (two minus-signs) alone on the
455 You must terminate the block with '--' (two minus-signs) alone on the
456 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
456 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
457 is the new sentinel for this operation)
457 is the new sentinel for this operation)
458
458
459 The block is dedented prior to execution to enable execution of method
459 The block is dedented prior to execution to enable execution of method
460 definitions. '>' and '+' characters at the beginning of a line are
460 definitions. '>' and '+' characters at the beginning of a line are
461 ignored, to allow pasting directly from e-mails, diff files and
461 ignored, to allow pasting directly from e-mails, diff files and
462 doctests (the '...' continuation prompt is also stripped). The
462 doctests (the '...' continuation prompt is also stripped). The
463 executed block is also assigned to variable named 'pasted_block' for
463 executed block is also assigned to variable named 'pasted_block' for
464 later editing with '%edit pasted_block'.
464 later editing with '%edit pasted_block'.
465
465
466 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
466 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
467 This assigns the pasted block to variable 'foo' as string, without
467 This assigns the pasted block to variable 'foo' as string, without
468 dedenting or executing it (preceding >>> and + is still stripped)
468 dedenting or executing it (preceding >>> and + is still stripped)
469
469
470 '%cpaste -r' re-executes the block previously entered by cpaste.
470 '%cpaste -r' re-executes the block previously entered by cpaste.
471
471
472 Do not be alarmed by garbled output on Windows (it's a readline bug).
472 Do not be alarmed by garbled output on Windows (it's a readline bug).
473 Just press enter and type -- (and press enter again) and the block
473 Just press enter and type -- (and press enter again) and the block
474 will be what was just pasted.
474 will be what was just pasted.
475
475
476 IPython statements (magics, shell escapes) are not supported (yet).
476 IPython statements (magics, shell escapes) are not supported (yet).
477
477
478 See also
478 See also
479 --------
479 --------
480 paste: automatically pull code from clipboard.
480 paste: automatically pull code from clipboard.
481
481
482 Examples
482 Examples
483 --------
483 --------
484 ::
484 ::
485
485
486 In [8]: %cpaste
486 In [8]: %cpaste
487 Pasting code; enter '--' alone on the line to stop.
487 Pasting code; enter '--' alone on the line to stop.
488 :>>> a = ["world!", "Hello"]
488 :>>> a = ["world!", "Hello"]
489 :>>> print " ".join(sorted(a))
489 :>>> print " ".join(sorted(a))
490 :--
490 :--
491 Hello world!
491 Hello world!
492 """
492 """
493
493
494 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
494 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
495 par = args.strip()
495 par = args.strip()
496 if opts.has_key('r'):
496 if opts.has_key('r'):
497 self._rerun_pasted()
497 self._rerun_pasted()
498 return
498 return
499
499
500 sentinel = opts.get('s','--')
500 sentinel = opts.get('s','--')
501
501
502 block = self._strip_pasted_lines_for_code(
502 block = self._strip_pasted_lines_for_code(
503 self._get_pasted_lines(sentinel))
503 self._get_pasted_lines(sentinel))
504
504
505 self._execute_block(block, par)
505 self._execute_block(block, par)
506
506
507 def magic_paste(self, parameter_s=''):
507 def magic_paste(self, parameter_s=''):
508 """Paste & execute a pre-formatted code block from clipboard.
508 """Paste & execute a pre-formatted code block from clipboard.
509
509
510 The text is pulled directly from the clipboard without user
510 The text is pulled directly from the clipboard without user
511 intervention and printed back on the screen before execution (unless
511 intervention and printed back on the screen before execution (unless
512 the -q flag is given to force quiet mode).
512 the -q flag is given to force quiet mode).
513
513
514 The block is dedented prior to execution to enable execution of method
514 The block is dedented prior to execution to enable execution of method
515 definitions. '>' and '+' characters at the beginning of a line are
515 definitions. '>' and '+' characters at the beginning of a line are
516 ignored, to allow pasting directly from e-mails, diff files and
516 ignored, to allow pasting directly from e-mails, diff files and
517 doctests (the '...' continuation prompt is also stripped). The
517 doctests (the '...' continuation prompt is also stripped). The
518 executed block is also assigned to variable named 'pasted_block' for
518 executed block is also assigned to variable named 'pasted_block' for
519 later editing with '%edit pasted_block'.
519 later editing with '%edit pasted_block'.
520
520
521 You can also pass a variable name as an argument, e.g. '%paste foo'.
521 You can also pass a variable name as an argument, e.g. '%paste foo'.
522 This assigns the pasted block to variable 'foo' as string, without
522 This assigns the pasted block to variable 'foo' as string, without
523 dedenting or executing it (preceding >>> and + is still stripped)
523 dedenting or executing it (preceding >>> and + is still stripped)
524
524
525 Options
525 Options
526 -------
526 -------
527
527
528 -r: re-executes the block previously entered by cpaste.
528 -r: re-executes the block previously entered by cpaste.
529
529
530 -q: quiet mode: do not echo the pasted text back to the terminal.
530 -q: quiet mode: do not echo the pasted text back to the terminal.
531
531
532 IPython statements (magics, shell escapes) are not supported (yet).
532 IPython statements (magics, shell escapes) are not supported (yet).
533
533
534 See also
534 See also
535 --------
535 --------
536 cpaste: manually paste code into terminal until you mark its end.
536 cpaste: manually paste code into terminal until you mark its end.
537 """
537 """
538 opts,args = self.parse_options(parameter_s,'rq',mode='string')
538 opts,args = self.parse_options(parameter_s,'rq',mode='string')
539 par = args.strip()
539 par = args.strip()
540 if opts.has_key('r'):
540 if opts.has_key('r'):
541 self._rerun_pasted()
541 self._rerun_pasted()
542 return
542 return
543
543
544 text = self.shell.hooks.clipboard_get()
544 text = self.shell.hooks.clipboard_get()
545 block = self._strip_pasted_lines_for_code(text.splitlines())
545 block = self._strip_pasted_lines_for_code(text.splitlines())
546
546
547 # By default, echo back to terminal unless quiet mode is requested
547 # By default, echo back to terminal unless quiet mode is requested
548 if not opts.has_key('q'):
548 if not opts.has_key('q'):
549 write = self.shell.write
549 write = self.shell.write
550 write(self.shell.pycolorize(block))
550 write(self.shell.pycolorize(block))
551 if not block.endswith('\n'):
551 if not block.endswith('\n'):
552 write('\n')
552 write('\n')
553 write("## -- End pasted text --\n")
553 write("## -- End pasted text --\n")
554
554
555 self._execute_block(block, par)
555 self._execute_block(block, par)
556
556
557
557
558 InteractiveShellABC.register(TerminalInteractiveShell)
558 InteractiveShellABC.register(TerminalInteractiveShell)
@@ -1,200 +1,200 b''
1 """Remote Functions and decorators for Views."""
1 """Remote Functions and decorators for Views."""
2 #-----------------------------------------------------------------------------
2 #-----------------------------------------------------------------------------
3 # Copyright (C) 2010 The IPython Development Team
3 # Copyright (C) 2010 The IPython Development Team
4 #
4 #
5 # Distributed under the terms of the BSD License. The full license is in
5 # Distributed under the terms of the BSD License. The full license is in
6 # the file COPYING, distributed as part of this software.
6 # the file COPYING, distributed as part of this software.
7 #-----------------------------------------------------------------------------
7 #-----------------------------------------------------------------------------
8
8
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10 # Imports
10 # Imports
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 import warnings
13 import warnings
14
14
15 from IPython.testing import decorators as testdec
15 from IPython.testing.skipdoctest import skip_doctest
16
16
17 from . import map as Map
17 from . import map as Map
18 from .asyncresult import AsyncMapResult
18 from .asyncresult import AsyncMapResult
19
19
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21 # Decorators
21 # Decorators
22 #-----------------------------------------------------------------------------
22 #-----------------------------------------------------------------------------
23
23
24 @testdec.skip_doctest
24 @skip_doctest
25 def remote(view, block=None, **flags):
25 def remote(view, block=None, **flags):
26 """Turn a function into a remote function.
26 """Turn a function into a remote function.
27
27
28 This method can be used for map:
28 This method can be used for map:
29
29
30 In [1]: @remote(view,block=True)
30 In [1]: @remote(view,block=True)
31 ...: def func(a):
31 ...: def func(a):
32 ...: pass
32 ...: pass
33 """
33 """
34
34
35 def remote_function(f):
35 def remote_function(f):
36 return RemoteFunction(view, f, block=block, **flags)
36 return RemoteFunction(view, f, block=block, **flags)
37 return remote_function
37 return remote_function
38
38
39 @testdec.skip_doctest
39 @skip_doctest
40 def parallel(view, dist='b', block=None, **flags):
40 def parallel(view, dist='b', block=None, **flags):
41 """Turn a function into a parallel remote function.
41 """Turn a function into a parallel remote function.
42
42
43 This method can be used for map:
43 This method can be used for map:
44
44
45 In [1]: @parallel(view, block=True)
45 In [1]: @parallel(view, block=True)
46 ...: def func(a):
46 ...: def func(a):
47 ...: pass
47 ...: pass
48 """
48 """
49
49
50 def parallel_function(f):
50 def parallel_function(f):
51 return ParallelFunction(view, f, dist=dist, block=block, **flags)
51 return ParallelFunction(view, f, dist=dist, block=block, **flags)
52 return parallel_function
52 return parallel_function
53
53
54 #--------------------------------------------------------------------------
54 #--------------------------------------------------------------------------
55 # Classes
55 # Classes
56 #--------------------------------------------------------------------------
56 #--------------------------------------------------------------------------
57
57
58 class RemoteFunction(object):
58 class RemoteFunction(object):
59 """Turn an existing function into a remote function.
59 """Turn an existing function into a remote function.
60
60
61 Parameters
61 Parameters
62 ----------
62 ----------
63
63
64 view : View instance
64 view : View instance
65 The view to be used for execution
65 The view to be used for execution
66 f : callable
66 f : callable
67 The function to be wrapped into a remote function
67 The function to be wrapped into a remote function
68 block : bool [default: None]
68 block : bool [default: None]
69 Whether to wait for results or not. The default behavior is
69 Whether to wait for results or not. The default behavior is
70 to use the current `block` attribute of `view`
70 to use the current `block` attribute of `view`
71
71
72 **flags : remaining kwargs are passed to View.temp_flags
72 **flags : remaining kwargs are passed to View.temp_flags
73 """
73 """
74
74
75 view = None # the remote connection
75 view = None # the remote connection
76 func = None # the wrapped function
76 func = None # the wrapped function
77 block = None # whether to block
77 block = None # whether to block
78 flags = None # dict of extra kwargs for temp_flags
78 flags = None # dict of extra kwargs for temp_flags
79
79
80 def __init__(self, view, f, block=None, **flags):
80 def __init__(self, view, f, block=None, **flags):
81 self.view = view
81 self.view = view
82 self.func = f
82 self.func = f
83 self.block=block
83 self.block=block
84 self.flags=flags
84 self.flags=flags
85
85
86 def __call__(self, *args, **kwargs):
86 def __call__(self, *args, **kwargs):
87 block = self.view.block if self.block is None else self.block
87 block = self.view.block if self.block is None else self.block
88 with self.view.temp_flags(block=block, **self.flags):
88 with self.view.temp_flags(block=block, **self.flags):
89 return self.view.apply(self.func, *args, **kwargs)
89 return self.view.apply(self.func, *args, **kwargs)
90
90
91
91
92 class ParallelFunction(RemoteFunction):
92 class ParallelFunction(RemoteFunction):
93 """Class for mapping a function to sequences.
93 """Class for mapping a function to sequences.
94
94
95 This will distribute the sequences according the a mapper, and call
95 This will distribute the sequences according the a mapper, and call
96 the function on each sub-sequence. If called via map, then the function
96 the function on each sub-sequence. If called via map, then the function
97 will be called once on each element, rather that each sub-sequence.
97 will be called once on each element, rather that each sub-sequence.
98
98
99 Parameters
99 Parameters
100 ----------
100 ----------
101
101
102 view : View instance
102 view : View instance
103 The view to be used for execution
103 The view to be used for execution
104 f : callable
104 f : callable
105 The function to be wrapped into a remote function
105 The function to be wrapped into a remote function
106 dist : str [default: 'b']
106 dist : str [default: 'b']
107 The key for which mapObject to use to distribute sequences
107 The key for which mapObject to use to distribute sequences
108 options are:
108 options are:
109 * 'b' : use contiguous chunks in order
109 * 'b' : use contiguous chunks in order
110 * 'r' : use round-robin striping
110 * 'r' : use round-robin striping
111 block : bool [default: None]
111 block : bool [default: None]
112 Whether to wait for results or not. The default behavior is
112 Whether to wait for results or not. The default behavior is
113 to use the current `block` attribute of `view`
113 to use the current `block` attribute of `view`
114 chunksize : int or None
114 chunksize : int or None
115 The size of chunk to use when breaking up sequences in a load-balanced manner
115 The size of chunk to use when breaking up sequences in a load-balanced manner
116 **flags : remaining kwargs are passed to View.temp_flags
116 **flags : remaining kwargs are passed to View.temp_flags
117 """
117 """
118
118
119 chunksize=None
119 chunksize=None
120 mapObject=None
120 mapObject=None
121
121
122 def __init__(self, view, f, dist='b', block=None, chunksize=None, **flags):
122 def __init__(self, view, f, dist='b', block=None, chunksize=None, **flags):
123 super(ParallelFunction, self).__init__(view, f, block=block, **flags)
123 super(ParallelFunction, self).__init__(view, f, block=block, **flags)
124 self.chunksize = chunksize
124 self.chunksize = chunksize
125
125
126 mapClass = Map.dists[dist]
126 mapClass = Map.dists[dist]
127 self.mapObject = mapClass()
127 self.mapObject = mapClass()
128
128
129 def __call__(self, *sequences):
129 def __call__(self, *sequences):
130 # check that the length of sequences match
130 # check that the length of sequences match
131 len_0 = len(sequences[0])
131 len_0 = len(sequences[0])
132 for s in sequences:
132 for s in sequences:
133 if len(s)!=len_0:
133 if len(s)!=len_0:
134 msg = 'all sequences must have equal length, but %i!=%i'%(len_0,len(s))
134 msg = 'all sequences must have equal length, but %i!=%i'%(len_0,len(s))
135 raise ValueError(msg)
135 raise ValueError(msg)
136 balanced = 'Balanced' in self.view.__class__.__name__
136 balanced = 'Balanced' in self.view.__class__.__name__
137 if balanced:
137 if balanced:
138 if self.chunksize:
138 if self.chunksize:
139 nparts = len_0/self.chunksize + int(len_0%self.chunksize > 0)
139 nparts = len_0/self.chunksize + int(len_0%self.chunksize > 0)
140 else:
140 else:
141 nparts = len_0
141 nparts = len_0
142 targets = [None]*nparts
142 targets = [None]*nparts
143 else:
143 else:
144 if self.chunksize:
144 if self.chunksize:
145 warnings.warn("`chunksize` is ignored unless load balancing", UserWarning)
145 warnings.warn("`chunksize` is ignored unless load balancing", UserWarning)
146 # multiplexed:
146 # multiplexed:
147 targets = self.view.targets
147 targets = self.view.targets
148 nparts = len(targets)
148 nparts = len(targets)
149
149
150 msg_ids = []
150 msg_ids = []
151 # my_f = lambda *a: map(self.func, *a)
151 # my_f = lambda *a: map(self.func, *a)
152 client = self.view.client
152 client = self.view.client
153 for index, t in enumerate(targets):
153 for index, t in enumerate(targets):
154 args = []
154 args = []
155 for seq in sequences:
155 for seq in sequences:
156 part = self.mapObject.getPartition(seq, index, nparts)
156 part = self.mapObject.getPartition(seq, index, nparts)
157 if len(part) == 0:
157 if len(part) == 0:
158 continue
158 continue
159 else:
159 else:
160 args.append(part)
160 args.append(part)
161 if not args:
161 if not args:
162 continue
162 continue
163
163
164 # print (args)
164 # print (args)
165 if hasattr(self, '_map'):
165 if hasattr(self, '_map'):
166 f = map
166 f = map
167 args = [self.func]+args
167 args = [self.func]+args
168 else:
168 else:
169 f=self.func
169 f=self.func
170
170
171 view = self.view if balanced else client[t]
171 view = self.view if balanced else client[t]
172 with view.temp_flags(block=False, **self.flags):
172 with view.temp_flags(block=False, **self.flags):
173 ar = view.apply(f, *args)
173 ar = view.apply(f, *args)
174
174
175 msg_ids.append(ar.msg_ids[0])
175 msg_ids.append(ar.msg_ids[0])
176
176
177 r = AsyncMapResult(self.view.client, msg_ids, self.mapObject, fname=self.func.__name__)
177 r = AsyncMapResult(self.view.client, msg_ids, self.mapObject, fname=self.func.__name__)
178
178
179 if self.block:
179 if self.block:
180 try:
180 try:
181 return r.get()
181 return r.get()
182 except KeyboardInterrupt:
182 except KeyboardInterrupt:
183 return r
183 return r
184 else:
184 else:
185 return r
185 return r
186
186
187 def map(self, *sequences):
187 def map(self, *sequences):
188 """call a function on each element of a sequence remotely.
188 """call a function on each element of a sequence remotely.
189 This should behave very much like the builtin map, but return an AsyncMapResult
189 This should behave very much like the builtin map, but return an AsyncMapResult
190 if self.block is False.
190 if self.block is False.
191 """
191 """
192 # set _map as a flag for use inside self.__call__
192 # set _map as a flag for use inside self.__call__
193 self._map = True
193 self._map = True
194 try:
194 try:
195 ret = self.__call__(*sequences)
195 ret = self.__call__(*sequences)
196 finally:
196 finally:
197 del self._map
197 del self._map
198 return ret
198 return ret
199
199
200 __all__ = ['remote', 'parallel', 'RemoteFunction', 'ParallelFunction'] No newline at end of file
200 __all__ = ['remote', 'parallel', 'RemoteFunction', 'ParallelFunction']
@@ -1,1042 +1,1041 b''
1 """Views of remote engines."""
1 """Views of remote engines."""
2 #-----------------------------------------------------------------------------
2 #-----------------------------------------------------------------------------
3 # Copyright (C) 2010 The IPython Development Team
3 # Copyright (C) 2010 The IPython Development Team
4 #
4 #
5 # Distributed under the terms of the BSD License. The full license is in
5 # Distributed under the terms of the BSD License. The full license is in
6 # the file COPYING, distributed as part of this software.
6 # the file COPYING, distributed as part of this software.
7 #-----------------------------------------------------------------------------
7 #-----------------------------------------------------------------------------
8
8
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10 # Imports
10 # Imports
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 import imp
13 import imp
14 import sys
14 import sys
15 import warnings
15 import warnings
16 from contextlib import contextmanager
16 from contextlib import contextmanager
17 from types import ModuleType
17 from types import ModuleType
18
18
19 import zmq
19 import zmq
20
20
21 from IPython.testing import decorators as testdec
21 from IPython.testing.skipdoctest import skip_doctest
22 from IPython.utils.traitlets import HasTraits, Any, Bool, List, Dict, Set, Int, Instance, CFloat, CInt
22 from IPython.utils.traitlets import HasTraits, Any, Bool, List, Dict, Set, Int, Instance, CFloat, CInt
23
24 from IPython.external.decorator import decorator
23 from IPython.external.decorator import decorator
25
24
26 from IPython.parallel import util
25 from IPython.parallel import util
27 from IPython.parallel.controller.dependency import Dependency, dependent
26 from IPython.parallel.controller.dependency import Dependency, dependent
28
27
29 from . import map as Map
28 from . import map as Map
30 from .asyncresult import AsyncResult, AsyncMapResult
29 from .asyncresult import AsyncResult, AsyncMapResult
31 from .remotefunction import ParallelFunction, parallel, remote
30 from .remotefunction import ParallelFunction, parallel, remote
32
31
33 #-----------------------------------------------------------------------------
32 #-----------------------------------------------------------------------------
34 # Decorators
33 # Decorators
35 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
36
35
37 @decorator
36 @decorator
38 def save_ids(f, self, *args, **kwargs):
37 def save_ids(f, self, *args, **kwargs):
39 """Keep our history and outstanding attributes up to date after a method call."""
38 """Keep our history and outstanding attributes up to date after a method call."""
40 n_previous = len(self.client.history)
39 n_previous = len(self.client.history)
41 try:
40 try:
42 ret = f(self, *args, **kwargs)
41 ret = f(self, *args, **kwargs)
43 finally:
42 finally:
44 nmsgs = len(self.client.history) - n_previous
43 nmsgs = len(self.client.history) - n_previous
45 msg_ids = self.client.history[-nmsgs:]
44 msg_ids = self.client.history[-nmsgs:]
46 self.history.extend(msg_ids)
45 self.history.extend(msg_ids)
47 map(self.outstanding.add, msg_ids)
46 map(self.outstanding.add, msg_ids)
48 return ret
47 return ret
49
48
50 @decorator
49 @decorator
51 def sync_results(f, self, *args, **kwargs):
50 def sync_results(f, self, *args, **kwargs):
52 """sync relevant results from self.client to our results attribute."""
51 """sync relevant results from self.client to our results attribute."""
53 ret = f(self, *args, **kwargs)
52 ret = f(self, *args, **kwargs)
54 delta = self.outstanding.difference(self.client.outstanding)
53 delta = self.outstanding.difference(self.client.outstanding)
55 completed = self.outstanding.intersection(delta)
54 completed = self.outstanding.intersection(delta)
56 self.outstanding = self.outstanding.difference(completed)
55 self.outstanding = self.outstanding.difference(completed)
57 for msg_id in completed:
56 for msg_id in completed:
58 self.results[msg_id] = self.client.results[msg_id]
57 self.results[msg_id] = self.client.results[msg_id]
59 return ret
58 return ret
60
59
61 @decorator
60 @decorator
62 def spin_after(f, self, *args, **kwargs):
61 def spin_after(f, self, *args, **kwargs):
63 """call spin after the method."""
62 """call spin after the method."""
64 ret = f(self, *args, **kwargs)
63 ret = f(self, *args, **kwargs)
65 self.spin()
64 self.spin()
66 return ret
65 return ret
67
66
68 #-----------------------------------------------------------------------------
67 #-----------------------------------------------------------------------------
69 # Classes
68 # Classes
70 #-----------------------------------------------------------------------------
69 #-----------------------------------------------------------------------------
71
70
72 @testdec.skip_doctest
71 @skip_doctest
73 class View(HasTraits):
72 class View(HasTraits):
74 """Base View class for more convenint apply(f,*args,**kwargs) syntax via attributes.
73 """Base View class for more convenint apply(f,*args,**kwargs) syntax via attributes.
75
74
76 Don't use this class, use subclasses.
75 Don't use this class, use subclasses.
77
76
78 Methods
77 Methods
79 -------
78 -------
80
79
81 spin
80 spin
82 flushes incoming results and registration state changes
81 flushes incoming results and registration state changes
83 control methods spin, and requesting `ids` also ensures up to date
82 control methods spin, and requesting `ids` also ensures up to date
84
83
85 wait
84 wait
86 wait on one or more msg_ids
85 wait on one or more msg_ids
87
86
88 execution methods
87 execution methods
89 apply
88 apply
90 legacy: execute, run
89 legacy: execute, run
91
90
92 data movement
91 data movement
93 push, pull, scatter, gather
92 push, pull, scatter, gather
94
93
95 query methods
94 query methods
96 get_result, queue_status, purge_results, result_status
95 get_result, queue_status, purge_results, result_status
97
96
98 control methods
97 control methods
99 abort, shutdown
98 abort, shutdown
100
99
101 """
100 """
102 # flags
101 # flags
103 block=Bool(False)
102 block=Bool(False)
104 track=Bool(True)
103 track=Bool(True)
105 targets = Any()
104 targets = Any()
106
105
107 history=List()
106 history=List()
108 outstanding = Set()
107 outstanding = Set()
109 results = Dict()
108 results = Dict()
110 client = Instance('IPython.parallel.Client')
109 client = Instance('IPython.parallel.Client')
111
110
112 _socket = Instance('zmq.Socket')
111 _socket = Instance('zmq.Socket')
113 _flag_names = List(['targets', 'block', 'track'])
112 _flag_names = List(['targets', 'block', 'track'])
114 _targets = Any()
113 _targets = Any()
115 _idents = Any()
114 _idents = Any()
116
115
117 def __init__(self, client=None, socket=None, **flags):
116 def __init__(self, client=None, socket=None, **flags):
118 super(View, self).__init__(client=client, _socket=socket)
117 super(View, self).__init__(client=client, _socket=socket)
119 self.block = client.block
118 self.block = client.block
120
119
121 self.set_flags(**flags)
120 self.set_flags(**flags)
122
121
123 assert not self.__class__ is View, "Don't use base View objects, use subclasses"
122 assert not self.__class__ is View, "Don't use base View objects, use subclasses"
124
123
125
124
126 def __repr__(self):
125 def __repr__(self):
127 strtargets = str(self.targets)
126 strtargets = str(self.targets)
128 if len(strtargets) > 16:
127 if len(strtargets) > 16:
129 strtargets = strtargets[:12]+'...]'
128 strtargets = strtargets[:12]+'...]'
130 return "<%s %s>"%(self.__class__.__name__, strtargets)
129 return "<%s %s>"%(self.__class__.__name__, strtargets)
131
130
132 def set_flags(self, **kwargs):
131 def set_flags(self, **kwargs):
133 """set my attribute flags by keyword.
132 """set my attribute flags by keyword.
134
133
135 Views determine behavior with a few attributes (`block`, `track`, etc.).
134 Views determine behavior with a few attributes (`block`, `track`, etc.).
136 These attributes can be set all at once by name with this method.
135 These attributes can be set all at once by name with this method.
137
136
138 Parameters
137 Parameters
139 ----------
138 ----------
140
139
141 block : bool
140 block : bool
142 whether to wait for results
141 whether to wait for results
143 track : bool
142 track : bool
144 whether to create a MessageTracker to allow the user to
143 whether to create a MessageTracker to allow the user to
145 safely edit after arrays and buffers during non-copying
144 safely edit after arrays and buffers during non-copying
146 sends.
145 sends.
147 """
146 """
148 for name, value in kwargs.iteritems():
147 for name, value in kwargs.iteritems():
149 if name not in self._flag_names:
148 if name not in self._flag_names:
150 raise KeyError("Invalid name: %r"%name)
149 raise KeyError("Invalid name: %r"%name)
151 else:
150 else:
152 setattr(self, name, value)
151 setattr(self, name, value)
153
152
154 @contextmanager
153 @contextmanager
155 def temp_flags(self, **kwargs):
154 def temp_flags(self, **kwargs):
156 """temporarily set flags, for use in `with` statements.
155 """temporarily set flags, for use in `with` statements.
157
156
158 See set_flags for permanent setting of flags
157 See set_flags for permanent setting of flags
159
158
160 Examples
159 Examples
161 --------
160 --------
162
161
163 >>> view.track=False
162 >>> view.track=False
164 ...
163 ...
165 >>> with view.temp_flags(track=True):
164 >>> with view.temp_flags(track=True):
166 ... ar = view.apply(dostuff, my_big_array)
165 ... ar = view.apply(dostuff, my_big_array)
167 ... ar.tracker.wait() # wait for send to finish
166 ... ar.tracker.wait() # wait for send to finish
168 >>> view.track
167 >>> view.track
169 False
168 False
170
169
171 """
170 """
172 # preflight: save flags, and set temporaries
171 # preflight: save flags, and set temporaries
173 saved_flags = {}
172 saved_flags = {}
174 for f in self._flag_names:
173 for f in self._flag_names:
175 saved_flags[f] = getattr(self, f)
174 saved_flags[f] = getattr(self, f)
176 self.set_flags(**kwargs)
175 self.set_flags(**kwargs)
177 # yield to the with-statement block
176 # yield to the with-statement block
178 try:
177 try:
179 yield
178 yield
180 finally:
179 finally:
181 # postflight: restore saved flags
180 # postflight: restore saved flags
182 self.set_flags(**saved_flags)
181 self.set_flags(**saved_flags)
183
182
184
183
185 #----------------------------------------------------------------
184 #----------------------------------------------------------------
186 # apply
185 # apply
187 #----------------------------------------------------------------
186 #----------------------------------------------------------------
188
187
189 @sync_results
188 @sync_results
190 @save_ids
189 @save_ids
191 def _really_apply(self, f, args, kwargs, block=None, **options):
190 def _really_apply(self, f, args, kwargs, block=None, **options):
192 """wrapper for client.send_apply_message"""
191 """wrapper for client.send_apply_message"""
193 raise NotImplementedError("Implement in subclasses")
192 raise NotImplementedError("Implement in subclasses")
194
193
195 def apply(self, f, *args, **kwargs):
194 def apply(self, f, *args, **kwargs):
196 """calls f(*args, **kwargs) on remote engines, returning the result.
195 """calls f(*args, **kwargs) on remote engines, returning the result.
197
196
198 This method sets all apply flags via this View's attributes.
197 This method sets all apply flags via this View's attributes.
199
198
200 if self.block is False:
199 if self.block is False:
201 returns AsyncResult
200 returns AsyncResult
202 else:
201 else:
203 returns actual result of f(*args, **kwargs)
202 returns actual result of f(*args, **kwargs)
204 """
203 """
205 return self._really_apply(f, args, kwargs)
204 return self._really_apply(f, args, kwargs)
206
205
207 def apply_async(self, f, *args, **kwargs):
206 def apply_async(self, f, *args, **kwargs):
208 """calls f(*args, **kwargs) on remote engines in a nonblocking manner.
207 """calls f(*args, **kwargs) on remote engines in a nonblocking manner.
209
208
210 returns AsyncResult
209 returns AsyncResult
211 """
210 """
212 return self._really_apply(f, args, kwargs, block=False)
211 return self._really_apply(f, args, kwargs, block=False)
213
212
214 @spin_after
213 @spin_after
215 def apply_sync(self, f, *args, **kwargs):
214 def apply_sync(self, f, *args, **kwargs):
216 """calls f(*args, **kwargs) on remote engines in a blocking manner,
215 """calls f(*args, **kwargs) on remote engines in a blocking manner,
217 returning the result.
216 returning the result.
218
217
219 returns: actual result of f(*args, **kwargs)
218 returns: actual result of f(*args, **kwargs)
220 """
219 """
221 return self._really_apply(f, args, kwargs, block=True)
220 return self._really_apply(f, args, kwargs, block=True)
222
221
223 #----------------------------------------------------------------
222 #----------------------------------------------------------------
224 # wrappers for client and control methods
223 # wrappers for client and control methods
225 #----------------------------------------------------------------
224 #----------------------------------------------------------------
226 @sync_results
225 @sync_results
227 def spin(self):
226 def spin(self):
228 """spin the client, and sync"""
227 """spin the client, and sync"""
229 self.client.spin()
228 self.client.spin()
230
229
231 @sync_results
230 @sync_results
232 def wait(self, jobs=None, timeout=-1):
231 def wait(self, jobs=None, timeout=-1):
233 """waits on one or more `jobs`, for up to `timeout` seconds.
232 """waits on one or more `jobs`, for up to `timeout` seconds.
234
233
235 Parameters
234 Parameters
236 ----------
235 ----------
237
236
238 jobs : int, str, or list of ints and/or strs, or one or more AsyncResult objects
237 jobs : int, str, or list of ints and/or strs, or one or more AsyncResult objects
239 ints are indices to self.history
238 ints are indices to self.history
240 strs are msg_ids
239 strs are msg_ids
241 default: wait on all outstanding messages
240 default: wait on all outstanding messages
242 timeout : float
241 timeout : float
243 a time in seconds, after which to give up.
242 a time in seconds, after which to give up.
244 default is -1, which means no timeout
243 default is -1, which means no timeout
245
244
246 Returns
245 Returns
247 -------
246 -------
248
247
249 True : when all msg_ids are done
248 True : when all msg_ids are done
250 False : timeout reached, some msg_ids still outstanding
249 False : timeout reached, some msg_ids still outstanding
251 """
250 """
252 if jobs is None:
251 if jobs is None:
253 jobs = self.history
252 jobs = self.history
254 return self.client.wait(jobs, timeout)
253 return self.client.wait(jobs, timeout)
255
254
256 def abort(self, jobs=None, targets=None, block=None):
255 def abort(self, jobs=None, targets=None, block=None):
257 """Abort jobs on my engines.
256 """Abort jobs on my engines.
258
257
259 Parameters
258 Parameters
260 ----------
259 ----------
261
260
262 jobs : None, str, list of strs, optional
261 jobs : None, str, list of strs, optional
263 if None: abort all jobs.
262 if None: abort all jobs.
264 else: abort specific msg_id(s).
263 else: abort specific msg_id(s).
265 """
264 """
266 block = block if block is not None else self.block
265 block = block if block is not None else self.block
267 targets = targets if targets is not None else self.targets
266 targets = targets if targets is not None else self.targets
268 return self.client.abort(jobs=jobs, targets=targets, block=block)
267 return self.client.abort(jobs=jobs, targets=targets, block=block)
269
268
270 def queue_status(self, targets=None, verbose=False):
269 def queue_status(self, targets=None, verbose=False):
271 """Fetch the Queue status of my engines"""
270 """Fetch the Queue status of my engines"""
272 targets = targets if targets is not None else self.targets
271 targets = targets if targets is not None else self.targets
273 return self.client.queue_status(targets=targets, verbose=verbose)
272 return self.client.queue_status(targets=targets, verbose=verbose)
274
273
275 def purge_results(self, jobs=[], targets=[]):
274 def purge_results(self, jobs=[], targets=[]):
276 """Instruct the controller to forget specific results."""
275 """Instruct the controller to forget specific results."""
277 if targets is None or targets == 'all':
276 if targets is None or targets == 'all':
278 targets = self.targets
277 targets = self.targets
279 return self.client.purge_results(jobs=jobs, targets=targets)
278 return self.client.purge_results(jobs=jobs, targets=targets)
280
279
281 def shutdown(self, targets=None, restart=False, hub=False, block=None):
280 def shutdown(self, targets=None, restart=False, hub=False, block=None):
282 """Terminates one or more engine processes, optionally including the hub.
281 """Terminates one or more engine processes, optionally including the hub.
283 """
282 """
284 block = self.block if block is None else block
283 block = self.block if block is None else block
285 if targets is None or targets == 'all':
284 if targets is None or targets == 'all':
286 targets = self.targets
285 targets = self.targets
287 return self.client.shutdown(targets=targets, restart=restart, hub=hub, block=block)
286 return self.client.shutdown(targets=targets, restart=restart, hub=hub, block=block)
288
287
289 @spin_after
288 @spin_after
290 def get_result(self, indices_or_msg_ids=None):
289 def get_result(self, indices_or_msg_ids=None):
291 """return one or more results, specified by history index or msg_id.
290 """return one or more results, specified by history index or msg_id.
292
291
293 See client.get_result for details.
292 See client.get_result for details.
294
293
295 """
294 """
296
295
297 if indices_or_msg_ids is None:
296 if indices_or_msg_ids is None:
298 indices_or_msg_ids = -1
297 indices_or_msg_ids = -1
299 if isinstance(indices_or_msg_ids, int):
298 if isinstance(indices_or_msg_ids, int):
300 indices_or_msg_ids = self.history[indices_or_msg_ids]
299 indices_or_msg_ids = self.history[indices_or_msg_ids]
301 elif isinstance(indices_or_msg_ids, (list,tuple,set)):
300 elif isinstance(indices_or_msg_ids, (list,tuple,set)):
302 indices_or_msg_ids = list(indices_or_msg_ids)
301 indices_or_msg_ids = list(indices_or_msg_ids)
303 for i,index in enumerate(indices_or_msg_ids):
302 for i,index in enumerate(indices_or_msg_ids):
304 if isinstance(index, int):
303 if isinstance(index, int):
305 indices_or_msg_ids[i] = self.history[index]
304 indices_or_msg_ids[i] = self.history[index]
306 return self.client.get_result(indices_or_msg_ids)
305 return self.client.get_result(indices_or_msg_ids)
307
306
308 #-------------------------------------------------------------------
307 #-------------------------------------------------------------------
309 # Map
308 # Map
310 #-------------------------------------------------------------------
309 #-------------------------------------------------------------------
311
310
312 def map(self, f, *sequences, **kwargs):
311 def map(self, f, *sequences, **kwargs):
313 """override in subclasses"""
312 """override in subclasses"""
314 raise NotImplementedError
313 raise NotImplementedError
315
314
316 def map_async(self, f, *sequences, **kwargs):
315 def map_async(self, f, *sequences, **kwargs):
317 """Parallel version of builtin `map`, using this view's engines.
316 """Parallel version of builtin `map`, using this view's engines.
318
317
319 This is equivalent to map(...block=False)
318 This is equivalent to map(...block=False)
320
319
321 See `self.map` for details.
320 See `self.map` for details.
322 """
321 """
323 if 'block' in kwargs:
322 if 'block' in kwargs:
324 raise TypeError("map_async doesn't take a `block` keyword argument.")
323 raise TypeError("map_async doesn't take a `block` keyword argument.")
325 kwargs['block'] = False
324 kwargs['block'] = False
326 return self.map(f,*sequences,**kwargs)
325 return self.map(f,*sequences,**kwargs)
327
326
328 def map_sync(self, f, *sequences, **kwargs):
327 def map_sync(self, f, *sequences, **kwargs):
329 """Parallel version of builtin `map`, using this view's engines.
328 """Parallel version of builtin `map`, using this view's engines.
330
329
331 This is equivalent to map(...block=True)
330 This is equivalent to map(...block=True)
332
331
333 See `self.map` for details.
332 See `self.map` for details.
334 """
333 """
335 if 'block' in kwargs:
334 if 'block' in kwargs:
336 raise TypeError("map_sync doesn't take a `block` keyword argument.")
335 raise TypeError("map_sync doesn't take a `block` keyword argument.")
337 kwargs['block'] = True
336 kwargs['block'] = True
338 return self.map(f,*sequences,**kwargs)
337 return self.map(f,*sequences,**kwargs)
339
338
340 def imap(self, f, *sequences, **kwargs):
339 def imap(self, f, *sequences, **kwargs):
341 """Parallel version of `itertools.imap`.
340 """Parallel version of `itertools.imap`.
342
341
343 See `self.map` for details.
342 See `self.map` for details.
344
343
345 """
344 """
346
345
347 return iter(self.map_async(f,*sequences, **kwargs))
346 return iter(self.map_async(f,*sequences, **kwargs))
348
347
349 #-------------------------------------------------------------------
348 #-------------------------------------------------------------------
350 # Decorators
349 # Decorators
351 #-------------------------------------------------------------------
350 #-------------------------------------------------------------------
352
351
353 def remote(self, block=True, **flags):
352 def remote(self, block=True, **flags):
354 """Decorator for making a RemoteFunction"""
353 """Decorator for making a RemoteFunction"""
355 block = self.block if block is None else block
354 block = self.block if block is None else block
356 return remote(self, block=block, **flags)
355 return remote(self, block=block, **flags)
357
356
358 def parallel(self, dist='b', block=None, **flags):
357 def parallel(self, dist='b', block=None, **flags):
359 """Decorator for making a ParallelFunction"""
358 """Decorator for making a ParallelFunction"""
360 block = self.block if block is None else block
359 block = self.block if block is None else block
361 return parallel(self, dist=dist, block=block, **flags)
360 return parallel(self, dist=dist, block=block, **flags)
362
361
363 @testdec.skip_doctest
362 @skip_doctest
364 class DirectView(View):
363 class DirectView(View):
365 """Direct Multiplexer View of one or more engines.
364 """Direct Multiplexer View of one or more engines.
366
365
367 These are created via indexed access to a client:
366 These are created via indexed access to a client:
368
367
369 >>> dv_1 = client[1]
368 >>> dv_1 = client[1]
370 >>> dv_all = client[:]
369 >>> dv_all = client[:]
371 >>> dv_even = client[::2]
370 >>> dv_even = client[::2]
372 >>> dv_some = client[1:3]
371 >>> dv_some = client[1:3]
373
372
374 This object provides dictionary access to engine namespaces:
373 This object provides dictionary access to engine namespaces:
375
374
376 # push a=5:
375 # push a=5:
377 >>> dv['a'] = 5
376 >>> dv['a'] = 5
378 # pull 'foo':
377 # pull 'foo':
379 >>> db['foo']
378 >>> db['foo']
380
379
381 """
380 """
382
381
383 def __init__(self, client=None, socket=None, targets=None):
382 def __init__(self, client=None, socket=None, targets=None):
384 super(DirectView, self).__init__(client=client, socket=socket, targets=targets)
383 super(DirectView, self).__init__(client=client, socket=socket, targets=targets)
385
384
386 @property
385 @property
387 def importer(self):
386 def importer(self):
388 """sync_imports(local=True) as a property.
387 """sync_imports(local=True) as a property.
389
388
390 See sync_imports for details.
389 See sync_imports for details.
391
390
392 """
391 """
393 return self.sync_imports(True)
392 return self.sync_imports(True)
394
393
395 @contextmanager
394 @contextmanager
396 def sync_imports(self, local=True):
395 def sync_imports(self, local=True):
397 """Context Manager for performing simultaneous local and remote imports.
396 """Context Manager for performing simultaneous local and remote imports.
398
397
399 'import x as y' will *not* work. The 'as y' part will simply be ignored.
398 'import x as y' will *not* work. The 'as y' part will simply be ignored.
400
399
401 >>> with view.sync_imports():
400 >>> with view.sync_imports():
402 ... from numpy import recarray
401 ... from numpy import recarray
403 importing recarray from numpy on engine(s)
402 importing recarray from numpy on engine(s)
404
403
405 """
404 """
406 import __builtin__
405 import __builtin__
407 local_import = __builtin__.__import__
406 local_import = __builtin__.__import__
408 modules = set()
407 modules = set()
409 results = []
408 results = []
410 @util.interactive
409 @util.interactive
411 def remote_import(name, fromlist, level):
410 def remote_import(name, fromlist, level):
412 """the function to be passed to apply, that actually performs the import
411 """the function to be passed to apply, that actually performs the import
413 on the engine, and loads up the user namespace.
412 on the engine, and loads up the user namespace.
414 """
413 """
415 import sys
414 import sys
416 user_ns = globals()
415 user_ns = globals()
417 mod = __import__(name, fromlist=fromlist, level=level)
416 mod = __import__(name, fromlist=fromlist, level=level)
418 if fromlist:
417 if fromlist:
419 for key in fromlist:
418 for key in fromlist:
420 user_ns[key] = getattr(mod, key)
419 user_ns[key] = getattr(mod, key)
421 else:
420 else:
422 user_ns[name] = sys.modules[name]
421 user_ns[name] = sys.modules[name]
423
422
424 def view_import(name, globals={}, locals={}, fromlist=[], level=-1):
423 def view_import(name, globals={}, locals={}, fromlist=[], level=-1):
425 """the drop-in replacement for __import__, that optionally imports
424 """the drop-in replacement for __import__, that optionally imports
426 locally as well.
425 locally as well.
427 """
426 """
428 # don't override nested imports
427 # don't override nested imports
429 save_import = __builtin__.__import__
428 save_import = __builtin__.__import__
430 __builtin__.__import__ = local_import
429 __builtin__.__import__ = local_import
431
430
432 if imp.lock_held():
431 if imp.lock_held():
433 # this is a side-effect import, don't do it remotely, or even
432 # this is a side-effect import, don't do it remotely, or even
434 # ignore the local effects
433 # ignore the local effects
435 return local_import(name, globals, locals, fromlist, level)
434 return local_import(name, globals, locals, fromlist, level)
436
435
437 imp.acquire_lock()
436 imp.acquire_lock()
438 if local:
437 if local:
439 mod = local_import(name, globals, locals, fromlist, level)
438 mod = local_import(name, globals, locals, fromlist, level)
440 else:
439 else:
441 raise NotImplementedError("remote-only imports not yet implemented")
440 raise NotImplementedError("remote-only imports not yet implemented")
442 imp.release_lock()
441 imp.release_lock()
443
442
444 key = name+':'+','.join(fromlist or [])
443 key = name+':'+','.join(fromlist or [])
445 if level == -1 and key not in modules:
444 if level == -1 and key not in modules:
446 modules.add(key)
445 modules.add(key)
447 if fromlist:
446 if fromlist:
448 print "importing %s from %s on engine(s)"%(','.join(fromlist), name)
447 print "importing %s from %s on engine(s)"%(','.join(fromlist), name)
449 else:
448 else:
450 print "importing %s on engine(s)"%name
449 print "importing %s on engine(s)"%name
451 results.append(self.apply_async(remote_import, name, fromlist, level))
450 results.append(self.apply_async(remote_import, name, fromlist, level))
452 # restore override
451 # restore override
453 __builtin__.__import__ = save_import
452 __builtin__.__import__ = save_import
454
453
455 return mod
454 return mod
456
455
457 # override __import__
456 # override __import__
458 __builtin__.__import__ = view_import
457 __builtin__.__import__ = view_import
459 try:
458 try:
460 # enter the block
459 # enter the block
461 yield
460 yield
462 except ImportError:
461 except ImportError:
463 if not local:
462 if not local:
464 # ignore import errors if not doing local imports
463 # ignore import errors if not doing local imports
465 pass
464 pass
466 finally:
465 finally:
467 # always restore __import__
466 # always restore __import__
468 __builtin__.__import__ = local_import
467 __builtin__.__import__ = local_import
469
468
470 for r in results:
469 for r in results:
471 # raise possible remote ImportErrors here
470 # raise possible remote ImportErrors here
472 r.get()
471 r.get()
473
472
474
473
475 @sync_results
474 @sync_results
476 @save_ids
475 @save_ids
477 def _really_apply(self, f, args=None, kwargs=None, targets=None, block=None, track=None):
476 def _really_apply(self, f, args=None, kwargs=None, targets=None, block=None, track=None):
478 """calls f(*args, **kwargs) on remote engines, returning the result.
477 """calls f(*args, **kwargs) on remote engines, returning the result.
479
478
480 This method sets all of `apply`'s flags via this View's attributes.
479 This method sets all of `apply`'s flags via this View's attributes.
481
480
482 Parameters
481 Parameters
483 ----------
482 ----------
484
483
485 f : callable
484 f : callable
486
485
487 args : list [default: empty]
486 args : list [default: empty]
488
487
489 kwargs : dict [default: empty]
488 kwargs : dict [default: empty]
490
489
491 targets : target list [default: self.targets]
490 targets : target list [default: self.targets]
492 where to run
491 where to run
493 block : bool [default: self.block]
492 block : bool [default: self.block]
494 whether to block
493 whether to block
495 track : bool [default: self.track]
494 track : bool [default: self.track]
496 whether to ask zmq to track the message, for safe non-copying sends
495 whether to ask zmq to track the message, for safe non-copying sends
497
496
498 Returns
497 Returns
499 -------
498 -------
500
499
501 if self.block is False:
500 if self.block is False:
502 returns AsyncResult
501 returns AsyncResult
503 else:
502 else:
504 returns actual result of f(*args, **kwargs) on the engine(s)
503 returns actual result of f(*args, **kwargs) on the engine(s)
505 This will be a list of self.targets is also a list (even length 1), or
504 This will be a list of self.targets is also a list (even length 1), or
506 the single result if self.targets is an integer engine id
505 the single result if self.targets is an integer engine id
507 """
506 """
508 args = [] if args is None else args
507 args = [] if args is None else args
509 kwargs = {} if kwargs is None else kwargs
508 kwargs = {} if kwargs is None else kwargs
510 block = self.block if block is None else block
509 block = self.block if block is None else block
511 track = self.track if track is None else track
510 track = self.track if track is None else track
512 targets = self.targets if targets is None else targets
511 targets = self.targets if targets is None else targets
513
512
514 _idents = self.client._build_targets(targets)[0]
513 _idents = self.client._build_targets(targets)[0]
515 msg_ids = []
514 msg_ids = []
516 trackers = []
515 trackers = []
517 for ident in _idents:
516 for ident in _idents:
518 msg = self.client.send_apply_message(self._socket, f, args, kwargs, track=track,
517 msg = self.client.send_apply_message(self._socket, f, args, kwargs, track=track,
519 ident=ident)
518 ident=ident)
520 if track:
519 if track:
521 trackers.append(msg['tracker'])
520 trackers.append(msg['tracker'])
522 msg_ids.append(msg['msg_id'])
521 msg_ids.append(msg['msg_id'])
523 tracker = None if track is False else zmq.MessageTracker(*trackers)
522 tracker = None if track is False else zmq.MessageTracker(*trackers)
524 ar = AsyncResult(self.client, msg_ids, fname=f.__name__, targets=targets, tracker=tracker)
523 ar = AsyncResult(self.client, msg_ids, fname=f.__name__, targets=targets, tracker=tracker)
525 if block:
524 if block:
526 try:
525 try:
527 return ar.get()
526 return ar.get()
528 except KeyboardInterrupt:
527 except KeyboardInterrupt:
529 pass
528 pass
530 return ar
529 return ar
531
530
532 @spin_after
531 @spin_after
533 def map(self, f, *sequences, **kwargs):
532 def map(self, f, *sequences, **kwargs):
534 """view.map(f, *sequences, block=self.block) => list|AsyncMapResult
533 """view.map(f, *sequences, block=self.block) => list|AsyncMapResult
535
534
536 Parallel version of builtin `map`, using this View's `targets`.
535 Parallel version of builtin `map`, using this View's `targets`.
537
536
538 There will be one task per target, so work will be chunked
537 There will be one task per target, so work will be chunked
539 if the sequences are longer than `targets`.
538 if the sequences are longer than `targets`.
540
539
541 Results can be iterated as they are ready, but will become available in chunks.
540 Results can be iterated as they are ready, but will become available in chunks.
542
541
543 Parameters
542 Parameters
544 ----------
543 ----------
545
544
546 f : callable
545 f : callable
547 function to be mapped
546 function to be mapped
548 *sequences: one or more sequences of matching length
547 *sequences: one or more sequences of matching length
549 the sequences to be distributed and passed to `f`
548 the sequences to be distributed and passed to `f`
550 block : bool
549 block : bool
551 whether to wait for the result or not [default self.block]
550 whether to wait for the result or not [default self.block]
552
551
553 Returns
552 Returns
554 -------
553 -------
555
554
556 if block=False:
555 if block=False:
557 AsyncMapResult
556 AsyncMapResult
558 An object like AsyncResult, but which reassembles the sequence of results
557 An object like AsyncResult, but which reassembles the sequence of results
559 into a single list. AsyncMapResults can be iterated through before all
558 into a single list. AsyncMapResults can be iterated through before all
560 results are complete.
559 results are complete.
561 else:
560 else:
562 list
561 list
563 the result of map(f,*sequences)
562 the result of map(f,*sequences)
564 """
563 """
565
564
566 block = kwargs.pop('block', self.block)
565 block = kwargs.pop('block', self.block)
567 for k in kwargs.keys():
566 for k in kwargs.keys():
568 if k not in ['block', 'track']:
567 if k not in ['block', 'track']:
569 raise TypeError("invalid keyword arg, %r"%k)
568 raise TypeError("invalid keyword arg, %r"%k)
570
569
571 assert len(sequences) > 0, "must have some sequences to map onto!"
570 assert len(sequences) > 0, "must have some sequences to map onto!"
572 pf = ParallelFunction(self, f, block=block, **kwargs)
571 pf = ParallelFunction(self, f, block=block, **kwargs)
573 return pf.map(*sequences)
572 return pf.map(*sequences)
574
573
575 def execute(self, code, targets=None, block=None):
574 def execute(self, code, targets=None, block=None):
576 """Executes `code` on `targets` in blocking or nonblocking manner.
575 """Executes `code` on `targets` in blocking or nonblocking manner.
577
576
578 ``execute`` is always `bound` (affects engine namespace)
577 ``execute`` is always `bound` (affects engine namespace)
579
578
580 Parameters
579 Parameters
581 ----------
580 ----------
582
581
583 code : str
582 code : str
584 the code string to be executed
583 the code string to be executed
585 block : bool
584 block : bool
586 whether or not to wait until done to return
585 whether or not to wait until done to return
587 default: self.block
586 default: self.block
588 """
587 """
589 return self._really_apply(util._execute, args=(code,), block=block, targets=targets)
588 return self._really_apply(util._execute, args=(code,), block=block, targets=targets)
590
589
591 def run(self, filename, targets=None, block=None):
590 def run(self, filename, targets=None, block=None):
592 """Execute contents of `filename` on my engine(s).
591 """Execute contents of `filename` on my engine(s).
593
592
594 This simply reads the contents of the file and calls `execute`.
593 This simply reads the contents of the file and calls `execute`.
595
594
596 Parameters
595 Parameters
597 ----------
596 ----------
598
597
599 filename : str
598 filename : str
600 The path to the file
599 The path to the file
601 targets : int/str/list of ints/strs
600 targets : int/str/list of ints/strs
602 the engines on which to execute
601 the engines on which to execute
603 default : all
602 default : all
604 block : bool
603 block : bool
605 whether or not to wait until done
604 whether or not to wait until done
606 default: self.block
605 default: self.block
607
606
608 """
607 """
609 with open(filename, 'r') as f:
608 with open(filename, 'r') as f:
610 # add newline in case of trailing indented whitespace
609 # add newline in case of trailing indented whitespace
611 # which will cause SyntaxError
610 # which will cause SyntaxError
612 code = f.read()+'\n'
611 code = f.read()+'\n'
613 return self.execute(code, block=block, targets=targets)
612 return self.execute(code, block=block, targets=targets)
614
613
615 def update(self, ns):
614 def update(self, ns):
616 """update remote namespace with dict `ns`
615 """update remote namespace with dict `ns`
617
616
618 See `push` for details.
617 See `push` for details.
619 """
618 """
620 return self.push(ns, block=self.block, track=self.track)
619 return self.push(ns, block=self.block, track=self.track)
621
620
622 def push(self, ns, targets=None, block=None, track=None):
621 def push(self, ns, targets=None, block=None, track=None):
623 """update remote namespace with dict `ns`
622 """update remote namespace with dict `ns`
624
623
625 Parameters
624 Parameters
626 ----------
625 ----------
627
626
628 ns : dict
627 ns : dict
629 dict of keys with which to update engine namespace(s)
628 dict of keys with which to update engine namespace(s)
630 block : bool [default : self.block]
629 block : bool [default : self.block]
631 whether to wait to be notified of engine receipt
630 whether to wait to be notified of engine receipt
632
631
633 """
632 """
634
633
635 block = block if block is not None else self.block
634 block = block if block is not None else self.block
636 track = track if track is not None else self.track
635 track = track if track is not None else self.track
637 targets = targets if targets is not None else self.targets
636 targets = targets if targets is not None else self.targets
638 # applier = self.apply_sync if block else self.apply_async
637 # applier = self.apply_sync if block else self.apply_async
639 if not isinstance(ns, dict):
638 if not isinstance(ns, dict):
640 raise TypeError("Must be a dict, not %s"%type(ns))
639 raise TypeError("Must be a dict, not %s"%type(ns))
641 return self._really_apply(util._push, (ns,), block=block, track=track, targets=targets)
640 return self._really_apply(util._push, (ns,), block=block, track=track, targets=targets)
642
641
643 def get(self, key_s):
642 def get(self, key_s):
644 """get object(s) by `key_s` from remote namespace
643 """get object(s) by `key_s` from remote namespace
645
644
646 see `pull` for details.
645 see `pull` for details.
647 """
646 """
648 # block = block if block is not None else self.block
647 # block = block if block is not None else self.block
649 return self.pull(key_s, block=True)
648 return self.pull(key_s, block=True)
650
649
651 def pull(self, names, targets=None, block=None):
650 def pull(self, names, targets=None, block=None):
652 """get object(s) by `name` from remote namespace
651 """get object(s) by `name` from remote namespace
653
652
654 will return one object if it is a key.
653 will return one object if it is a key.
655 can also take a list of keys, in which case it will return a list of objects.
654 can also take a list of keys, in which case it will return a list of objects.
656 """
655 """
657 block = block if block is not None else self.block
656 block = block if block is not None else self.block
658 targets = targets if targets is not None else self.targets
657 targets = targets if targets is not None else self.targets
659 applier = self.apply_sync if block else self.apply_async
658 applier = self.apply_sync if block else self.apply_async
660 if isinstance(names, basestring):
659 if isinstance(names, basestring):
661 pass
660 pass
662 elif isinstance(names, (list,tuple,set)):
661 elif isinstance(names, (list,tuple,set)):
663 for key in names:
662 for key in names:
664 if not isinstance(key, basestring):
663 if not isinstance(key, basestring):
665 raise TypeError("keys must be str, not type %r"%type(key))
664 raise TypeError("keys must be str, not type %r"%type(key))
666 else:
665 else:
667 raise TypeError("names must be strs, not %r"%names)
666 raise TypeError("names must be strs, not %r"%names)
668 return self._really_apply(util._pull, (names,), block=block, targets=targets)
667 return self._really_apply(util._pull, (names,), block=block, targets=targets)
669
668
670 def scatter(self, key, seq, dist='b', flatten=False, targets=None, block=None, track=None):
669 def scatter(self, key, seq, dist='b', flatten=False, targets=None, block=None, track=None):
671 """
670 """
672 Partition a Python sequence and send the partitions to a set of engines.
671 Partition a Python sequence and send the partitions to a set of engines.
673 """
672 """
674 block = block if block is not None else self.block
673 block = block if block is not None else self.block
675 track = track if track is not None else self.track
674 track = track if track is not None else self.track
676 targets = targets if targets is not None else self.targets
675 targets = targets if targets is not None else self.targets
677
676
678 mapObject = Map.dists[dist]()
677 mapObject = Map.dists[dist]()
679 nparts = len(targets)
678 nparts = len(targets)
680 msg_ids = []
679 msg_ids = []
681 trackers = []
680 trackers = []
682 for index, engineid in enumerate(targets):
681 for index, engineid in enumerate(targets):
683 partition = mapObject.getPartition(seq, index, nparts)
682 partition = mapObject.getPartition(seq, index, nparts)
684 if flatten and len(partition) == 1:
683 if flatten and len(partition) == 1:
685 ns = {key: partition[0]}
684 ns = {key: partition[0]}
686 else:
685 else:
687 ns = {key: partition}
686 ns = {key: partition}
688 r = self.push(ns, block=False, track=track, targets=engineid)
687 r = self.push(ns, block=False, track=track, targets=engineid)
689 msg_ids.extend(r.msg_ids)
688 msg_ids.extend(r.msg_ids)
690 if track:
689 if track:
691 trackers.append(r._tracker)
690 trackers.append(r._tracker)
692
691
693 if track:
692 if track:
694 tracker = zmq.MessageTracker(*trackers)
693 tracker = zmq.MessageTracker(*trackers)
695 else:
694 else:
696 tracker = None
695 tracker = None
697
696
698 r = AsyncResult(self.client, msg_ids, fname='scatter', targets=targets, tracker=tracker)
697 r = AsyncResult(self.client, msg_ids, fname='scatter', targets=targets, tracker=tracker)
699 if block:
698 if block:
700 r.wait()
699 r.wait()
701 else:
700 else:
702 return r
701 return r
703
702
704 @sync_results
703 @sync_results
705 @save_ids
704 @save_ids
706 def gather(self, key, dist='b', targets=None, block=None):
705 def gather(self, key, dist='b', targets=None, block=None):
707 """
706 """
708 Gather a partitioned sequence on a set of engines as a single local seq.
707 Gather a partitioned sequence on a set of engines as a single local seq.
709 """
708 """
710 block = block if block is not None else self.block
709 block = block if block is not None else self.block
711 targets = targets if targets is not None else self.targets
710 targets = targets if targets is not None else self.targets
712 mapObject = Map.dists[dist]()
711 mapObject = Map.dists[dist]()
713 msg_ids = []
712 msg_ids = []
714
713
715 for index, engineid in enumerate(targets):
714 for index, engineid in enumerate(targets):
716 msg_ids.extend(self.pull(key, block=False, targets=engineid).msg_ids)
715 msg_ids.extend(self.pull(key, block=False, targets=engineid).msg_ids)
717
716
718 r = AsyncMapResult(self.client, msg_ids, mapObject, fname='gather')
717 r = AsyncMapResult(self.client, msg_ids, mapObject, fname='gather')
719
718
720 if block:
719 if block:
721 try:
720 try:
722 return r.get()
721 return r.get()
723 except KeyboardInterrupt:
722 except KeyboardInterrupt:
724 pass
723 pass
725 return r
724 return r
726
725
727 def __getitem__(self, key):
726 def __getitem__(self, key):
728 return self.get(key)
727 return self.get(key)
729
728
730 def __setitem__(self,key, value):
729 def __setitem__(self,key, value):
731 self.update({key:value})
730 self.update({key:value})
732
731
733 def clear(self, targets=None, block=False):
732 def clear(self, targets=None, block=False):
734 """Clear the remote namespaces on my engines."""
733 """Clear the remote namespaces on my engines."""
735 block = block if block is not None else self.block
734 block = block if block is not None else self.block
736 targets = targets if targets is not None else self.targets
735 targets = targets if targets is not None else self.targets
737 return self.client.clear(targets=targets, block=block)
736 return self.client.clear(targets=targets, block=block)
738
737
739 def kill(self, targets=None, block=True):
738 def kill(self, targets=None, block=True):
740 """Kill my engines."""
739 """Kill my engines."""
741 block = block if block is not None else self.block
740 block = block if block is not None else self.block
742 targets = targets if targets is not None else self.targets
741 targets = targets if targets is not None else self.targets
743 return self.client.kill(targets=targets, block=block)
742 return self.client.kill(targets=targets, block=block)
744
743
745 #----------------------------------------
744 #----------------------------------------
746 # activate for %px,%autopx magics
745 # activate for %px,%autopx magics
747 #----------------------------------------
746 #----------------------------------------
748 def activate(self):
747 def activate(self):
749 """Make this `View` active for parallel magic commands.
748 """Make this `View` active for parallel magic commands.
750
749
751 IPython has a magic command syntax to work with `MultiEngineClient` objects.
750 IPython has a magic command syntax to work with `MultiEngineClient` objects.
752 In a given IPython session there is a single active one. While
751 In a given IPython session there is a single active one. While
753 there can be many `Views` created and used by the user,
752 there can be many `Views` created and used by the user,
754 there is only one active one. The active `View` is used whenever
753 there is only one active one. The active `View` is used whenever
755 the magic commands %px and %autopx are used.
754 the magic commands %px and %autopx are used.
756
755
757 The activate() method is called on a given `View` to make it
756 The activate() method is called on a given `View` to make it
758 active. Once this has been done, the magic commands can be used.
757 active. Once this has been done, the magic commands can be used.
759 """
758 """
760
759
761 try:
760 try:
762 # This is injected into __builtins__.
761 # This is injected into __builtins__.
763 ip = get_ipython()
762 ip = get_ipython()
764 except NameError:
763 except NameError:
765 print "The IPython parallel magics (%result, %px, %autopx) only work within IPython."
764 print "The IPython parallel magics (%result, %px, %autopx) only work within IPython."
766 else:
765 else:
767 pmagic = ip.plugin_manager.get_plugin('parallelmagic')
766 pmagic = ip.plugin_manager.get_plugin('parallelmagic')
768 if pmagic is None:
767 if pmagic is None:
769 ip.magic_load_ext('parallelmagic')
768 ip.magic_load_ext('parallelmagic')
770 pmagic = ip.plugin_manager.get_plugin('parallelmagic')
769 pmagic = ip.plugin_manager.get_plugin('parallelmagic')
771
770
772 pmagic.active_view = self
771 pmagic.active_view = self
773
772
774
773
775 @testdec.skip_doctest
774 @skip_doctest
776 class LoadBalancedView(View):
775 class LoadBalancedView(View):
777 """An load-balancing View that only executes via the Task scheduler.
776 """An load-balancing View that only executes via the Task scheduler.
778
777
779 Load-balanced views can be created with the client's `view` method:
778 Load-balanced views can be created with the client's `view` method:
780
779
781 >>> v = client.load_balanced_view()
780 >>> v = client.load_balanced_view()
782
781
783 or targets can be specified, to restrict the potential destinations:
782 or targets can be specified, to restrict the potential destinations:
784
783
785 >>> v = client.client.load_balanced_view(([1,3])
784 >>> v = client.client.load_balanced_view(([1,3])
786
785
787 which would restrict loadbalancing to between engines 1 and 3.
786 which would restrict loadbalancing to between engines 1 and 3.
788
787
789 """
788 """
790
789
791 follow=Any()
790 follow=Any()
792 after=Any()
791 after=Any()
793 timeout=CFloat()
792 timeout=CFloat()
794 retries = CInt(0)
793 retries = CInt(0)
795
794
796 _task_scheme = Any()
795 _task_scheme = Any()
797 _flag_names = List(['targets', 'block', 'track', 'follow', 'after', 'timeout', 'retries'])
796 _flag_names = List(['targets', 'block', 'track', 'follow', 'after', 'timeout', 'retries'])
798
797
799 def __init__(self, client=None, socket=None, **flags):
798 def __init__(self, client=None, socket=None, **flags):
800 super(LoadBalancedView, self).__init__(client=client, socket=socket, **flags)
799 super(LoadBalancedView, self).__init__(client=client, socket=socket, **flags)
801 self._task_scheme=client._task_scheme
800 self._task_scheme=client._task_scheme
802
801
803 def _validate_dependency(self, dep):
802 def _validate_dependency(self, dep):
804 """validate a dependency.
803 """validate a dependency.
805
804
806 For use in `set_flags`.
805 For use in `set_flags`.
807 """
806 """
808 if dep is None or isinstance(dep, (str, AsyncResult, Dependency)):
807 if dep is None or isinstance(dep, (str, AsyncResult, Dependency)):
809 return True
808 return True
810 elif isinstance(dep, (list,set, tuple)):
809 elif isinstance(dep, (list,set, tuple)):
811 for d in dep:
810 for d in dep:
812 if not isinstance(d, (str, AsyncResult)):
811 if not isinstance(d, (str, AsyncResult)):
813 return False
812 return False
814 elif isinstance(dep, dict):
813 elif isinstance(dep, dict):
815 if set(dep.keys()) != set(Dependency().as_dict().keys()):
814 if set(dep.keys()) != set(Dependency().as_dict().keys()):
816 return False
815 return False
817 if not isinstance(dep['msg_ids'], list):
816 if not isinstance(dep['msg_ids'], list):
818 return False
817 return False
819 for d in dep['msg_ids']:
818 for d in dep['msg_ids']:
820 if not isinstance(d, str):
819 if not isinstance(d, str):
821 return False
820 return False
822 else:
821 else:
823 return False
822 return False
824
823
825 return True
824 return True
826
825
827 def _render_dependency(self, dep):
826 def _render_dependency(self, dep):
828 """helper for building jsonable dependencies from various input forms."""
827 """helper for building jsonable dependencies from various input forms."""
829 if isinstance(dep, Dependency):
828 if isinstance(dep, Dependency):
830 return dep.as_dict()
829 return dep.as_dict()
831 elif isinstance(dep, AsyncResult):
830 elif isinstance(dep, AsyncResult):
832 return dep.msg_ids
831 return dep.msg_ids
833 elif dep is None:
832 elif dep is None:
834 return []
833 return []
835 else:
834 else:
836 # pass to Dependency constructor
835 # pass to Dependency constructor
837 return list(Dependency(dep))
836 return list(Dependency(dep))
838
837
839 def set_flags(self, **kwargs):
838 def set_flags(self, **kwargs):
840 """set my attribute flags by keyword.
839 """set my attribute flags by keyword.
841
840
842 A View is a wrapper for the Client's apply method, but with attributes
841 A View is a wrapper for the Client's apply method, but with attributes
843 that specify keyword arguments, those attributes can be set by keyword
842 that specify keyword arguments, those attributes can be set by keyword
844 argument with this method.
843 argument with this method.
845
844
846 Parameters
845 Parameters
847 ----------
846 ----------
848
847
849 block : bool
848 block : bool
850 whether to wait for results
849 whether to wait for results
851 track : bool
850 track : bool
852 whether to create a MessageTracker to allow the user to
851 whether to create a MessageTracker to allow the user to
853 safely edit after arrays and buffers during non-copying
852 safely edit after arrays and buffers during non-copying
854 sends.
853 sends.
855
854
856 after : Dependency or collection of msg_ids
855 after : Dependency or collection of msg_ids
857 Only for load-balanced execution (targets=None)
856 Only for load-balanced execution (targets=None)
858 Specify a list of msg_ids as a time-based dependency.
857 Specify a list of msg_ids as a time-based dependency.
859 This job will only be run *after* the dependencies
858 This job will only be run *after* the dependencies
860 have been met.
859 have been met.
861
860
862 follow : Dependency or collection of msg_ids
861 follow : Dependency or collection of msg_ids
863 Only for load-balanced execution (targets=None)
862 Only for load-balanced execution (targets=None)
864 Specify a list of msg_ids as a location-based dependency.
863 Specify a list of msg_ids as a location-based dependency.
865 This job will only be run on an engine where this dependency
864 This job will only be run on an engine where this dependency
866 is met.
865 is met.
867
866
868 timeout : float/int or None
867 timeout : float/int or None
869 Only for load-balanced execution (targets=None)
868 Only for load-balanced execution (targets=None)
870 Specify an amount of time (in seconds) for the scheduler to
869 Specify an amount of time (in seconds) for the scheduler to
871 wait for dependencies to be met before failing with a
870 wait for dependencies to be met before failing with a
872 DependencyTimeout.
871 DependencyTimeout.
873
872
874 retries : int
873 retries : int
875 Number of times a task will be retried on failure.
874 Number of times a task will be retried on failure.
876 """
875 """
877
876
878 super(LoadBalancedView, self).set_flags(**kwargs)
877 super(LoadBalancedView, self).set_flags(**kwargs)
879 for name in ('follow', 'after'):
878 for name in ('follow', 'after'):
880 if name in kwargs:
879 if name in kwargs:
881 value = kwargs[name]
880 value = kwargs[name]
882 if self._validate_dependency(value):
881 if self._validate_dependency(value):
883 setattr(self, name, value)
882 setattr(self, name, value)
884 else:
883 else:
885 raise ValueError("Invalid dependency: %r"%value)
884 raise ValueError("Invalid dependency: %r"%value)
886 if 'timeout' in kwargs:
885 if 'timeout' in kwargs:
887 t = kwargs['timeout']
886 t = kwargs['timeout']
888 if not isinstance(t, (int, long, float, type(None))):
887 if not isinstance(t, (int, long, float, type(None))):
889 raise TypeError("Invalid type for timeout: %r"%type(t))
888 raise TypeError("Invalid type for timeout: %r"%type(t))
890 if t is not None:
889 if t is not None:
891 if t < 0:
890 if t < 0:
892 raise ValueError("Invalid timeout: %s"%t)
891 raise ValueError("Invalid timeout: %s"%t)
893 self.timeout = t
892 self.timeout = t
894
893
895 @sync_results
894 @sync_results
896 @save_ids
895 @save_ids
897 def _really_apply(self, f, args=None, kwargs=None, block=None, track=None,
896 def _really_apply(self, f, args=None, kwargs=None, block=None, track=None,
898 after=None, follow=None, timeout=None,
897 after=None, follow=None, timeout=None,
899 targets=None, retries=None):
898 targets=None, retries=None):
900 """calls f(*args, **kwargs) on a remote engine, returning the result.
899 """calls f(*args, **kwargs) on a remote engine, returning the result.
901
900
902 This method temporarily sets all of `apply`'s flags for a single call.
901 This method temporarily sets all of `apply`'s flags for a single call.
903
902
904 Parameters
903 Parameters
905 ----------
904 ----------
906
905
907 f : callable
906 f : callable
908
907
909 args : list [default: empty]
908 args : list [default: empty]
910
909
911 kwargs : dict [default: empty]
910 kwargs : dict [default: empty]
912
911
913 block : bool [default: self.block]
912 block : bool [default: self.block]
914 whether to block
913 whether to block
915 track : bool [default: self.track]
914 track : bool [default: self.track]
916 whether to ask zmq to track the message, for safe non-copying sends
915 whether to ask zmq to track the message, for safe non-copying sends
917
916
918 !!!!!! TODO: THE REST HERE !!!!
917 !!!!!! TODO: THE REST HERE !!!!
919
918
920 Returns
919 Returns
921 -------
920 -------
922
921
923 if self.block is False:
922 if self.block is False:
924 returns AsyncResult
923 returns AsyncResult
925 else:
924 else:
926 returns actual result of f(*args, **kwargs) on the engine(s)
925 returns actual result of f(*args, **kwargs) on the engine(s)
927 This will be a list of self.targets is also a list (even length 1), or
926 This will be a list of self.targets is also a list (even length 1), or
928 the single result if self.targets is an integer engine id
927 the single result if self.targets is an integer engine id
929 """
928 """
930
929
931 # validate whether we can run
930 # validate whether we can run
932 if self._socket.closed:
931 if self._socket.closed:
933 msg = "Task farming is disabled"
932 msg = "Task farming is disabled"
934 if self._task_scheme == 'pure':
933 if self._task_scheme == 'pure':
935 msg += " because the pure ZMQ scheduler cannot handle"
934 msg += " because the pure ZMQ scheduler cannot handle"
936 msg += " disappearing engines."
935 msg += " disappearing engines."
937 raise RuntimeError(msg)
936 raise RuntimeError(msg)
938
937
939 if self._task_scheme == 'pure':
938 if self._task_scheme == 'pure':
940 # pure zmq scheme doesn't support extra features
939 # pure zmq scheme doesn't support extra features
941 msg = "Pure ZMQ scheduler doesn't support the following flags:"
940 msg = "Pure ZMQ scheduler doesn't support the following flags:"
942 "follow, after, retries, targets, timeout"
941 "follow, after, retries, targets, timeout"
943 if (follow or after or retries or targets or timeout):
942 if (follow or after or retries or targets or timeout):
944 # hard fail on Scheduler flags
943 # hard fail on Scheduler flags
945 raise RuntimeError(msg)
944 raise RuntimeError(msg)
946 if isinstance(f, dependent):
945 if isinstance(f, dependent):
947 # soft warn on functional dependencies
946 # soft warn on functional dependencies
948 warnings.warn(msg, RuntimeWarning)
947 warnings.warn(msg, RuntimeWarning)
949
948
950 # build args
949 # build args
951 args = [] if args is None else args
950 args = [] if args is None else args
952 kwargs = {} if kwargs is None else kwargs
951 kwargs = {} if kwargs is None else kwargs
953 block = self.block if block is None else block
952 block = self.block if block is None else block
954 track = self.track if track is None else track
953 track = self.track if track is None else track
955 after = self.after if after is None else after
954 after = self.after if after is None else after
956 retries = self.retries if retries is None else retries
955 retries = self.retries if retries is None else retries
957 follow = self.follow if follow is None else follow
956 follow = self.follow if follow is None else follow
958 timeout = self.timeout if timeout is None else timeout
957 timeout = self.timeout if timeout is None else timeout
959 targets = self.targets if targets is None else targets
958 targets = self.targets if targets is None else targets
960
959
961 if not isinstance(retries, int):
960 if not isinstance(retries, int):
962 raise TypeError('retries must be int, not %r'%type(retries))
961 raise TypeError('retries must be int, not %r'%type(retries))
963
962
964 if targets is None:
963 if targets is None:
965 idents = []
964 idents = []
966 else:
965 else:
967 idents = self.client._build_targets(targets)[0]
966 idents = self.client._build_targets(targets)[0]
968
967
969 after = self._render_dependency(after)
968 after = self._render_dependency(after)
970 follow = self._render_dependency(follow)
969 follow = self._render_dependency(follow)
971 subheader = dict(after=after, follow=follow, timeout=timeout, targets=idents, retries=retries)
970 subheader = dict(after=after, follow=follow, timeout=timeout, targets=idents, retries=retries)
972
971
973 msg = self.client.send_apply_message(self._socket, f, args, kwargs, track=track,
972 msg = self.client.send_apply_message(self._socket, f, args, kwargs, track=track,
974 subheader=subheader)
973 subheader=subheader)
975 tracker = None if track is False else msg['tracker']
974 tracker = None if track is False else msg['tracker']
976
975
977 ar = AsyncResult(self.client, msg['msg_id'], fname=f.__name__, targets=None, tracker=tracker)
976 ar = AsyncResult(self.client, msg['msg_id'], fname=f.__name__, targets=None, tracker=tracker)
978
977
979 if block:
978 if block:
980 try:
979 try:
981 return ar.get()
980 return ar.get()
982 except KeyboardInterrupt:
981 except KeyboardInterrupt:
983 pass
982 pass
984 return ar
983 return ar
985
984
986 @spin_after
985 @spin_after
987 @save_ids
986 @save_ids
988 def map(self, f, *sequences, **kwargs):
987 def map(self, f, *sequences, **kwargs):
989 """view.map(f, *sequences, block=self.block, chunksize=1) => list|AsyncMapResult
988 """view.map(f, *sequences, block=self.block, chunksize=1) => list|AsyncMapResult
990
989
991 Parallel version of builtin `map`, load-balanced by this View.
990 Parallel version of builtin `map`, load-balanced by this View.
992
991
993 `block`, and `chunksize` can be specified by keyword only.
992 `block`, and `chunksize` can be specified by keyword only.
994
993
995 Each `chunksize` elements will be a separate task, and will be
994 Each `chunksize` elements will be a separate task, and will be
996 load-balanced. This lets individual elements be available for iteration
995 load-balanced. This lets individual elements be available for iteration
997 as soon as they arrive.
996 as soon as they arrive.
998
997
999 Parameters
998 Parameters
1000 ----------
999 ----------
1001
1000
1002 f : callable
1001 f : callable
1003 function to be mapped
1002 function to be mapped
1004 *sequences: one or more sequences of matching length
1003 *sequences: one or more sequences of matching length
1005 the sequences to be distributed and passed to `f`
1004 the sequences to be distributed and passed to `f`
1006 block : bool
1005 block : bool
1007 whether to wait for the result or not [default self.block]
1006 whether to wait for the result or not [default self.block]
1008 track : bool
1007 track : bool
1009 whether to create a MessageTracker to allow the user to
1008 whether to create a MessageTracker to allow the user to
1010 safely edit after arrays and buffers during non-copying
1009 safely edit after arrays and buffers during non-copying
1011 sends.
1010 sends.
1012 chunksize : int
1011 chunksize : int
1013 how many elements should be in each task [default 1]
1012 how many elements should be in each task [default 1]
1014
1013
1015 Returns
1014 Returns
1016 -------
1015 -------
1017
1016
1018 if block=False:
1017 if block=False:
1019 AsyncMapResult
1018 AsyncMapResult
1020 An object like AsyncResult, but which reassembles the sequence of results
1019 An object like AsyncResult, but which reassembles the sequence of results
1021 into a single list. AsyncMapResults can be iterated through before all
1020 into a single list. AsyncMapResults can be iterated through before all
1022 results are complete.
1021 results are complete.
1023 else:
1022 else:
1024 the result of map(f,*sequences)
1023 the result of map(f,*sequences)
1025
1024
1026 """
1025 """
1027
1026
1028 # default
1027 # default
1029 block = kwargs.get('block', self.block)
1028 block = kwargs.get('block', self.block)
1030 chunksize = kwargs.get('chunksize', 1)
1029 chunksize = kwargs.get('chunksize', 1)
1031
1030
1032 keyset = set(kwargs.keys())
1031 keyset = set(kwargs.keys())
1033 extra_keys = keyset.difference_update(set(['block', 'chunksize']))
1032 extra_keys = keyset.difference_update(set(['block', 'chunksize']))
1034 if extra_keys:
1033 if extra_keys:
1035 raise TypeError("Invalid kwargs: %s"%list(extra_keys))
1034 raise TypeError("Invalid kwargs: %s"%list(extra_keys))
1036
1035
1037 assert len(sequences) > 0, "must have some sequences to map onto!"
1036 assert len(sequences) > 0, "must have some sequences to map onto!"
1038
1037
1039 pf = ParallelFunction(self, f, block=block, chunksize=chunksize)
1038 pf = ParallelFunction(self, f, block=block, chunksize=chunksize)
1040 return pf.map(*sequences)
1039 return pf.map(*sequences)
1041
1040
1042 __all__ = ['LoadBalancedView', 'DirectView'] No newline at end of file
1041 __all__ = ['LoadBalancedView', 'DirectView']
@@ -1,327 +1,320 b''
1 """Decorators for labeling test objects.
1 """Decorators for labeling test objects.
2
2
3 Decorators that merely return a modified version of the original function
3 Decorators that merely return a modified version of the original function
4 object are straightforward. Decorators that return a new function object need
4 object are straightforward. Decorators that return a new function object need
5 to use nose.tools.make_decorator(original_function)(decorator) in returning the
5 to use nose.tools.make_decorator(original_function)(decorator) in returning the
6 decorator, in order to preserve metadata such as function name, setup and
6 decorator, in order to preserve metadata such as function name, setup and
7 teardown functions and so on - see nose.tools for more information.
7 teardown functions and so on - see nose.tools for more information.
8
8
9 This module provides a set of useful decorators meant to be ready to use in
9 This module provides a set of useful decorators meant to be ready to use in
10 your own tests. See the bottom of the file for the ready-made ones, and if you
10 your own tests. See the bottom of the file for the ready-made ones, and if you
11 find yourself writing a new one that may be of generic use, add it here.
11 find yourself writing a new one that may be of generic use, add it here.
12
12
13 Included decorators:
13 Included decorators:
14
14
15
15
16 Lightweight testing that remains unittest-compatible.
16 Lightweight testing that remains unittest-compatible.
17
17
18 - @parametric, for parametric test support that is vastly easier to use than
18 - @parametric, for parametric test support that is vastly easier to use than
19 nose's for debugging. With ours, if a test fails, the stack under inspection
19 nose's for debugging. With ours, if a test fails, the stack under inspection
20 is that of the test and not that of the test framework.
20 is that of the test and not that of the test framework.
21
21
22 - An @as_unittest decorator can be used to tag any normal parameter-less
22 - An @as_unittest decorator can be used to tag any normal parameter-less
23 function as a unittest TestCase. Then, both nose and normal unittest will
23 function as a unittest TestCase. Then, both nose and normal unittest will
24 recognize it as such. This will make it easier to migrate away from Nose if
24 recognize it as such. This will make it easier to migrate away from Nose if
25 we ever need/want to while maintaining very lightweight tests.
25 we ever need/want to while maintaining very lightweight tests.
26
26
27 NOTE: This file contains IPython-specific decorators. Using the machinery in
27 NOTE: This file contains IPython-specific decorators. Using the machinery in
28 IPython.external.decorators, we import either numpy.testing.decorators if numpy is
28 IPython.external.decorators, we import either numpy.testing.decorators if numpy is
29 available, OR use equivalent code in IPython.external._decorators, which
29 available, OR use equivalent code in IPython.external._decorators, which
30 we've copied verbatim from numpy.
30 we've copied verbatim from numpy.
31
31
32 Authors
32 Authors
33 -------
33 -------
34
34
35 - Fernando Perez <Fernando.Perez@berkeley.edu>
35 - Fernando Perez <Fernando.Perez@berkeley.edu>
36 """
36 """
37
37
38 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
39 # Copyright (C) 2009-2010 The IPython Development Team
39 # Copyright (C) 2009-2010 The IPython Development Team
40 #
40 #
41 # Distributed under the terms of the BSD License. The full license is in
41 # Distributed under the terms of the BSD License. The full license is in
42 # the file COPYING, distributed as part of this software.
42 # the file COPYING, distributed as part of this software.
43 #-----------------------------------------------------------------------------
43 #-----------------------------------------------------------------------------
44
44
45 #-----------------------------------------------------------------------------
45 #-----------------------------------------------------------------------------
46 # Imports
46 # Imports
47 #-----------------------------------------------------------------------------
47 #-----------------------------------------------------------------------------
48
48
49 # Stdlib imports
49 # Stdlib imports
50 import inspect
50 import inspect
51 import sys
51 import sys
52 import unittest
52 import unittest
53
53
54 # Third-party imports
54 # Third-party imports
55
55
56 # This is Michele Simionato's decorator module, kept verbatim.
56 # This is Michele Simionato's decorator module, kept verbatim.
57 from IPython.external.decorator import decorator, update_wrapper
57 from IPython.external.decorator import decorator, update_wrapper
58
58
59 # We already have python3-compliant code for parametric tests
59 # We already have python3-compliant code for parametric tests
60 if sys.version[0]=='2':
60 if sys.version[0]=='2':
61 from _paramtestpy2 import parametric, ParametricTestCase
61 from _paramtestpy2 import parametric, ParametricTestCase
62 else:
62 else:
63 from _paramtestpy3 import parametric, ParametricTestCase
63 from _paramtestpy3 import parametric, ParametricTestCase
64
64
65 # Expose the unittest-driven decorators
65 # Expose the unittest-driven decorators
66 from ipunittest import ipdoctest, ipdocstring
66 from ipunittest import ipdoctest, ipdocstring
67
67
68 # Grab the numpy-specific decorators which we keep in a file that we
68 # Grab the numpy-specific decorators which we keep in a file that we
69 # occasionally update from upstream: decorators.py is a copy of
69 # occasionally update from upstream: decorators.py is a copy of
70 # numpy.testing.decorators, we expose all of it here.
70 # numpy.testing.decorators, we expose all of it here.
71 from IPython.external.decorators import *
71 from IPython.external.decorators import *
72
72
73 #-----------------------------------------------------------------------------
73 #-----------------------------------------------------------------------------
74 # Classes and functions
74 # Classes and functions
75 #-----------------------------------------------------------------------------
75 #-----------------------------------------------------------------------------
76
76
77 # Simple example of the basic idea
77 # Simple example of the basic idea
78 def as_unittest(func):
78 def as_unittest(func):
79 """Decorator to make a simple function into a normal test via unittest."""
79 """Decorator to make a simple function into a normal test via unittest."""
80 class Tester(unittest.TestCase):
80 class Tester(unittest.TestCase):
81 def test(self):
81 def test(self):
82 func()
82 func()
83
83
84 Tester.__name__ = func.__name__
84 Tester.__name__ = func.__name__
85
85
86 return Tester
86 return Tester
87
87
88 # Utility functions
88 # Utility functions
89
89
90 def apply_wrapper(wrapper,func):
90 def apply_wrapper(wrapper,func):
91 """Apply a wrapper to a function for decoration.
91 """Apply a wrapper to a function for decoration.
92
92
93 This mixes Michele Simionato's decorator tool with nose's make_decorator,
93 This mixes Michele Simionato's decorator tool with nose's make_decorator,
94 to apply a wrapper in a decorator so that all nose attributes, as well as
94 to apply a wrapper in a decorator so that all nose attributes, as well as
95 function signature and other properties, survive the decoration cleanly.
95 function signature and other properties, survive the decoration cleanly.
96 This will ensure that wrapped functions can still be well introspected via
96 This will ensure that wrapped functions can still be well introspected via
97 IPython, for example.
97 IPython, for example.
98 """
98 """
99 import nose.tools
99 import nose.tools
100
100
101 return decorator(wrapper,nose.tools.make_decorator(func)(wrapper))
101 return decorator(wrapper,nose.tools.make_decorator(func)(wrapper))
102
102
103
103
104 def make_label_dec(label,ds=None):
104 def make_label_dec(label,ds=None):
105 """Factory function to create a decorator that applies one or more labels.
105 """Factory function to create a decorator that applies one or more labels.
106
106
107 Parameters
107 Parameters
108 ----------
108 ----------
109 label : string or sequence
109 label : string or sequence
110 One or more labels that will be applied by the decorator to the functions
110 One or more labels that will be applied by the decorator to the functions
111 it decorates. Labels are attributes of the decorated function with their
111 it decorates. Labels are attributes of the decorated function with their
112 value set to True.
112 value set to True.
113
113
114 ds : string
114 ds : string
115 An optional docstring for the resulting decorator. If not given, a
115 An optional docstring for the resulting decorator. If not given, a
116 default docstring is auto-generated.
116 default docstring is auto-generated.
117
117
118 Returns
118 Returns
119 -------
119 -------
120 A decorator.
120 A decorator.
121
121
122 Examples
122 Examples
123 --------
123 --------
124
124
125 A simple labeling decorator:
125 A simple labeling decorator:
126 >>> slow = make_label_dec('slow')
126 >>> slow = make_label_dec('slow')
127 >>> print slow.__doc__
127 >>> print slow.__doc__
128 Labels a test as 'slow'.
128 Labels a test as 'slow'.
129
129
130 And one that uses multiple labels and a custom docstring:
130 And one that uses multiple labels and a custom docstring:
131 >>> rare = make_label_dec(['slow','hard'],
131 >>> rare = make_label_dec(['slow','hard'],
132 ... "Mix labels 'slow' and 'hard' for rare tests.")
132 ... "Mix labels 'slow' and 'hard' for rare tests.")
133 >>> print rare.__doc__
133 >>> print rare.__doc__
134 Mix labels 'slow' and 'hard' for rare tests.
134 Mix labels 'slow' and 'hard' for rare tests.
135
135
136 Now, let's test using this one:
136 Now, let's test using this one:
137 >>> @rare
137 >>> @rare
138 ... def f(): pass
138 ... def f(): pass
139 ...
139 ...
140 >>>
140 >>>
141 >>> f.slow
141 >>> f.slow
142 True
142 True
143 >>> f.hard
143 >>> f.hard
144 True
144 True
145 """
145 """
146
146
147 if isinstance(label,basestring):
147 if isinstance(label,basestring):
148 labels = [label]
148 labels = [label]
149 else:
149 else:
150 labels = label
150 labels = label
151
151
152 # Validate that the given label(s) are OK for use in setattr() by doing a
152 # Validate that the given label(s) are OK for use in setattr() by doing a
153 # dry run on a dummy function.
153 # dry run on a dummy function.
154 tmp = lambda : None
154 tmp = lambda : None
155 for label in labels:
155 for label in labels:
156 setattr(tmp,label,True)
156 setattr(tmp,label,True)
157
157
158 # This is the actual decorator we'll return
158 # This is the actual decorator we'll return
159 def decor(f):
159 def decor(f):
160 for label in labels:
160 for label in labels:
161 setattr(f,label,True)
161 setattr(f,label,True)
162 return f
162 return f
163
163
164 # Apply the user's docstring, or autogenerate a basic one
164 # Apply the user's docstring, or autogenerate a basic one
165 if ds is None:
165 if ds is None:
166 ds = "Labels a test as %r." % label
166 ds = "Labels a test as %r." % label
167 decor.__doc__ = ds
167 decor.__doc__ = ds
168
168
169 return decor
169 return decor
170
170
171
171
172 # Inspired by numpy's skipif, but uses the full apply_wrapper utility to
172 # Inspired by numpy's skipif, but uses the full apply_wrapper utility to
173 # preserve function metadata better and allows the skip condition to be a
173 # preserve function metadata better and allows the skip condition to be a
174 # callable.
174 # callable.
175 def skipif(skip_condition, msg=None):
175 def skipif(skip_condition, msg=None):
176 ''' Make function raise SkipTest exception if skip_condition is true
176 ''' Make function raise SkipTest exception if skip_condition is true
177
177
178 Parameters
178 Parameters
179 ----------
179 ----------
180 skip_condition : bool or callable.
180 skip_condition : bool or callable.
181 Flag to determine whether to skip test. If the condition is a
181 Flag to determine whether to skip test. If the condition is a
182 callable, it is used at runtime to dynamically make the decision. This
182 callable, it is used at runtime to dynamically make the decision. This
183 is useful for tests that may require costly imports, to delay the cost
183 is useful for tests that may require costly imports, to delay the cost
184 until the test suite is actually executed.
184 until the test suite is actually executed.
185 msg : string
185 msg : string
186 Message to give on raising a SkipTest exception
186 Message to give on raising a SkipTest exception
187
187
188 Returns
188 Returns
189 -------
189 -------
190 decorator : function
190 decorator : function
191 Decorator, which, when applied to a function, causes SkipTest
191 Decorator, which, when applied to a function, causes SkipTest
192 to be raised when the skip_condition was True, and the function
192 to be raised when the skip_condition was True, and the function
193 to be called normally otherwise.
193 to be called normally otherwise.
194
194
195 Notes
195 Notes
196 -----
196 -----
197 You will see from the code that we had to further decorate the
197 You will see from the code that we had to further decorate the
198 decorator with the nose.tools.make_decorator function in order to
198 decorator with the nose.tools.make_decorator function in order to
199 transmit function name, and various other metadata.
199 transmit function name, and various other metadata.
200 '''
200 '''
201
201
202 def skip_decorator(f):
202 def skip_decorator(f):
203 # Local import to avoid a hard nose dependency and only incur the
203 # Local import to avoid a hard nose dependency and only incur the
204 # import time overhead at actual test-time.
204 # import time overhead at actual test-time.
205 import nose
205 import nose
206
206
207 # Allow for both boolean or callable skip conditions.
207 # Allow for both boolean or callable skip conditions.
208 if callable(skip_condition):
208 if callable(skip_condition):
209 skip_val = skip_condition
209 skip_val = skip_condition
210 else:
210 else:
211 skip_val = lambda : skip_condition
211 skip_val = lambda : skip_condition
212
212
213 def get_msg(func,msg=None):
213 def get_msg(func,msg=None):
214 """Skip message with information about function being skipped."""
214 """Skip message with information about function being skipped."""
215 if msg is None: out = 'Test skipped due to test condition.'
215 if msg is None: out = 'Test skipped due to test condition.'
216 else: out = msg
216 else: out = msg
217 return "Skipping test: %s. %s" % (func.__name__,out)
217 return "Skipping test: %s. %s" % (func.__name__,out)
218
218
219 # We need to define *two* skippers because Python doesn't allow both
219 # We need to define *two* skippers because Python doesn't allow both
220 # return with value and yield inside the same function.
220 # return with value and yield inside the same function.
221 def skipper_func(*args, **kwargs):
221 def skipper_func(*args, **kwargs):
222 """Skipper for normal test functions."""
222 """Skipper for normal test functions."""
223 if skip_val():
223 if skip_val():
224 raise nose.SkipTest(get_msg(f,msg))
224 raise nose.SkipTest(get_msg(f,msg))
225 else:
225 else:
226 return f(*args, **kwargs)
226 return f(*args, **kwargs)
227
227
228 def skipper_gen(*args, **kwargs):
228 def skipper_gen(*args, **kwargs):
229 """Skipper for test generators."""
229 """Skipper for test generators."""
230 if skip_val():
230 if skip_val():
231 raise nose.SkipTest(get_msg(f,msg))
231 raise nose.SkipTest(get_msg(f,msg))
232 else:
232 else:
233 for x in f(*args, **kwargs):
233 for x in f(*args, **kwargs):
234 yield x
234 yield x
235
235
236 # Choose the right skipper to use when building the actual generator.
236 # Choose the right skipper to use when building the actual generator.
237 if nose.util.isgenerator(f):
237 if nose.util.isgenerator(f):
238 skipper = skipper_gen
238 skipper = skipper_gen
239 else:
239 else:
240 skipper = skipper_func
240 skipper = skipper_func
241
241
242 return nose.tools.make_decorator(f)(skipper)
242 return nose.tools.make_decorator(f)(skipper)
243
243
244 return skip_decorator
244 return skip_decorator
245
245
246 # A version with the condition set to true, common case just to attacha message
246 # A version with the condition set to true, common case just to attacha message
247 # to a skip decorator
247 # to a skip decorator
248 def skip(msg=None):
248 def skip(msg=None):
249 """Decorator factory - mark a test function for skipping from test suite.
249 """Decorator factory - mark a test function for skipping from test suite.
250
250
251 Parameters
251 Parameters
252 ----------
252 ----------
253 msg : string
253 msg : string
254 Optional message to be added.
254 Optional message to be added.
255
255
256 Returns
256 Returns
257 -------
257 -------
258 decorator : function
258 decorator : function
259 Decorator, which, when applied to a function, causes SkipTest
259 Decorator, which, when applied to a function, causes SkipTest
260 to be raised, with the optional message added.
260 to be raised, with the optional message added.
261 """
261 """
262
262
263 return skipif(True,msg)
263 return skipif(True,msg)
264
264
265
265
266 def onlyif(condition, msg):
266 def onlyif(condition, msg):
267 """The reverse from skipif, see skipif for details."""
267 """The reverse from skipif, see skipif for details."""
268
268
269 if callable(condition):
269 if callable(condition):
270 skip_condition = lambda : not condition()
270 skip_condition = lambda : not condition()
271 else:
271 else:
272 skip_condition = lambda : not condition
272 skip_condition = lambda : not condition
273
273
274 return skipif(skip_condition, msg)
274 return skipif(skip_condition, msg)
275
275
276 #-----------------------------------------------------------------------------
276 #-----------------------------------------------------------------------------
277 # Utility functions for decorators
277 # Utility functions for decorators
278 def module_not_available(module):
278 def module_not_available(module):
279 """Can module be imported? Returns true if module does NOT import.
279 """Can module be imported? Returns true if module does NOT import.
280
280
281 This is used to make a decorator to skip tests that require module to be
281 This is used to make a decorator to skip tests that require module to be
282 available, but delay the 'import numpy' to test execution time.
282 available, but delay the 'import numpy' to test execution time.
283 """
283 """
284 try:
284 try:
285 mod = __import__(module)
285 mod = __import__(module)
286 mod_not_avail = False
286 mod_not_avail = False
287 except ImportError:
287 except ImportError:
288 mod_not_avail = True
288 mod_not_avail = True
289
289
290 return mod_not_avail
290 return mod_not_avail
291
291
292 #-----------------------------------------------------------------------------
292 #-----------------------------------------------------------------------------
293 # Decorators for public use
293 # Decorators for public use
294
294
295 skip_doctest = make_label_dec('skip_doctest',
296 """Decorator - mark a function or method for skipping its doctest.
297
298 This decorator allows you to mark a function whose docstring you wish to
299 omit from testing, while preserving the docstring for introspection, help,
300 etc.""")
301
302 # Decorators to skip certain tests on specific platforms.
295 # Decorators to skip certain tests on specific platforms.
303 skip_win32 = skipif(sys.platform == 'win32',
296 skip_win32 = skipif(sys.platform == 'win32',
304 "This test does not run under Windows")
297 "This test does not run under Windows")
305 skip_linux = skipif(sys.platform == 'linux2',
298 skip_linux = skipif(sys.platform == 'linux2',
306 "This test does not run under Linux")
299 "This test does not run under Linux")
307 skip_osx = skipif(sys.platform == 'darwin',"This test does not run under OS X")
300 skip_osx = skipif(sys.platform == 'darwin',"This test does not run under OS X")
308
301
309
302
310 # Decorators to skip tests if not on specific platforms.
303 # Decorators to skip tests if not on specific platforms.
311 skip_if_not_win32 = skipif(sys.platform != 'win32',
304 skip_if_not_win32 = skipif(sys.platform != 'win32',
312 "This test only runs under Windows")
305 "This test only runs under Windows")
313 skip_if_not_linux = skipif(sys.platform != 'linux2',
306 skip_if_not_linux = skipif(sys.platform != 'linux2',
314 "This test only runs under Linux")
307 "This test only runs under Linux")
315 skip_if_not_osx = skipif(sys.platform != 'darwin',
308 skip_if_not_osx = skipif(sys.platform != 'darwin',
316 "This test only runs under OSX")
309 "This test only runs under OSX")
317
310
318 # Other skip decorators
311 # Other skip decorators
319 skipif_not_numpy = skipif(module_not_available('numpy'),"This test requires numpy")
312 skipif_not_numpy = skipif(module_not_available('numpy'),"This test requires numpy")
320
313
321 skipif_not_sympy = skipif(module_not_available('sympy'),"This test requires sympy")
314 skipif_not_sympy = skipif(module_not_available('sympy'),"This test requires sympy")
322
315
323 skip_known_failure = knownfailureif(True,'This test is known to fail')
316 skip_known_failure = knownfailureif(True,'This test is known to fail')
324
317
325 # A null 'decorator', useful to make more readable code that needs to pick
318 # A null 'decorator', useful to make more readable code that needs to pick
326 # between different decorators based on OS or other conditions
319 # between different decorators based on OS or other conditions
327 null_deco = lambda f: f
320 null_deco = lambda f: f
@@ -1,48 +1,46 b''
1 """Some simple tests for the plugin while running scripts.
1 """Some simple tests for the plugin while running scripts.
2 """
2 """
3 # Module imports
3 # Module imports
4 # Std lib
4 # Std lib
5 import inspect
5 import inspect
6
6
7 # Our own
7 # Our own
8 from IPython.testing import decorators as dec
9
8
10 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
11 # Testing functions
10 # Testing functions
12
11
13 def test_trivial():
12 def test_trivial():
14 """A trivial passing test."""
13 """A trivial passing test."""
15 pass
14 pass
16
15
17 def doctest_run():
16 def doctest_run():
18 """Test running a trivial script.
17 """Test running a trivial script.
19
18
20 In [13]: run simplevars.py
19 In [13]: run simplevars.py
21 x is: 1
20 x is: 1
22 """
21 """
23
22
24 def doctest_runvars():
23 def doctest_runvars():
25 """Test that variables defined in scripts get loaded correcly via %run.
24 """Test that variables defined in scripts get loaded correcly via %run.
26
25
27 In [13]: run simplevars.py
26 In [13]: run simplevars.py
28 x is: 1
27 x is: 1
29
28
30 In [14]: x
29 In [14]: x
31 Out[14]: 1
30 Out[14]: 1
32 """
31 """
33
32
34 def doctest_ivars():
33 def doctest_ivars():
35 """Test that variables defined interactively are picked up.
34 """Test that variables defined interactively are picked up.
36 In [5]: zz=1
35 In [5]: zz=1
37
36
38 In [6]: zz
37 In [6]: zz
39 Out[6]: 1
38 Out[6]: 1
40 """
39 """
41
40
42 #@dec.skip_doctest
43 def doctest_refs():
41 def doctest_refs():
44 """DocTest reference holding issues when running scripts.
42 """DocTest reference holding issues when running scripts.
45
43
46 In [32]: run show_refs.py
44 In [32]: run show_refs.py
47 c referrers: [<type 'dict'>]
45 c referrers: [<type 'dict'>]
48 """
46 """
@@ -1,187 +1,188 b''
1 """Tests for the decorators we've created for IPython.
1 """Tests for the decorators we've created for IPython.
2 """
2 """
3
3
4 # Module imports
4 # Module imports
5 # Std lib
5 # Std lib
6 import inspect
6 import inspect
7 import sys
7 import sys
8 import unittest
8 import unittest
9
9
10 # Third party
10 # Third party
11 import nose.tools as nt
11 import nose.tools as nt
12
12
13 # Our own
13 # Our own
14 from IPython.testing import decorators as dec
14 from IPython.testing import decorators as dec
15 from IPython.testing.skipdoctest import skip_doctest
15 from IPython.testing.ipunittest import ParametricTestCase
16 from IPython.testing.ipunittest import ParametricTestCase
16
17
17 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
18 # Utilities
19 # Utilities
19
20
20 # Note: copied from OInspect, kept here so the testing stuff doesn't create
21 # Note: copied from OInspect, kept here so the testing stuff doesn't create
21 # circular dependencies and is easier to reuse.
22 # circular dependencies and is easier to reuse.
22 def getargspec(obj):
23 def getargspec(obj):
23 """Get the names and default values of a function's arguments.
24 """Get the names and default values of a function's arguments.
24
25
25 A tuple of four things is returned: (args, varargs, varkw, defaults).
26 A tuple of four things is returned: (args, varargs, varkw, defaults).
26 'args' is a list of the argument names (it may contain nested lists).
27 'args' is a list of the argument names (it may contain nested lists).
27 'varargs' and 'varkw' are the names of the * and ** arguments or None.
28 'varargs' and 'varkw' are the names of the * and ** arguments or None.
28 'defaults' is an n-tuple of the default values of the last n arguments.
29 'defaults' is an n-tuple of the default values of the last n arguments.
29
30
30 Modified version of inspect.getargspec from the Python Standard
31 Modified version of inspect.getargspec from the Python Standard
31 Library."""
32 Library."""
32
33
33 if inspect.isfunction(obj):
34 if inspect.isfunction(obj):
34 func_obj = obj
35 func_obj = obj
35 elif inspect.ismethod(obj):
36 elif inspect.ismethod(obj):
36 func_obj = obj.im_func
37 func_obj = obj.im_func
37 else:
38 else:
38 raise TypeError, 'arg is not a Python function'
39 raise TypeError, 'arg is not a Python function'
39 args, varargs, varkw = inspect.getargs(func_obj.func_code)
40 args, varargs, varkw = inspect.getargs(func_obj.func_code)
40 return args, varargs, varkw, func_obj.func_defaults
41 return args, varargs, varkw, func_obj.func_defaults
41
42
42 #-----------------------------------------------------------------------------
43 #-----------------------------------------------------------------------------
43 # Testing functions
44 # Testing functions
44
45
45 @dec.as_unittest
46 @dec.as_unittest
46 def trivial():
47 def trivial():
47 """A trivial test"""
48 """A trivial test"""
48 pass
49 pass
49
50
50 # Some examples of parametric tests.
51 # Some examples of parametric tests.
51
52
52 def is_smaller(i,j):
53 def is_smaller(i,j):
53 assert i<j,"%s !< %s" % (i,j)
54 assert i<j,"%s !< %s" % (i,j)
54
55
55 class Tester(ParametricTestCase):
56 class Tester(ParametricTestCase):
56
57
57 def test_parametric(self):
58 def test_parametric(self):
58 yield is_smaller(3, 4)
59 yield is_smaller(3, 4)
59 x, y = 1, 2
60 x, y = 1, 2
60 yield is_smaller(x, y)
61 yield is_smaller(x, y)
61
62
62 @dec.parametric
63 @dec.parametric
63 def test_par_standalone():
64 def test_par_standalone():
64 yield is_smaller(3, 4)
65 yield is_smaller(3, 4)
65 x, y = 1, 2
66 x, y = 1, 2
66 yield is_smaller(x, y)
67 yield is_smaller(x, y)
67
68
68
69
69 @dec.skip
70 @dec.skip
70 def test_deliberately_broken():
71 def test_deliberately_broken():
71 """A deliberately broken test - we want to skip this one."""
72 """A deliberately broken test - we want to skip this one."""
72 1/0
73 1/0
73
74
74 @dec.skip('Testing the skip decorator')
75 @dec.skip('Testing the skip decorator')
75 def test_deliberately_broken2():
76 def test_deliberately_broken2():
76 """Another deliberately broken test - we want to skip this one."""
77 """Another deliberately broken test - we want to skip this one."""
77 1/0
78 1/0
78
79
79
80
80 # Verify that we can correctly skip the doctest for a function at will, but
81 # Verify that we can correctly skip the doctest for a function at will, but
81 # that the docstring itself is NOT destroyed by the decorator.
82 # that the docstring itself is NOT destroyed by the decorator.
82 @dec.skip_doctest
83 @skip_doctest
83 def doctest_bad(x,y=1,**k):
84 def doctest_bad(x,y=1,**k):
84 """A function whose doctest we need to skip.
85 """A function whose doctest we need to skip.
85
86
86 >>> 1+1
87 >>> 1+1
87 3
88 3
88 """
89 """
89 print 'x:',x
90 print 'x:',x
90 print 'y:',y
91 print 'y:',y
91 print 'k:',k
92 print 'k:',k
92
93
93
94
94 def call_doctest_bad():
95 def call_doctest_bad():
95 """Check that we can still call the decorated functions.
96 """Check that we can still call the decorated functions.
96
97
97 >>> doctest_bad(3,y=4)
98 >>> doctest_bad(3,y=4)
98 x: 3
99 x: 3
99 y: 4
100 y: 4
100 k: {}
101 k: {}
101 """
102 """
102 pass
103 pass
103
104
104
105
105 def test_skip_dt_decorator():
106 def test_skip_dt_decorator():
106 """Doctest-skipping decorator should preserve the docstring.
107 """Doctest-skipping decorator should preserve the docstring.
107 """
108 """
108 # Careful: 'check' must be a *verbatim* copy of the doctest_bad docstring!
109 # Careful: 'check' must be a *verbatim* copy of the doctest_bad docstring!
109 check = """A function whose doctest we need to skip.
110 check = """A function whose doctest we need to skip.
110
111
111 >>> 1+1
112 >>> 1+1
112 3
113 3
113 """
114 """
114 # Fetch the docstring from doctest_bad after decoration.
115 # Fetch the docstring from doctest_bad after decoration.
115 val = doctest_bad.__doc__
116 val = doctest_bad.__doc__
116
117
117 nt.assert_equal(check,val,"doctest_bad docstrings don't match")
118 nt.assert_equal(check,val,"doctest_bad docstrings don't match")
118
119
119
120
120 # Doctest skipping should work for class methods too
121 # Doctest skipping should work for class methods too
121 class FooClass(object):
122 class FooClass(object):
122 """FooClass
123 """FooClass
123
124
124 Example:
125 Example:
125
126
126 >>> 1+1
127 >>> 1+1
127 2
128 2
128 """
129 """
129
130
130 @dec.skip_doctest
131 @skip_doctest
131 def __init__(self,x):
132 def __init__(self,x):
132 """Make a FooClass.
133 """Make a FooClass.
133
134
134 Example:
135 Example:
135
136
136 >>> f = FooClass(3)
137 >>> f = FooClass(3)
137 junk
138 junk
138 """
139 """
139 print 'Making a FooClass.'
140 print 'Making a FooClass.'
140 self.x = x
141 self.x = x
141
142
142 @dec.skip_doctest
143 @skip_doctest
143 def bar(self,y):
144 def bar(self,y):
144 """Example:
145 """Example:
145
146
146 >>> ff = FooClass(3)
147 >>> ff = FooClass(3)
147 >>> ff.bar(0)
148 >>> ff.bar(0)
148 boom!
149 boom!
149 >>> 1/0
150 >>> 1/0
150 bam!
151 bam!
151 """
152 """
152 return 1/y
153 return 1/y
153
154
154 def baz(self,y):
155 def baz(self,y):
155 """Example:
156 """Example:
156
157
157 >>> ff2 = FooClass(3)
158 >>> ff2 = FooClass(3)
158 Making a FooClass.
159 Making a FooClass.
159 >>> ff2.baz(3)
160 >>> ff2.baz(3)
160 True
161 True
161 """
162 """
162 return self.x==y
163 return self.x==y
163
164
164
165
165 def test_skip_dt_decorator2():
166 def test_skip_dt_decorator2():
166 """Doctest-skipping decorator should preserve function signature.
167 """Doctest-skipping decorator should preserve function signature.
167 """
168 """
168 # Hardcoded correct answer
169 # Hardcoded correct answer
169 dtargs = (['x', 'y'], None, 'k', (1,))
170 dtargs = (['x', 'y'], None, 'k', (1,))
170 # Introspect out the value
171 # Introspect out the value
171 dtargsr = getargspec(doctest_bad)
172 dtargsr = getargspec(doctest_bad)
172 assert dtargsr==dtargs, \
173 assert dtargsr==dtargs, \
173 "Incorrectly reconstructed args for doctest_bad: %s" % (dtargsr,)
174 "Incorrectly reconstructed args for doctest_bad: %s" % (dtargsr,)
174
175
175
176
176 @dec.skip_linux
177 @dec.skip_linux
177 def test_linux():
178 def test_linux():
178 nt.assert_not_equals(sys.platform,'linux2',"This test can't run under linux")
179 nt.assert_not_equals(sys.platform,'linux2',"This test can't run under linux")
179
180
180 @dec.skip_win32
181 @dec.skip_win32
181 def test_win32():
182 def test_win32():
182 nt.assert_not_equals(sys.platform,'win32',"This test can't run under windows")
183 nt.assert_not_equals(sys.platform,'win32',"This test can't run under windows")
183
184
184 @dec.skip_osx
185 @dec.skip_osx
185 def test_osx():
186 def test_osx():
186 nt.assert_not_equals(sys.platform,'darwin',"This test can't run under osx")
187 nt.assert_not_equals(sys.platform,'darwin',"This test can't run under osx")
187
188
General Comments 0
You need to be logged in to leave comments. Login now