##// 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 1 """ History related magics and functionality """
2 2 #-----------------------------------------------------------------------------
3 3 # Copyright (C) 2010 The IPython Development Team.
4 4 #
5 5 # Distributed under the terms of the BSD License.
6 6 #
7 7 # The full license is in the file COPYING.txt, distributed with this software.
8 8 #-----------------------------------------------------------------------------
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Imports
12 12 #-----------------------------------------------------------------------------
13 13 from __future__ import print_function
14 14
15 15 # Stdlib imports
16 16 import atexit
17 17 import datetime
18 18 import os
19 19 import re
20 20 import sqlite3
21 21 import threading
22 22
23 23 # Our own packages
24 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 27 from IPython.utils import io
28 28 from IPython.utils.traitlets import Bool, Dict, Instance, Int, List, Unicode
29 29 from IPython.utils.warn import warn
30 30
31 31 #-----------------------------------------------------------------------------
32 32 # Classes and functions
33 33 #-----------------------------------------------------------------------------
34 34
35 35 class HistoryManager(Configurable):
36 36 """A class to organize all history-related functionality in one place.
37 37 """
38 38 # Public interface
39 39
40 40 # An instance of the IPython shell we are attached to
41 41 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
42 42 # Lists to hold processed and raw history. These start with a blank entry
43 43 # so that we can index them starting from 1
44 44 input_hist_parsed = List([""])
45 45 input_hist_raw = List([""])
46 46 # A list of directories visited during session
47 47 dir_hist = List()
48 48 def _dir_hist_default(self):
49 49 try:
50 50 return [os.getcwd()]
51 51 except OSError:
52 52 return []
53 53
54 54 # A dict of output history, keyed with ints from the shell's
55 55 # execution count.
56 56 output_hist = Dict()
57 57 # The text/plain repr of outputs.
58 58 output_hist_reprs = Dict()
59 59
60 60 # String holding the path to the history file
61 61 hist_file = Unicode(config=True)
62 62
63 63 # The SQLite database
64 64 db = Instance(sqlite3.Connection)
65 65 # The number of the current session in the history database
66 66 session_number = Int()
67 67 # Should we log output to the database? (default no)
68 68 db_log_output = Bool(False, config=True)
69 69 # Write to database every x commands (higher values save disk access & power)
70 70 # Values of 1 or less effectively disable caching.
71 71 db_cache_size = Int(0, config=True)
72 72 # The input and output caches
73 73 db_input_cache = List()
74 74 db_output_cache = List()
75 75
76 76 # History saving in separate thread
77 77 save_thread = Instance('IPython.core.history.HistorySavingThread')
78 78 # N.B. Event is a function returning an instance of _Event.
79 79 save_flag = Instance(threading._Event)
80 80
81 81 # Private interface
82 82 # Variables used to store the three last inputs from the user. On each new
83 83 # history update, we populate the user's namespace with these, shifted as
84 84 # necessary.
85 85 _i00 = Unicode(u'')
86 86 _i = Unicode(u'')
87 87 _ii = Unicode(u'')
88 88 _iii = Unicode(u'')
89 89
90 90 # A regex matching all forms of the exit command, so that we don't store
91 91 # them in the history (it's annoying to rewind the first entry and land on
92 92 # an exit call).
93 93 _exit_re = re.compile(r"(exit|quit)(\s*\(.*\))?$")
94 94
95 95 def __init__(self, shell, config=None, **traits):
96 96 """Create a new history manager associated with a shell instance.
97 97 """
98 98 # We need a pointer back to the shell for various tasks.
99 99 super(HistoryManager, self).__init__(shell=shell, config=config,
100 100 **traits)
101 101
102 102 if self.hist_file == u'':
103 103 # No one has set the hist_file, yet.
104 104 if shell.profile:
105 105 histfname = 'history-%s' % shell.profile
106 106 else:
107 107 histfname = 'history'
108 108 self.hist_file = os.path.join(shell.ipython_dir, histfname + '.sqlite')
109 109
110 110 try:
111 111 self.init_db()
112 112 except sqlite3.DatabaseError:
113 113 if os.path.isfile(self.hist_file):
114 114 # Try to move the file out of the way.
115 115 newpath = os.path.join(self.shell.ipython_dir, "hist-corrupt.sqlite")
116 116 os.rename(self.hist_file, newpath)
117 117 print("ERROR! History file wasn't a valid SQLite database.",
118 118 "It was moved to %s" % newpath, "and a new file created.")
119 119 self.init_db()
120 120 else:
121 121 # The hist_file is probably :memory: or something else.
122 122 raise
123 123
124 124 self.save_flag = threading.Event()
125 125 self.db_input_cache_lock = threading.Lock()
126 126 self.db_output_cache_lock = threading.Lock()
127 127 self.save_thread = HistorySavingThread(self)
128 128 self.save_thread.start()
129 129
130 130 self.new_session()
131 131
132 132
133 133 def init_db(self):
134 134 """Connect to the database, and create tables if necessary."""
135 135 self.db = sqlite3.connect(self.hist_file)
136 136 self.db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
137 137 primary key autoincrement, start timestamp,
138 138 end timestamp, num_cmds integer, remark text)""")
139 139 self.db.execute("""CREATE TABLE IF NOT EXISTS history
140 140 (session integer, line integer, source text, source_raw text,
141 141 PRIMARY KEY (session, line))""")
142 142 # Output history is optional, but ensure the table's there so it can be
143 143 # enabled later.
144 144 self.db.execute("""CREATE TABLE IF NOT EXISTS output_history
145 145 (session integer, line integer, output text,
146 146 PRIMARY KEY (session, line))""")
147 147 self.db.commit()
148 148
149 149 def new_session(self, conn=None):
150 150 """Get a new session number."""
151 151 if conn is None:
152 152 conn = self.db
153 153
154 154 with conn:
155 155 cur = conn.execute("""INSERT INTO sessions VALUES (NULL, ?, NULL,
156 156 NULL, "") """, (datetime.datetime.now(),))
157 157 self.session_number = cur.lastrowid
158 158
159 159 def end_session(self):
160 160 """Close the database session, filling in the end time and line count."""
161 161 self.writeout_cache()
162 162 with self.db:
163 163 self.db.execute("""UPDATE sessions SET end=?, num_cmds=? WHERE
164 164 session==?""", (datetime.datetime.now(),
165 165 len(self.input_hist_parsed)-1, self.session_number))
166 166 self.session_number = 0
167 167
168 168 def name_session(self, name):
169 169 """Give the current session a name in the history database."""
170 170 with self.db:
171 171 self.db.execute("UPDATE sessions SET remark=? WHERE session==?",
172 172 (name, self.session_number))
173 173
174 174 def reset(self, new_session=True):
175 175 """Clear the session history, releasing all object references, and
176 176 optionally open a new session."""
177 177 self.output_hist.clear()
178 178 # The directory history can't be completely empty
179 179 self.dir_hist[:] = [os.getcwd()]
180 180
181 181 if new_session:
182 182 if self.session_number:
183 183 self.end_session()
184 184 self.input_hist_parsed[:] = [""]
185 185 self.input_hist_raw[:] = [""]
186 186 self.new_session()
187 187
188 188 ## -------------------------------
189 189 ## Methods for retrieving history:
190 190 ## -------------------------------
191 191 def _run_sql(self, sql, params, raw=True, output=False):
192 192 """Prepares and runs an SQL query for the history database.
193 193
194 194 Parameters
195 195 ----------
196 196 sql : str
197 197 Any filtering expressions to go after SELECT ... FROM ...
198 198 params : tuple
199 199 Parameters passed to the SQL query (to replace "?")
200 200 raw, output : bool
201 201 See :meth:`get_range`
202 202
203 203 Returns
204 204 -------
205 205 Tuples as :meth:`get_range`
206 206 """
207 207 toget = 'source_raw' if raw else 'source'
208 208 sqlfrom = "history"
209 209 if output:
210 210 sqlfrom = "history LEFT JOIN output_history USING (session, line)"
211 211 toget = "history.%s, output_history.output" % toget
212 212 cur = self.db.execute("SELECT session, line, %s FROM %s " %\
213 213 (toget, sqlfrom) + sql, params)
214 214 if output: # Regroup into 3-tuples, and parse JSON
215 215 return ((ses, lin, (inp, out)) for ses, lin, inp, out in cur)
216 216 return cur
217 217
218 218
219 219 def get_tail(self, n=10, raw=True, output=False, include_latest=False):
220 220 """Get the last n lines from the history database.
221 221
222 222 Parameters
223 223 ----------
224 224 n : int
225 225 The number of lines to get
226 226 raw, output : bool
227 227 See :meth:`get_range`
228 228 include_latest : bool
229 229 If False (default), n+1 lines are fetched, and the latest one
230 230 is discarded. This is intended to be used where the function
231 231 is called by a user command, which it should not return.
232 232
233 233 Returns
234 234 -------
235 235 Tuples as :meth:`get_range`
236 236 """
237 237 self.writeout_cache()
238 238 if not include_latest:
239 239 n += 1
240 240 cur = self._run_sql("ORDER BY session DESC, line DESC LIMIT ?",
241 241 (n,), raw=raw, output=output)
242 242 if not include_latest:
243 243 return reversed(list(cur)[1:])
244 244 return reversed(list(cur))
245 245
246 246 def search(self, pattern="*", raw=True, search_raw=True,
247 247 output=False):
248 248 """Search the database using unix glob-style matching (wildcards
249 249 * and ?).
250 250
251 251 Parameters
252 252 ----------
253 253 pattern : str
254 254 The wildcarded pattern to match when searching
255 255 search_raw : bool
256 256 If True, search the raw input, otherwise, the parsed input
257 257 raw, output : bool
258 258 See :meth:`get_range`
259 259
260 260 Returns
261 261 -------
262 262 Tuples as :meth:`get_range`
263 263 """
264 264 tosearch = "source_raw" if search_raw else "source"
265 265 if output:
266 266 tosearch = "history." + tosearch
267 267 self.writeout_cache()
268 268 return self._run_sql("WHERE %s GLOB ?" % tosearch, (pattern,),
269 269 raw=raw, output=output)
270 270
271 271 def _get_range_session(self, start=1, stop=None, raw=True, output=False):
272 272 """Get input and output history from the current session. Called by
273 273 get_range, and takes similar parameters."""
274 274 input_hist = self.input_hist_raw if raw else self.input_hist_parsed
275 275
276 276 n = len(input_hist)
277 277 if start < 0:
278 278 start += n
279 279 if not stop:
280 280 stop = n
281 281 elif stop < 0:
282 282 stop += n
283 283
284 284 for i in range(start, stop):
285 285 if output:
286 286 line = (input_hist[i], self.output_hist_reprs.get(i))
287 287 else:
288 288 line = input_hist[i]
289 289 yield (0, i, line)
290 290
291 291 def get_range(self, session=0, start=1, stop=None, raw=True,output=False):
292 292 """Retrieve input by session.
293 293
294 294 Parameters
295 295 ----------
296 296 session : int
297 297 Session number to retrieve. The current session is 0, and negative
298 298 numbers count back from current session, so -1 is previous session.
299 299 start : int
300 300 First line to retrieve.
301 301 stop : int
302 302 End of line range (excluded from output itself). If None, retrieve
303 303 to the end of the session.
304 304 raw : bool
305 305 If True, return untranslated input
306 306 output : bool
307 307 If True, attempt to include output. This will be 'real' Python
308 308 objects for the current session, or text reprs from previous
309 309 sessions if db_log_output was enabled at the time. Where no output
310 310 is found, None is used.
311 311
312 312 Returns
313 313 -------
314 314 An iterator over the desired lines. Each line is a 3-tuple, either
315 315 (session, line, input) if output is False, or
316 316 (session, line, (input, output)) if output is True.
317 317 """
318 318 if session == 0 or session==self.session_number: # Current session
319 319 return self._get_range_session(start, stop, raw, output)
320 320 if session < 0:
321 321 session += self.session_number
322 322
323 323 if stop:
324 324 lineclause = "line >= ? AND line < ?"
325 325 params = (session, start, stop)
326 326 else:
327 327 lineclause = "line>=?"
328 328 params = (session, start)
329 329
330 330 return self._run_sql("WHERE session==? AND %s""" % lineclause,
331 331 params, raw=raw, output=output)
332 332
333 333 def get_range_by_str(self, rangestr, raw=True, output=False):
334 334 """Get lines of history from a string of ranges, as used by magic
335 335 commands %hist, %save, %macro, etc.
336 336
337 337 Parameters
338 338 ----------
339 339 rangestr : str
340 340 A string specifying ranges, e.g. "5 ~2/1-4". See
341 341 :func:`magic_history` for full details.
342 342 raw, output : bool
343 343 As :meth:`get_range`
344 344
345 345 Returns
346 346 -------
347 347 Tuples as :meth:`get_range`
348 348 """
349 349 for sess, s, e in extract_hist_ranges(rangestr):
350 350 for line in self.get_range(sess, s, e, raw=raw, output=output):
351 351 yield line
352 352
353 353 ## ----------------------------
354 354 ## Methods for storing history:
355 355 ## ----------------------------
356 356 def store_inputs(self, line_num, source, source_raw=None):
357 357 """Store source and raw input in history and create input cache
358 358 variables _i*.
359 359
360 360 Parameters
361 361 ----------
362 362 line_num : int
363 363 The prompt number of this input.
364 364
365 365 source : str
366 366 Python input.
367 367
368 368 source_raw : str, optional
369 369 If given, this is the raw input without any IPython transformations
370 370 applied to it. If not given, ``source`` is used.
371 371 """
372 372 if source_raw is None:
373 373 source_raw = source
374 374 source = source.rstrip('\n')
375 375 source_raw = source_raw.rstrip('\n')
376 376
377 377 # do not store exit/quit commands
378 378 if self._exit_re.match(source_raw.strip()):
379 379 return
380 380
381 381 self.input_hist_parsed.append(source)
382 382 self.input_hist_raw.append(source_raw)
383 383
384 384 with self.db_input_cache_lock:
385 385 self.db_input_cache.append((line_num, source, source_raw))
386 386 # Trigger to flush cache and write to DB.
387 387 if len(self.db_input_cache) >= self.db_cache_size:
388 388 self.save_flag.set()
389 389
390 390 # update the auto _i variables
391 391 self._iii = self._ii
392 392 self._ii = self._i
393 393 self._i = self._i00
394 394 self._i00 = source_raw
395 395
396 396 # hackish access to user namespace to create _i1,_i2... dynamically
397 397 new_i = '_i%s' % line_num
398 398 to_main = {'_i': self._i,
399 399 '_ii': self._ii,
400 400 '_iii': self._iii,
401 401 new_i : self._i00 }
402 402 self.shell.user_ns.update(to_main)
403 403
404 404 def store_output(self, line_num):
405 405 """If database output logging is enabled, this saves all the
406 406 outputs from the indicated prompt number to the database. It's
407 407 called by run_cell after code has been executed.
408 408
409 409 Parameters
410 410 ----------
411 411 line_num : int
412 412 The line number from which to save outputs
413 413 """
414 414 if (not self.db_log_output) or (line_num not in self.output_hist_reprs):
415 415 return
416 416 output = self.output_hist_reprs[line_num]
417 417
418 418 with self.db_output_cache_lock:
419 419 self.db_output_cache.append((line_num, output))
420 420 if self.db_cache_size <= 1:
421 421 self.save_flag.set()
422 422
423 423 def _writeout_input_cache(self, conn):
424 424 with conn:
425 425 for line in self.db_input_cache:
426 426 conn.execute("INSERT INTO history VALUES (?, ?, ?, ?)",
427 427 (self.session_number,)+line)
428 428
429 429 def _writeout_output_cache(self, conn):
430 430 with conn:
431 431 for line in self.db_output_cache:
432 432 conn.execute("INSERT INTO output_history VALUES (?, ?, ?)",
433 433 (self.session_number,)+line)
434 434
435 435 def writeout_cache(self, conn=None):
436 436 """Write any entries in the cache to the database."""
437 437 if conn is None:
438 438 conn = self.db
439 439
440 440 with self.db_input_cache_lock:
441 441 try:
442 442 self._writeout_input_cache(conn)
443 443 except sqlite3.IntegrityError:
444 444 self.new_session(conn)
445 445 print("ERROR! Session/line number was not unique in",
446 446 "database. History logging moved to new session",
447 447 self.session_number)
448 448 try: # Try writing to the new session. If this fails, don't recurse
449 449 self._writeout_input_cache(conn)
450 450 except sqlite3.IntegrityError:
451 451 pass
452 452 finally:
453 453 self.db_input_cache = []
454 454
455 455 with self.db_output_cache_lock:
456 456 try:
457 457 self._writeout_output_cache(conn)
458 458 except sqlite3.IntegrityError:
459 459 print("!! Session/line number for output was not unique",
460 460 "in database. Output will not be stored.")
461 461 finally:
462 462 self.db_output_cache = []
463 463
464 464
465 465 class HistorySavingThread(threading.Thread):
466 466 """This thread takes care of writing history to the database, so that
467 467 the UI isn't held up while that happens.
468 468
469 469 It waits for the HistoryManager's save_flag to be set, then writes out
470 470 the history cache. The main thread is responsible for setting the flag when
471 471 the cache size reaches a defined threshold."""
472 472 daemon = True
473 473 stop_now = False
474 474 def __init__(self, history_manager):
475 475 super(HistorySavingThread, self).__init__()
476 476 self.history_manager = history_manager
477 477 atexit.register(self.stop)
478 478
479 479 def run(self):
480 480 # We need a separate db connection per thread:
481 481 try:
482 482 self.db = sqlite3.connect(self.history_manager.hist_file)
483 483 while True:
484 484 self.history_manager.save_flag.wait()
485 485 if self.stop_now:
486 486 return
487 487 self.history_manager.save_flag.clear()
488 488 self.history_manager.writeout_cache(self.db)
489 489 except Exception as e:
490 490 print(("The history saving thread hit an unexpected error (%s)."
491 491 "History will not be written to the database.") % repr(e))
492 492
493 493 def stop(self):
494 494 """This can be called from the main thread to safely stop this thread.
495 495
496 496 Note that it does not attempt to write out remaining history before
497 497 exiting. That should be done by calling the HistoryManager's
498 498 end_session method."""
499 499 self.stop_now = True
500 500 self.history_manager.save_flag.set()
501 501 self.join()
502 502
503 503
504 504 # To match, e.g. ~5/8-~2/3
505 505 range_re = re.compile(r"""
506 506 ((?P<startsess>~?\d+)/)?
507 507 (?P<start>\d+) # Only the start line num is compulsory
508 508 ((?P<sep>[\-:])
509 509 ((?P<endsess>~?\d+)/)?
510 510 (?P<end>\d+))?
511 511 $""", re.VERBOSE)
512 512
513 513 def extract_hist_ranges(ranges_str):
514 514 """Turn a string of history ranges into 3-tuples of (session, start, stop).
515 515
516 516 Examples
517 517 --------
518 518 list(extract_input_ranges("~8/5-~7/4 2"))
519 519 [(-8, 5, None), (-7, 1, 4), (0, 2, 3)]
520 520 """
521 521 for range_str in ranges_str.split():
522 522 rmatch = range_re.match(range_str)
523 523 if not rmatch:
524 524 continue
525 525 start = int(rmatch.group("start"))
526 526 end = rmatch.group("end")
527 527 end = int(end) if end else start+1 # If no end specified, get (a, a+1)
528 528 if rmatch.group("sep") == "-": # 1-3 == 1:4 --> [1, 2, 3]
529 529 end += 1
530 530 startsess = rmatch.group("startsess") or "0"
531 531 endsess = rmatch.group("endsess") or startsess
532 532 startsess = int(startsess.replace("~","-"))
533 533 endsess = int(endsess.replace("~","-"))
534 534 assert endsess >= startsess
535 535
536 536 if endsess == startsess:
537 537 yield (startsess, start, end)
538 538 continue
539 539 # Multiple sessions in one range:
540 540 yield (startsess, start, None)
541 541 for sess in range(startsess+1, endsess):
542 542 yield (sess, 1, None)
543 543 yield (endsess, 1, end)
544 544
545 545 def _format_lineno(session, line):
546 546 """Helper function to format line numbers properly."""
547 547 if session == 0:
548 548 return str(line)
549 549 return "%s#%s" % (session, line)
550 550
551 @testdec.skip_doctest
551 @skip_doctest
552 552 def magic_history(self, parameter_s = ''):
553 553 """Print input history (_i<n> variables), with most recent last.
554 554
555 555 %history -> print at most 40 inputs (some may be multi-line)\\
556 556 %history n -> print at most n inputs\\
557 557 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
558 558
559 559 By default, input history is printed without line numbers so it can be
560 560 directly pasted into an editor. Use -n to show them.
561 561
562 562 Ranges of history can be indicated using the syntax:
563 563 4 : Line 4, current session
564 564 4-6 : Lines 4-6, current session
565 565 243/1-5: Lines 1-5, session 243
566 566 ~2/7 : Line 7, session 2 before current
567 567 ~8/1-~6/5 : From the first line of 8 sessions ago, to the fifth line
568 568 of 6 sessions ago.
569 569 Multiple ranges can be entered, separated by spaces
570 570
571 571 The same syntax is used by %macro, %save, %edit, %rerun
572 572
573 573 Options:
574 574
575 575 -n: print line numbers for each input.
576 576 This feature is only available if numbered prompts are in use.
577 577
578 578 -o: also print outputs for each input.
579 579
580 580 -p: print classic '>>>' python prompts before each input. This is useful
581 581 for making documentation, and in conjunction with -o, for producing
582 582 doctest-ready output.
583 583
584 584 -r: (default) print the 'raw' history, i.e. the actual commands you typed.
585 585
586 586 -t: print the 'translated' history, as IPython understands it. IPython
587 587 filters your input and converts it all into valid Python source before
588 588 executing it (things like magics or aliases are turned into function
589 589 calls, for example). With this option, you'll see the native history
590 590 instead of the user-entered version: '%cd /' will be seen as
591 591 'get_ipython().magic("%cd /")' instead of '%cd /'.
592 592
593 593 -g: treat the arg as a pattern to grep for in (full) history.
594 594 This includes the saved history (almost all commands ever written).
595 595 Use '%hist -g' to show full saved history (may be very long).
596 596
597 597 -l: get the last n lines from all sessions. Specify n as a single arg, or
598 598 the default is the last 10 lines.
599 599
600 600 -f FILENAME: instead of printing the output to the screen, redirect it to
601 601 the given file. The file is always overwritten, though IPython asks for
602 602 confirmation first if it already exists.
603 603
604 604 Examples
605 605 --------
606 606 ::
607 607
608 608 In [6]: %hist -n 4 6
609 609 4:a = 12
610 610 5:print a**2
611 611
612 612 """
613 613
614 614 if not self.shell.displayhook.do_full_cache:
615 615 print('This feature is only available if numbered prompts are in use.')
616 616 return
617 617 opts,args = self.parse_options(parameter_s,'noprtglf:',mode='string')
618 618
619 619 # For brevity
620 620 history_manager = self.shell.history_manager
621 621
622 622 def _format_lineno(session, line):
623 623 """Helper function to format line numbers properly."""
624 624 if session in (0, history_manager.session_number):
625 625 return str(line)
626 626 return "%s/%s" % (session, line)
627 627
628 628 # Check if output to specific file was requested.
629 629 try:
630 630 outfname = opts['f']
631 631 except KeyError:
632 632 outfile = io.stdout # default
633 633 # We don't want to close stdout at the end!
634 634 close_at_end = False
635 635 else:
636 636 if os.path.exists(outfname):
637 637 if not io.ask_yes_no("File %r exists. Overwrite?" % outfname):
638 638 print('Aborting.')
639 639 return
640 640
641 641 outfile = open(outfname,'w')
642 642 close_at_end = True
643 643
644 644 print_nums = 'n' in opts
645 645 get_output = 'o' in opts
646 646 pyprompts = 'p' in opts
647 647 # Raw history is the default
648 648 raw = not('t' in opts)
649 649
650 650 default_length = 40
651 651 pattern = None
652 652
653 653 if 'g' in opts: # Glob search
654 654 pattern = "*" + args + "*" if args else "*"
655 655 hist = history_manager.search(pattern, raw=raw, output=get_output)
656 656 elif 'l' in opts: # Get 'tail'
657 657 try:
658 658 n = int(args)
659 659 except ValueError, IndexError:
660 660 n = 10
661 661 hist = history_manager.get_tail(n, raw=raw, output=get_output)
662 662 else:
663 663 if args: # Get history by ranges
664 664 hist = history_manager.get_range_by_str(args, raw, get_output)
665 665 else: # Just get history for the current session
666 666 hist = history_manager.get_range(raw=raw, output=get_output)
667 667
668 668 # We could be displaying the entire history, so let's not try to pull it
669 669 # into a list in memory. Anything that needs more space will just misalign.
670 670 width = 4
671 671
672 672 for session, lineno, inline in hist:
673 673 # Print user history with tabs expanded to 4 spaces. The GUI clients
674 674 # use hard tabs for easier usability in auto-indented code, but we want
675 675 # to produce PEP-8 compliant history for safe pasting into an editor.
676 676 if get_output:
677 677 inline, output = inline
678 678 inline = inline.expandtabs(4).rstrip()
679 679
680 680 multiline = "\n" in inline
681 681 line_sep = '\n' if multiline else ' '
682 682 if print_nums:
683 683 print('%s:%s' % (_format_lineno(session, lineno).rjust(width),
684 684 line_sep), file=outfile, end='')
685 685 if pyprompts:
686 686 print(">>> ", end="", file=outfile)
687 687 if multiline:
688 688 inline = "\n... ".join(inline.splitlines()) + "\n..."
689 689 print(inline, file=outfile)
690 690 if get_output and output:
691 691 print(output, file=outfile)
692 692
693 693 if close_at_end:
694 694 outfile.close()
695 695
696 696
697 697 def magic_rep(self, arg):
698 698 r""" Repeat a command, or get command to input line for editing
699 699
700 700 - %rep (no arguments):
701 701
702 702 Place a string version of last computation result (stored in the special '_'
703 703 variable) to the next input prompt. Allows you to create elaborate command
704 704 lines without using copy-paste::
705 705
706 706 In[1]: l = ["hei", "vaan"]
707 707 In[2]: "".join(l)
708 708 Out[2]: heivaan
709 709 In[3]: %rep
710 710 In[4]: heivaan_ <== cursor blinking
711 711
712 712 %rep 45
713 713
714 714 Place history line 45 on the next input prompt. Use %hist to find
715 715 out the number.
716 716
717 717 %rep 1-4
718 718
719 719 Combine the specified lines into one cell, and place it on the next
720 720 input prompt. See %history for the slice syntax.
721 721
722 722 %rep foo+bar
723 723
724 724 If foo+bar can be evaluated in the user namespace, the result is
725 725 placed at the next input prompt. Otherwise, the history is searched
726 726 for lines which contain that substring, and the most recent one is
727 727 placed at the next input prompt.
728 728 """
729 729 if not arg: # Last output
730 730 self.set_next_input(str(self.shell.user_ns["_"]))
731 731 return
732 732 # Get history range
733 733 histlines = self.history_manager.get_range_by_str(arg)
734 734 cmd = "\n".join(x[2] for x in histlines)
735 735 if cmd:
736 736 self.set_next_input(cmd.rstrip())
737 737 return
738 738
739 739 try: # Variable in user namespace
740 740 cmd = str(eval(arg, self.shell.user_ns))
741 741 except Exception: # Search for term in history
742 742 histlines = self.history_manager.search("*"+arg+"*")
743 743 for h in reversed([x[2] for x in histlines]):
744 744 if 'rep' in h:
745 745 continue
746 746 self.set_next_input(h.rstrip())
747 747 return
748 748 else:
749 749 self.set_next_input(cmd.rstrip())
750 750 print("Couldn't evaluate or find in history:", arg)
751 751
752 752 def magic_rerun(self, parameter_s=''):
753 753 """Re-run previous input
754 754
755 755 By default, you can specify ranges of input history to be repeated
756 756 (as with %history). With no arguments, it will repeat the last line.
757 757
758 758 Options:
759 759
760 760 -l <n> : Repeat the last n lines of input, not including the
761 761 current command.
762 762
763 763 -g foo : Repeat the most recent line which contains foo
764 764 """
765 765 opts, args = self.parse_options(parameter_s, 'l:g:', mode='string')
766 766 if "l" in opts: # Last n lines
767 767 n = int(opts['l'])
768 768 hist = self.history_manager.get_tail(n)
769 769 elif "g" in opts: # Search
770 770 p = "*"+opts['g']+"*"
771 771 hist = list(self.history_manager.search(p))
772 772 for l in reversed(hist):
773 773 if "rerun" not in l[2]:
774 774 hist = [l] # The last match which isn't a %rerun
775 775 break
776 776 else:
777 777 hist = [] # No matches except %rerun
778 778 elif args: # Specify history ranges
779 779 hist = self.history_manager.get_range_by_str(args)
780 780 else: # Last line
781 781 hist = self.history_manager.get_tail(1)
782 782 hist = [x[2] for x in hist]
783 783 if not hist:
784 784 print("No lines in history match specification")
785 785 return
786 786 histlines = "\n".join(hist)
787 787 print("=== Executing: ===")
788 788 print(histlines)
789 789 print("=== Output: ===")
790 790 self.run_cell("\n".join(hist), store_history=False)
791 791
792 792
793 793 def init_ipython(ip):
794 794 ip.define_magic("rep", magic_rep)
795 795 ip.define_magic("recall", magic_rep)
796 796 ip.define_magic("rerun", magic_rerun)
797 797 ip.define_magic("hist",magic_history) # Alternative name
798 798 ip.define_magic("history",magic_history)
799 799
800 800 # XXX - ipy_completers are in quarantine, need to be updated to new apis
801 801 #import ipy_completers
802 802 #ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
@@ -1,3487 +1,3487 b''
1 1 # encoding: utf-8
2 2 """Magic functions for InteractiveShell.
3 3 """
4 4
5 5 #-----------------------------------------------------------------------------
6 6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 7 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
8 8 # Copyright (C) 2008-2009 The IPython Development Team
9 9
10 10 # Distributed under the terms of the BSD License. The full license is in
11 11 # the file COPYING, distributed as part of this software.
12 12 #-----------------------------------------------------------------------------
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Imports
16 16 #-----------------------------------------------------------------------------
17 17
18 18 import __builtin__
19 19 import __future__
20 20 import bdb
21 21 import inspect
22 22 import os
23 23 import sys
24 24 import shutil
25 25 import re
26 26 import time
27 27 import textwrap
28 28 from cStringIO import StringIO
29 29 from getopt import getopt,GetoptError
30 30 from pprint import pformat
31 31 from xmlrpclib import ServerProxy
32 32
33 33 # cProfile was added in Python2.5
34 34 try:
35 35 import cProfile as profile
36 36 import pstats
37 37 except ImportError:
38 38 # profile isn't bundled by default in Debian for license reasons
39 39 try:
40 40 import profile,pstats
41 41 except ImportError:
42 42 profile = pstats = None
43 43
44 44 import IPython
45 45 from IPython.core import debugger, oinspect
46 46 from IPython.core.error import TryNext
47 47 from IPython.core.error import UsageError
48 48 from IPython.core.fakemodule import FakeModule
49 49 from IPython.core.macro import Macro
50 50 from IPython.core import page
51 51 from IPython.core.prefilter import ESC_MAGIC
52 52 from IPython.lib.pylabtools import mpl_runner
53 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 55 from IPython.utils.io import file_read, nlprint
56 56 from IPython.utils.path import get_py_filename
57 57 from IPython.utils.process import arg_split, abbrev_cwd
58 58 from IPython.utils.terminal import set_term_title
59 59 from IPython.utils.text import LSString, SList, format_screen
60 60 from IPython.utils.timing import clock, clock2
61 61 from IPython.utils.warn import warn, error
62 62 from IPython.utils.ipstruct import Struct
63 63 import IPython.utils.generics
64 64
65 65 #-----------------------------------------------------------------------------
66 66 # Utility functions
67 67 #-----------------------------------------------------------------------------
68 68
69 69 def on_off(tag):
70 70 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
71 71 return ['OFF','ON'][tag]
72 72
73 73 class Bunch: pass
74 74
75 75 def compress_dhist(dh):
76 76 head, tail = dh[:-10], dh[-10:]
77 77
78 78 newhead = []
79 79 done = set()
80 80 for h in head:
81 81 if h in done:
82 82 continue
83 83 newhead.append(h)
84 84 done.add(h)
85 85
86 86 return newhead + tail
87 87
88 88 def needs_local_scope(func):
89 89 """Decorator to mark magic functions which need to local scope to run."""
90 90 func.needs_local_scope = True
91 91 return func
92 92
93 93 #***************************************************************************
94 94 # Main class implementing Magic functionality
95 95
96 96 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
97 97 # on construction of the main InteractiveShell object. Something odd is going
98 98 # on with super() calls, Configurable and the MRO... For now leave it as-is, but
99 99 # eventually this needs to be clarified.
100 100 # BG: This is because InteractiveShell inherits from this, but is itself a
101 101 # Configurable. This messes up the MRO in some way. The fix is that we need to
102 102 # make Magic a configurable that InteractiveShell does not subclass.
103 103
104 104 class Magic:
105 105 """Magic functions for InteractiveShell.
106 106
107 107 Shell functions which can be reached as %function_name. All magic
108 108 functions should accept a string, which they can parse for their own
109 109 needs. This can make some functions easier to type, eg `%cd ../`
110 110 vs. `%cd("../")`
111 111
112 112 ALL definitions MUST begin with the prefix magic_. The user won't need it
113 113 at the command line, but it is is needed in the definition. """
114 114
115 115 # class globals
116 116 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
117 117 'Automagic is ON, % prefix NOT needed for magic functions.']
118 118
119 119 #......................................................................
120 120 # some utility functions
121 121
122 122 def __init__(self,shell):
123 123
124 124 self.options_table = {}
125 125 if profile is None:
126 126 self.magic_prun = self.profile_missing_notice
127 127 self.shell = shell
128 128
129 129 # namespace for holding state we may need
130 130 self._magic_state = Bunch()
131 131
132 132 def profile_missing_notice(self, *args, **kwargs):
133 133 error("""\
134 134 The profile module could not be found. It has been removed from the standard
135 135 python packages because of its non-free license. To use profiling, install the
136 136 python-profiler package from non-free.""")
137 137
138 138 def default_option(self,fn,optstr):
139 139 """Make an entry in the options_table for fn, with value optstr"""
140 140
141 141 if fn not in self.lsmagic():
142 142 error("%s is not a magic function" % fn)
143 143 self.options_table[fn] = optstr
144 144
145 145 def lsmagic(self):
146 146 """Return a list of currently available magic functions.
147 147
148 148 Gives a list of the bare names after mangling (['ls','cd', ...], not
149 149 ['magic_ls','magic_cd',...]"""
150 150
151 151 # FIXME. This needs a cleanup, in the way the magics list is built.
152 152
153 153 # magics in class definition
154 154 class_magic = lambda fn: fn.startswith('magic_') and \
155 155 callable(Magic.__dict__[fn])
156 156 # in instance namespace (run-time user additions)
157 157 inst_magic = lambda fn: fn.startswith('magic_') and \
158 158 callable(self.__dict__[fn])
159 159 # and bound magics by user (so they can access self):
160 160 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
161 161 callable(self.__class__.__dict__[fn])
162 162 magics = filter(class_magic,Magic.__dict__.keys()) + \
163 163 filter(inst_magic,self.__dict__.keys()) + \
164 164 filter(inst_bound_magic,self.__class__.__dict__.keys())
165 165 out = []
166 166 for fn in set(magics):
167 167 out.append(fn.replace('magic_','',1))
168 168 out.sort()
169 169 return out
170 170
171 171 def extract_input_lines(self, range_str, raw=False):
172 172 """Return as a string a set of input history slices.
173 173
174 174 Inputs:
175 175
176 176 - range_str: the set of slices is given as a string, like
177 177 "~5/6-~4/2 4:8 9", since this function is for use by magic functions
178 178 which get their arguments as strings. The number before the / is the
179 179 session number: ~n goes n back from the current session.
180 180
181 181 Optional inputs:
182 182
183 183 - raw(False): by default, the processed input is used. If this is
184 184 true, the raw input history is used instead.
185 185
186 186 Note that slices can be called with two notations:
187 187
188 188 N:M -> standard python form, means including items N...(M-1).
189 189
190 190 N-M -> include items N..M (closed endpoint)."""
191 191 lines = self.shell.history_manager.\
192 192 get_range_by_str(range_str, raw=raw)
193 193 return "\n".join(x for _, _, x in lines)
194 194
195 195 def arg_err(self,func):
196 196 """Print docstring if incorrect arguments were passed"""
197 197 print 'Error in arguments:'
198 198 print oinspect.getdoc(func)
199 199
200 200 def format_latex(self,strng):
201 201 """Format a string for latex inclusion."""
202 202
203 203 # Characters that need to be escaped for latex:
204 204 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
205 205 # Magic command names as headers:
206 206 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
207 207 re.MULTILINE)
208 208 # Magic commands
209 209 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
210 210 re.MULTILINE)
211 211 # Paragraph continue
212 212 par_re = re.compile(r'\\$',re.MULTILINE)
213 213
214 214 # The "\n" symbol
215 215 newline_re = re.compile(r'\\n')
216 216
217 217 # Now build the string for output:
218 218 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
219 219 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
220 220 strng)
221 221 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
222 222 strng = par_re.sub(r'\\\\',strng)
223 223 strng = escape_re.sub(r'\\\1',strng)
224 224 strng = newline_re.sub(r'\\textbackslash{}n',strng)
225 225 return strng
226 226
227 227 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
228 228 """Parse options passed to an argument string.
229 229
230 230 The interface is similar to that of getopt(), but it returns back a
231 231 Struct with the options as keys and the stripped argument string still
232 232 as a string.
233 233
234 234 arg_str is quoted as a true sys.argv vector by using shlex.split.
235 235 This allows us to easily expand variables, glob files, quote
236 236 arguments, etc.
237 237
238 238 Options:
239 239 -mode: default 'string'. If given as 'list', the argument string is
240 240 returned as a list (split on whitespace) instead of a string.
241 241
242 242 -list_all: put all option values in lists. Normally only options
243 243 appearing more than once are put in a list.
244 244
245 245 -posix (True): whether to split the input line in POSIX mode or not,
246 246 as per the conventions outlined in the shlex module from the
247 247 standard library."""
248 248
249 249 # inject default options at the beginning of the input line
250 250 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
251 251 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
252 252
253 253 mode = kw.get('mode','string')
254 254 if mode not in ['string','list']:
255 255 raise ValueError,'incorrect mode given: %s' % mode
256 256 # Get options
257 257 list_all = kw.get('list_all',0)
258 258 posix = kw.get('posix', os.name == 'posix')
259 259
260 260 # Check if we have more than one argument to warrant extra processing:
261 261 odict = {} # Dictionary with options
262 262 args = arg_str.split()
263 263 if len(args) >= 1:
264 264 # If the list of inputs only has 0 or 1 thing in it, there's no
265 265 # need to look for options
266 266 argv = arg_split(arg_str,posix)
267 267 # Do regular option processing
268 268 try:
269 269 opts,args = getopt(argv,opt_str,*long_opts)
270 270 except GetoptError,e:
271 271 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
272 272 " ".join(long_opts)))
273 273 for o,a in opts:
274 274 if o.startswith('--'):
275 275 o = o[2:]
276 276 else:
277 277 o = o[1:]
278 278 try:
279 279 odict[o].append(a)
280 280 except AttributeError:
281 281 odict[o] = [odict[o],a]
282 282 except KeyError:
283 283 if list_all:
284 284 odict[o] = [a]
285 285 else:
286 286 odict[o] = a
287 287
288 288 # Prepare opts,args for return
289 289 opts = Struct(odict)
290 290 if mode == 'string':
291 291 args = ' '.join(args)
292 292
293 293 return opts,args
294 294
295 295 #......................................................................
296 296 # And now the actual magic functions
297 297
298 298 # Functions for IPython shell work (vars,funcs, config, etc)
299 299 def magic_lsmagic(self, parameter_s = ''):
300 300 """List currently available magic functions."""
301 301 mesc = ESC_MAGIC
302 302 print 'Available magic functions:\n'+mesc+\
303 303 (' '+mesc).join(self.lsmagic())
304 304 print '\n' + Magic.auto_status[self.shell.automagic]
305 305 return None
306 306
307 307 def magic_magic(self, parameter_s = ''):
308 308 """Print information about the magic function system.
309 309
310 310 Supported formats: -latex, -brief, -rest
311 311 """
312 312
313 313 mode = ''
314 314 try:
315 315 if parameter_s.split()[0] == '-latex':
316 316 mode = 'latex'
317 317 if parameter_s.split()[0] == '-brief':
318 318 mode = 'brief'
319 319 if parameter_s.split()[0] == '-rest':
320 320 mode = 'rest'
321 321 rest_docs = []
322 322 except:
323 323 pass
324 324
325 325 magic_docs = []
326 326 for fname in self.lsmagic():
327 327 mname = 'magic_' + fname
328 328 for space in (Magic,self,self.__class__):
329 329 try:
330 330 fn = space.__dict__[mname]
331 331 except KeyError:
332 332 pass
333 333 else:
334 334 break
335 335 if mode == 'brief':
336 336 # only first line
337 337 if fn.__doc__:
338 338 fndoc = fn.__doc__.split('\n',1)[0]
339 339 else:
340 340 fndoc = 'No documentation'
341 341 else:
342 342 if fn.__doc__:
343 343 fndoc = fn.__doc__.rstrip()
344 344 else:
345 345 fndoc = 'No documentation'
346 346
347 347
348 348 if mode == 'rest':
349 349 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
350 350 fname,fndoc))
351 351
352 352 else:
353 353 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
354 354 fname,fndoc))
355 355
356 356 magic_docs = ''.join(magic_docs)
357 357
358 358 if mode == 'rest':
359 359 return "".join(rest_docs)
360 360
361 361 if mode == 'latex':
362 362 print self.format_latex(magic_docs)
363 363 return
364 364 else:
365 365 magic_docs = format_screen(magic_docs)
366 366 if mode == 'brief':
367 367 return magic_docs
368 368
369 369 outmsg = """
370 370 IPython's 'magic' functions
371 371 ===========================
372 372
373 373 The magic function system provides a series of functions which allow you to
374 374 control the behavior of IPython itself, plus a lot of system-type
375 375 features. All these functions are prefixed with a % character, but parameters
376 376 are given without parentheses or quotes.
377 377
378 378 NOTE: If you have 'automagic' enabled (via the command line option or with the
379 379 %automagic function), you don't need to type in the % explicitly. By default,
380 380 IPython ships with automagic on, so you should only rarely need the % escape.
381 381
382 382 Example: typing '%cd mydir' (without the quotes) changes you working directory
383 383 to 'mydir', if it exists.
384 384
385 385 You can define your own magic functions to extend the system. See the supplied
386 386 ipythonrc and example-magic.py files for details (in your ipython
387 387 configuration directory, typically $HOME/.config/ipython on Linux or $HOME/.ipython elsewhere).
388 388
389 389 You can also define your own aliased names for magic functions. In your
390 390 ipythonrc file, placing a line like:
391 391
392 392 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
393 393
394 394 will define %pf as a new name for %profile.
395 395
396 396 You can also call magics in code using the magic() function, which IPython
397 397 automatically adds to the builtin namespace. Type 'magic?' for details.
398 398
399 399 For a list of the available magic functions, use %lsmagic. For a description
400 400 of any of them, type %magic_name?, e.g. '%cd?'.
401 401
402 402 Currently the magic system has the following functions:\n"""
403 403
404 404 mesc = ESC_MAGIC
405 405 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
406 406 "\n\n%s%s\n\n%s" % (outmsg,
407 407 magic_docs,mesc,mesc,
408 408 (' '+mesc).join(self.lsmagic()),
409 409 Magic.auto_status[self.shell.automagic] ) )
410 410 page.page(outmsg)
411 411
412 412 def magic_automagic(self, parameter_s = ''):
413 413 """Make magic functions callable without having to type the initial %.
414 414
415 415 Without argumentsl toggles on/off (when off, you must call it as
416 416 %automagic, of course). With arguments it sets the value, and you can
417 417 use any of (case insensitive):
418 418
419 419 - on,1,True: to activate
420 420
421 421 - off,0,False: to deactivate.
422 422
423 423 Note that magic functions have lowest priority, so if there's a
424 424 variable whose name collides with that of a magic fn, automagic won't
425 425 work for that function (you get the variable instead). However, if you
426 426 delete the variable (del var), the previously shadowed magic function
427 427 becomes visible to automagic again."""
428 428
429 429 arg = parameter_s.lower()
430 430 if parameter_s in ('on','1','true'):
431 431 self.shell.automagic = True
432 432 elif parameter_s in ('off','0','false'):
433 433 self.shell.automagic = False
434 434 else:
435 435 self.shell.automagic = not self.shell.automagic
436 436 print '\n' + Magic.auto_status[self.shell.automagic]
437 437
438 @testdec.skip_doctest
438 @skip_doctest
439 439 def magic_autocall(self, parameter_s = ''):
440 440 """Make functions callable without having to type parentheses.
441 441
442 442 Usage:
443 443
444 444 %autocall [mode]
445 445
446 446 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
447 447 value is toggled on and off (remembering the previous state).
448 448
449 449 In more detail, these values mean:
450 450
451 451 0 -> fully disabled
452 452
453 453 1 -> active, but do not apply if there are no arguments on the line.
454 454
455 455 In this mode, you get:
456 456
457 457 In [1]: callable
458 458 Out[1]: <built-in function callable>
459 459
460 460 In [2]: callable 'hello'
461 461 ------> callable('hello')
462 462 Out[2]: False
463 463
464 464 2 -> Active always. Even if no arguments are present, the callable
465 465 object is called:
466 466
467 467 In [2]: float
468 468 ------> float()
469 469 Out[2]: 0.0
470 470
471 471 Note that even with autocall off, you can still use '/' at the start of
472 472 a line to treat the first argument on the command line as a function
473 473 and add parentheses to it:
474 474
475 475 In [8]: /str 43
476 476 ------> str(43)
477 477 Out[8]: '43'
478 478
479 479 # all-random (note for auto-testing)
480 480 """
481 481
482 482 if parameter_s:
483 483 arg = int(parameter_s)
484 484 else:
485 485 arg = 'toggle'
486 486
487 487 if not arg in (0,1,2,'toggle'):
488 488 error('Valid modes: (0->Off, 1->Smart, 2->Full')
489 489 return
490 490
491 491 if arg in (0,1,2):
492 492 self.shell.autocall = arg
493 493 else: # toggle
494 494 if self.shell.autocall:
495 495 self._magic_state.autocall_save = self.shell.autocall
496 496 self.shell.autocall = 0
497 497 else:
498 498 try:
499 499 self.shell.autocall = self._magic_state.autocall_save
500 500 except AttributeError:
501 501 self.shell.autocall = self._magic_state.autocall_save = 1
502 502
503 503 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
504 504
505 505
506 506 def magic_page(self, parameter_s=''):
507 507 """Pretty print the object and display it through a pager.
508 508
509 509 %page [options] OBJECT
510 510
511 511 If no object is given, use _ (last output).
512 512
513 513 Options:
514 514
515 515 -r: page str(object), don't pretty-print it."""
516 516
517 517 # After a function contributed by Olivier Aubert, slightly modified.
518 518
519 519 # Process options/args
520 520 opts,args = self.parse_options(parameter_s,'r')
521 521 raw = 'r' in opts
522 522
523 523 oname = args and args or '_'
524 524 info = self._ofind(oname)
525 525 if info['found']:
526 526 txt = (raw and str or pformat)( info['obj'] )
527 527 page.page(txt)
528 528 else:
529 529 print 'Object `%s` not found' % oname
530 530
531 531 def magic_profile(self, parameter_s=''):
532 532 """Print your currently active IPython profile."""
533 533 if self.shell.profile:
534 534 printpl('Current IPython profile: $self.shell.profile.')
535 535 else:
536 536 print 'No profile active.'
537 537
538 538 def magic_pinfo(self, parameter_s='', namespaces=None):
539 539 """Provide detailed information about an object.
540 540
541 541 '%pinfo object' is just a synonym for object? or ?object."""
542 542
543 543 #print 'pinfo par: <%s>' % parameter_s # dbg
544 544
545 545
546 546 # detail_level: 0 -> obj? , 1 -> obj??
547 547 detail_level = 0
548 548 # We need to detect if we got called as 'pinfo pinfo foo', which can
549 549 # happen if the user types 'pinfo foo?' at the cmd line.
550 550 pinfo,qmark1,oname,qmark2 = \
551 551 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
552 552 if pinfo or qmark1 or qmark2:
553 553 detail_level = 1
554 554 if "*" in oname:
555 555 self.magic_psearch(oname)
556 556 else:
557 557 self.shell._inspect('pinfo', oname, detail_level=detail_level,
558 558 namespaces=namespaces)
559 559
560 560 def magic_pinfo2(self, parameter_s='', namespaces=None):
561 561 """Provide extra detailed information about an object.
562 562
563 563 '%pinfo2 object' is just a synonym for object?? or ??object."""
564 564 self.shell._inspect('pinfo', parameter_s, detail_level=1,
565 565 namespaces=namespaces)
566 566
567 @testdec.skip_doctest
567 @skip_doctest
568 568 def magic_pdef(self, parameter_s='', namespaces=None):
569 569 """Print the definition header for any callable object.
570 570
571 571 If the object is a class, print the constructor information.
572 572
573 573 Examples
574 574 --------
575 575 ::
576 576
577 577 In [3]: %pdef urllib.urlopen
578 578 urllib.urlopen(url, data=None, proxies=None)
579 579 """
580 580 self._inspect('pdef',parameter_s, namespaces)
581 581
582 582 def magic_pdoc(self, parameter_s='', namespaces=None):
583 583 """Print the docstring for an object.
584 584
585 585 If the given object is a class, it will print both the class and the
586 586 constructor docstrings."""
587 587 self._inspect('pdoc',parameter_s, namespaces)
588 588
589 589 def magic_psource(self, parameter_s='', namespaces=None):
590 590 """Print (or run through pager) the source code for an object."""
591 591 self._inspect('psource',parameter_s, namespaces)
592 592
593 593 def magic_pfile(self, parameter_s=''):
594 594 """Print (or run through pager) the file where an object is defined.
595 595
596 596 The file opens at the line where the object definition begins. IPython
597 597 will honor the environment variable PAGER if set, and otherwise will
598 598 do its best to print the file in a convenient form.
599 599
600 600 If the given argument is not an object currently defined, IPython will
601 601 try to interpret it as a filename (automatically adding a .py extension
602 602 if needed). You can thus use %pfile as a syntax highlighting code
603 603 viewer."""
604 604
605 605 # first interpret argument as an object name
606 606 out = self._inspect('pfile',parameter_s)
607 607 # if not, try the input as a filename
608 608 if out == 'not found':
609 609 try:
610 610 filename = get_py_filename(parameter_s)
611 611 except IOError,msg:
612 612 print msg
613 613 return
614 614 page.page(self.shell.inspector.format(file(filename).read()))
615 615
616 616 def magic_psearch(self, parameter_s=''):
617 617 """Search for object in namespaces by wildcard.
618 618
619 619 %psearch [options] PATTERN [OBJECT TYPE]
620 620
621 621 Note: ? can be used as a synonym for %psearch, at the beginning or at
622 622 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
623 623 rest of the command line must be unchanged (options come first), so
624 624 for example the following forms are equivalent
625 625
626 626 %psearch -i a* function
627 627 -i a* function?
628 628 ?-i a* function
629 629
630 630 Arguments:
631 631
632 632 PATTERN
633 633
634 634 where PATTERN is a string containing * as a wildcard similar to its
635 635 use in a shell. The pattern is matched in all namespaces on the
636 636 search path. By default objects starting with a single _ are not
637 637 matched, many IPython generated objects have a single
638 638 underscore. The default is case insensitive matching. Matching is
639 639 also done on the attributes of objects and not only on the objects
640 640 in a module.
641 641
642 642 [OBJECT TYPE]
643 643
644 644 Is the name of a python type from the types module. The name is
645 645 given in lowercase without the ending type, ex. StringType is
646 646 written string. By adding a type here only objects matching the
647 647 given type are matched. Using all here makes the pattern match all
648 648 types (this is the default).
649 649
650 650 Options:
651 651
652 652 -a: makes the pattern match even objects whose names start with a
653 653 single underscore. These names are normally ommitted from the
654 654 search.
655 655
656 656 -i/-c: make the pattern case insensitive/sensitive. If neither of
657 657 these options is given, the default is read from your ipythonrc
658 658 file. The option name which sets this value is
659 659 'wildcards_case_sensitive'. If this option is not specified in your
660 660 ipythonrc file, IPython's internal default is to do a case sensitive
661 661 search.
662 662
663 663 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
664 664 specifiy can be searched in any of the following namespaces:
665 665 'builtin', 'user', 'user_global','internal', 'alias', where
666 666 'builtin' and 'user' are the search defaults. Note that you should
667 667 not use quotes when specifying namespaces.
668 668
669 669 'Builtin' contains the python module builtin, 'user' contains all
670 670 user data, 'alias' only contain the shell aliases and no python
671 671 objects, 'internal' contains objects used by IPython. The
672 672 'user_global' namespace is only used by embedded IPython instances,
673 673 and it contains module-level globals. You can add namespaces to the
674 674 search with -s or exclude them with -e (these options can be given
675 675 more than once).
676 676
677 677 Examples:
678 678
679 679 %psearch a* -> objects beginning with an a
680 680 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
681 681 %psearch a* function -> all functions beginning with an a
682 682 %psearch re.e* -> objects beginning with an e in module re
683 683 %psearch r*.e* -> objects that start with e in modules starting in r
684 684 %psearch r*.* string -> all strings in modules beginning with r
685 685
686 686 Case sensitve search:
687 687
688 688 %psearch -c a* list all object beginning with lower case a
689 689
690 690 Show objects beginning with a single _:
691 691
692 692 %psearch -a _* list objects beginning with a single underscore"""
693 693 try:
694 694 parameter_s = parameter_s.encode('ascii')
695 695 except UnicodeEncodeError:
696 696 print 'Python identifiers can only contain ascii characters.'
697 697 return
698 698
699 699 # default namespaces to be searched
700 700 def_search = ['user','builtin']
701 701
702 702 # Process options/args
703 703 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
704 704 opt = opts.get
705 705 shell = self.shell
706 706 psearch = shell.inspector.psearch
707 707
708 708 # select case options
709 709 if opts.has_key('i'):
710 710 ignore_case = True
711 711 elif opts.has_key('c'):
712 712 ignore_case = False
713 713 else:
714 714 ignore_case = not shell.wildcards_case_sensitive
715 715
716 716 # Build list of namespaces to search from user options
717 717 def_search.extend(opt('s',[]))
718 718 ns_exclude = ns_exclude=opt('e',[])
719 719 ns_search = [nm for nm in def_search if nm not in ns_exclude]
720 720
721 721 # Call the actual search
722 722 try:
723 723 psearch(args,shell.ns_table,ns_search,
724 724 show_all=opt('a'),ignore_case=ignore_case)
725 725 except:
726 726 shell.showtraceback()
727 727
728 @testdec.skip_doctest
728 @skip_doctest
729 729 def magic_who_ls(self, parameter_s=''):
730 730 """Return a sorted list of all interactive variables.
731 731
732 732 If arguments are given, only variables of types matching these
733 733 arguments are returned.
734 734
735 735 Examples
736 736 --------
737 737
738 738 Define two variables and list them with who_ls::
739 739
740 740 In [1]: alpha = 123
741 741
742 742 In [2]: beta = 'test'
743 743
744 744 In [3]: %who_ls
745 745 Out[3]: ['alpha', 'beta']
746 746
747 747 In [4]: %who_ls int
748 748 Out[4]: ['alpha']
749 749
750 750 In [5]: %who_ls str
751 751 Out[5]: ['beta']
752 752 """
753 753
754 754 user_ns = self.shell.user_ns
755 755 internal_ns = self.shell.internal_ns
756 756 user_ns_hidden = self.shell.user_ns_hidden
757 757 out = [ i for i in user_ns
758 758 if not i.startswith('_') \
759 759 and not (i in internal_ns or i in user_ns_hidden) ]
760 760
761 761 typelist = parameter_s.split()
762 762 if typelist:
763 763 typeset = set(typelist)
764 764 out = [i for i in out if type(user_ns[i]).__name__ in typeset]
765 765
766 766 out.sort()
767 767 return out
768 768
769 @testdec.skip_doctest
769 @skip_doctest
770 770 def magic_who(self, parameter_s=''):
771 771 """Print all interactive variables, with some minimal formatting.
772 772
773 773 If any arguments are given, only variables whose type matches one of
774 774 these are printed. For example:
775 775
776 776 %who function str
777 777
778 778 will only list functions and strings, excluding all other types of
779 779 variables. To find the proper type names, simply use type(var) at a
780 780 command line to see how python prints type names. For example:
781 781
782 782 In [1]: type('hello')\\
783 783 Out[1]: <type 'str'>
784 784
785 785 indicates that the type name for strings is 'str'.
786 786
787 787 %who always excludes executed names loaded through your configuration
788 788 file and things which are internal to IPython.
789 789
790 790 This is deliberate, as typically you may load many modules and the
791 791 purpose of %who is to show you only what you've manually defined.
792 792
793 793 Examples
794 794 --------
795 795
796 796 Define two variables and list them with who::
797 797
798 798 In [1]: alpha = 123
799 799
800 800 In [2]: beta = 'test'
801 801
802 802 In [3]: %who
803 803 alpha beta
804 804
805 805 In [4]: %who int
806 806 alpha
807 807
808 808 In [5]: %who str
809 809 beta
810 810 """
811 811
812 812 varlist = self.magic_who_ls(parameter_s)
813 813 if not varlist:
814 814 if parameter_s:
815 815 print 'No variables match your requested type.'
816 816 else:
817 817 print 'Interactive namespace is empty.'
818 818 return
819 819
820 820 # if we have variables, move on...
821 821 count = 0
822 822 for i in varlist:
823 823 print i+'\t',
824 824 count += 1
825 825 if count > 8:
826 826 count = 0
827 827 print
828 828 print
829 829
830 @testdec.skip_doctest
830 @skip_doctest
831 831 def magic_whos(self, parameter_s=''):
832 832 """Like %who, but gives some extra information about each variable.
833 833
834 834 The same type filtering of %who can be applied here.
835 835
836 836 For all variables, the type is printed. Additionally it prints:
837 837
838 838 - For {},[],(): their length.
839 839
840 840 - For numpy arrays, a summary with shape, number of
841 841 elements, typecode and size in memory.
842 842
843 843 - Everything else: a string representation, snipping their middle if
844 844 too long.
845 845
846 846 Examples
847 847 --------
848 848
849 849 Define two variables and list them with whos::
850 850
851 851 In [1]: alpha = 123
852 852
853 853 In [2]: beta = 'test'
854 854
855 855 In [3]: %whos
856 856 Variable Type Data/Info
857 857 --------------------------------
858 858 alpha int 123
859 859 beta str test
860 860 """
861 861
862 862 varnames = self.magic_who_ls(parameter_s)
863 863 if not varnames:
864 864 if parameter_s:
865 865 print 'No variables match your requested type.'
866 866 else:
867 867 print 'Interactive namespace is empty.'
868 868 return
869 869
870 870 # if we have variables, move on...
871 871
872 872 # for these types, show len() instead of data:
873 873 seq_types = ['dict', 'list', 'tuple']
874 874
875 875 # for numpy/Numeric arrays, display summary info
876 876 try:
877 877 import numpy
878 878 except ImportError:
879 879 ndarray_type = None
880 880 else:
881 881 ndarray_type = numpy.ndarray.__name__
882 882 try:
883 883 import Numeric
884 884 except ImportError:
885 885 array_type = None
886 886 else:
887 887 array_type = Numeric.ArrayType.__name__
888 888
889 889 # Find all variable names and types so we can figure out column sizes
890 890 def get_vars(i):
891 891 return self.shell.user_ns[i]
892 892
893 893 # some types are well known and can be shorter
894 894 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
895 895 def type_name(v):
896 896 tn = type(v).__name__
897 897 return abbrevs.get(tn,tn)
898 898
899 899 varlist = map(get_vars,varnames)
900 900
901 901 typelist = []
902 902 for vv in varlist:
903 903 tt = type_name(vv)
904 904
905 905 if tt=='instance':
906 906 typelist.append( abbrevs.get(str(vv.__class__),
907 907 str(vv.__class__)))
908 908 else:
909 909 typelist.append(tt)
910 910
911 911 # column labels and # of spaces as separator
912 912 varlabel = 'Variable'
913 913 typelabel = 'Type'
914 914 datalabel = 'Data/Info'
915 915 colsep = 3
916 916 # variable format strings
917 917 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
918 918 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
919 919 aformat = "%s: %s elems, type `%s`, %s bytes"
920 920 # find the size of the columns to format the output nicely
921 921 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
922 922 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
923 923 # table header
924 924 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
925 925 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
926 926 # and the table itself
927 927 kb = 1024
928 928 Mb = 1048576 # kb**2
929 929 for vname,var,vtype in zip(varnames,varlist,typelist):
930 930 print itpl(vformat),
931 931 if vtype in seq_types:
932 932 print "n="+str(len(var))
933 933 elif vtype in [array_type,ndarray_type]:
934 934 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
935 935 if vtype==ndarray_type:
936 936 # numpy
937 937 vsize = var.size
938 938 vbytes = vsize*var.itemsize
939 939 vdtype = var.dtype
940 940 else:
941 941 # Numeric
942 942 vsize = Numeric.size(var)
943 943 vbytes = vsize*var.itemsize()
944 944 vdtype = var.typecode()
945 945
946 946 if vbytes < 100000:
947 947 print aformat % (vshape,vsize,vdtype,vbytes)
948 948 else:
949 949 print aformat % (vshape,vsize,vdtype,vbytes),
950 950 if vbytes < Mb:
951 951 print '(%s kb)' % (vbytes/kb,)
952 952 else:
953 953 print '(%s Mb)' % (vbytes/Mb,)
954 954 else:
955 955 try:
956 956 vstr = str(var)
957 957 except UnicodeEncodeError:
958 958 vstr = unicode(var).encode(sys.getdefaultencoding(),
959 959 'backslashreplace')
960 960 vstr = vstr.replace('\n','\\n')
961 961 if len(vstr) < 50:
962 962 print vstr
963 963 else:
964 964 printpl(vfmt_short)
965 965
966 966 def magic_reset(self, parameter_s=''):
967 967 """Resets the namespace by removing all names defined by the user.
968 968
969 969 Parameters
970 970 ----------
971 971 -f : force reset without asking for confirmation.
972 972
973 973 -s : 'Soft' reset: Only clears your namespace, leaving history intact.
974 974 References to objects may be kept. By default (without this option),
975 975 we do a 'hard' reset, giving you a new session and removing all
976 976 references to objects from the current session.
977 977
978 978 Examples
979 979 --------
980 980 In [6]: a = 1
981 981
982 982 In [7]: a
983 983 Out[7]: 1
984 984
985 985 In [8]: 'a' in _ip.user_ns
986 986 Out[8]: True
987 987
988 988 In [9]: %reset -f
989 989
990 990 In [1]: 'a' in _ip.user_ns
991 991 Out[1]: False
992 992 """
993 993 opts, args = self.parse_options(parameter_s,'sf')
994 994 if 'f' in opts:
995 995 ans = True
996 996 else:
997 997 ans = self.shell.ask_yes_no(
998 998 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
999 999 if not ans:
1000 1000 print 'Nothing done.'
1001 1001 return
1002 1002
1003 1003 if 's' in opts: # Soft reset
1004 1004 user_ns = self.shell.user_ns
1005 1005 for i in self.magic_who_ls():
1006 1006 del(user_ns[i])
1007 1007
1008 1008 else: # Hard reset
1009 1009 self.shell.reset(new_session = False)
1010 1010
1011 1011
1012 1012
1013 1013 def magic_reset_selective(self, parameter_s=''):
1014 1014 """Resets the namespace by removing names defined by the user.
1015 1015
1016 1016 Input/Output history are left around in case you need them.
1017 1017
1018 1018 %reset_selective [-f] regex
1019 1019
1020 1020 No action is taken if regex is not included
1021 1021
1022 1022 Options
1023 1023 -f : force reset without asking for confirmation.
1024 1024
1025 1025 Examples
1026 1026 --------
1027 1027
1028 1028 We first fully reset the namespace so your output looks identical to
1029 1029 this example for pedagogical reasons; in practice you do not need a
1030 1030 full reset.
1031 1031
1032 1032 In [1]: %reset -f
1033 1033
1034 1034 Now, with a clean namespace we can make a few variables and use
1035 1035 %reset_selective to only delete names that match our regexp:
1036 1036
1037 1037 In [2]: a=1; b=2; c=3; b1m=4; b2m=5; b3m=6; b4m=7; b2s=8
1038 1038
1039 1039 In [3]: who_ls
1040 1040 Out[3]: ['a', 'b', 'b1m', 'b2m', 'b2s', 'b3m', 'b4m', 'c']
1041 1041
1042 1042 In [4]: %reset_selective -f b[2-3]m
1043 1043
1044 1044 In [5]: who_ls
1045 1045 Out[5]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1046 1046
1047 1047 In [6]: %reset_selective -f d
1048 1048
1049 1049 In [7]: who_ls
1050 1050 Out[7]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1051 1051
1052 1052 In [8]: %reset_selective -f c
1053 1053
1054 1054 In [9]: who_ls
1055 1055 Out[9]: ['a', 'b', 'b1m', 'b2s', 'b4m']
1056 1056
1057 1057 In [10]: %reset_selective -f b
1058 1058
1059 1059 In [11]: who_ls
1060 1060 Out[11]: ['a']
1061 1061 """
1062 1062
1063 1063 opts, regex = self.parse_options(parameter_s,'f')
1064 1064
1065 1065 if opts.has_key('f'):
1066 1066 ans = True
1067 1067 else:
1068 1068 ans = self.shell.ask_yes_no(
1069 1069 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1070 1070 if not ans:
1071 1071 print 'Nothing done.'
1072 1072 return
1073 1073 user_ns = self.shell.user_ns
1074 1074 if not regex:
1075 1075 print 'No regex pattern specified. Nothing done.'
1076 1076 return
1077 1077 else:
1078 1078 try:
1079 1079 m = re.compile(regex)
1080 1080 except TypeError:
1081 1081 raise TypeError('regex must be a string or compiled pattern')
1082 1082 for i in self.magic_who_ls():
1083 1083 if m.search(i):
1084 1084 del(user_ns[i])
1085 1085
1086 1086 def magic_logstart(self,parameter_s=''):
1087 1087 """Start logging anywhere in a session.
1088 1088
1089 1089 %logstart [-o|-r|-t] [log_name [log_mode]]
1090 1090
1091 1091 If no name is given, it defaults to a file named 'ipython_log.py' in your
1092 1092 current directory, in 'rotate' mode (see below).
1093 1093
1094 1094 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1095 1095 history up to that point and then continues logging.
1096 1096
1097 1097 %logstart takes a second optional parameter: logging mode. This can be one
1098 1098 of (note that the modes are given unquoted):\\
1099 1099 append: well, that says it.\\
1100 1100 backup: rename (if exists) to name~ and start name.\\
1101 1101 global: single logfile in your home dir, appended to.\\
1102 1102 over : overwrite existing log.\\
1103 1103 rotate: create rotating logs name.1~, name.2~, etc.
1104 1104
1105 1105 Options:
1106 1106
1107 1107 -o: log also IPython's output. In this mode, all commands which
1108 1108 generate an Out[NN] prompt are recorded to the logfile, right after
1109 1109 their corresponding input line. The output lines are always
1110 1110 prepended with a '#[Out]# ' marker, so that the log remains valid
1111 1111 Python code.
1112 1112
1113 1113 Since this marker is always the same, filtering only the output from
1114 1114 a log is very easy, using for example a simple awk call:
1115 1115
1116 1116 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1117 1117
1118 1118 -r: log 'raw' input. Normally, IPython's logs contain the processed
1119 1119 input, so that user lines are logged in their final form, converted
1120 1120 into valid Python. For example, %Exit is logged as
1121 1121 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1122 1122 exactly as typed, with no transformations applied.
1123 1123
1124 1124 -t: put timestamps before each input line logged (these are put in
1125 1125 comments)."""
1126 1126
1127 1127 opts,par = self.parse_options(parameter_s,'ort')
1128 1128 log_output = 'o' in opts
1129 1129 log_raw_input = 'r' in opts
1130 1130 timestamp = 't' in opts
1131 1131
1132 1132 logger = self.shell.logger
1133 1133
1134 1134 # if no args are given, the defaults set in the logger constructor by
1135 1135 # ipytohn remain valid
1136 1136 if par:
1137 1137 try:
1138 1138 logfname,logmode = par.split()
1139 1139 except:
1140 1140 logfname = par
1141 1141 logmode = 'backup'
1142 1142 else:
1143 1143 logfname = logger.logfname
1144 1144 logmode = logger.logmode
1145 1145 # put logfname into rc struct as if it had been called on the command
1146 1146 # line, so it ends up saved in the log header Save it in case we need
1147 1147 # to restore it...
1148 1148 old_logfile = self.shell.logfile
1149 1149 if logfname:
1150 1150 logfname = os.path.expanduser(logfname)
1151 1151 self.shell.logfile = logfname
1152 1152
1153 1153 loghead = '# IPython log file\n\n'
1154 1154 try:
1155 1155 started = logger.logstart(logfname,loghead,logmode,
1156 1156 log_output,timestamp,log_raw_input)
1157 1157 except:
1158 1158 self.shell.logfile = old_logfile
1159 1159 warn("Couldn't start log: %s" % sys.exc_info()[1])
1160 1160 else:
1161 1161 # log input history up to this point, optionally interleaving
1162 1162 # output if requested
1163 1163
1164 1164 if timestamp:
1165 1165 # disable timestamping for the previous history, since we've
1166 1166 # lost those already (no time machine here).
1167 1167 logger.timestamp = False
1168 1168
1169 1169 if log_raw_input:
1170 1170 input_hist = self.shell.history_manager.input_hist_raw
1171 1171 else:
1172 1172 input_hist = self.shell.history_manager.input_hist_parsed
1173 1173
1174 1174 if log_output:
1175 1175 log_write = logger.log_write
1176 1176 output_hist = self.shell.history_manager.output_hist
1177 1177 for n in range(1,len(input_hist)-1):
1178 1178 log_write(input_hist[n].rstrip())
1179 1179 if n in output_hist:
1180 1180 log_write(repr(output_hist[n]),'output')
1181 1181 else:
1182 1182 logger.log_write(''.join(input_hist[1:]))
1183 1183 if timestamp:
1184 1184 # re-enable timestamping
1185 1185 logger.timestamp = True
1186 1186
1187 1187 print ('Activating auto-logging. '
1188 1188 'Current session state plus future input saved.')
1189 1189 logger.logstate()
1190 1190
1191 1191 def magic_logstop(self,parameter_s=''):
1192 1192 """Fully stop logging and close log file.
1193 1193
1194 1194 In order to start logging again, a new %logstart call needs to be made,
1195 1195 possibly (though not necessarily) with a new filename, mode and other
1196 1196 options."""
1197 1197 self.logger.logstop()
1198 1198
1199 1199 def magic_logoff(self,parameter_s=''):
1200 1200 """Temporarily stop logging.
1201 1201
1202 1202 You must have previously started logging."""
1203 1203 self.shell.logger.switch_log(0)
1204 1204
1205 1205 def magic_logon(self,parameter_s=''):
1206 1206 """Restart logging.
1207 1207
1208 1208 This function is for restarting logging which you've temporarily
1209 1209 stopped with %logoff. For starting logging for the first time, you
1210 1210 must use the %logstart function, which allows you to specify an
1211 1211 optional log filename."""
1212 1212
1213 1213 self.shell.logger.switch_log(1)
1214 1214
1215 1215 def magic_logstate(self,parameter_s=''):
1216 1216 """Print the status of the logging system."""
1217 1217
1218 1218 self.shell.logger.logstate()
1219 1219
1220 1220 def magic_pdb(self, parameter_s=''):
1221 1221 """Control the automatic calling of the pdb interactive debugger.
1222 1222
1223 1223 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1224 1224 argument it works as a toggle.
1225 1225
1226 1226 When an exception is triggered, IPython can optionally call the
1227 1227 interactive pdb debugger after the traceback printout. %pdb toggles
1228 1228 this feature on and off.
1229 1229
1230 1230 The initial state of this feature is set in your ipythonrc
1231 1231 configuration file (the variable is called 'pdb').
1232 1232
1233 1233 If you want to just activate the debugger AFTER an exception has fired,
1234 1234 without having to type '%pdb on' and rerunning your code, you can use
1235 1235 the %debug magic."""
1236 1236
1237 1237 par = parameter_s.strip().lower()
1238 1238
1239 1239 if par:
1240 1240 try:
1241 1241 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1242 1242 except KeyError:
1243 1243 print ('Incorrect argument. Use on/1, off/0, '
1244 1244 'or nothing for a toggle.')
1245 1245 return
1246 1246 else:
1247 1247 # toggle
1248 1248 new_pdb = not self.shell.call_pdb
1249 1249
1250 1250 # set on the shell
1251 1251 self.shell.call_pdb = new_pdb
1252 1252 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1253 1253
1254 1254 def magic_debug(self, parameter_s=''):
1255 1255 """Activate the interactive debugger in post-mortem mode.
1256 1256
1257 1257 If an exception has just occurred, this lets you inspect its stack
1258 1258 frames interactively. Note that this will always work only on the last
1259 1259 traceback that occurred, so you must call this quickly after an
1260 1260 exception that you wish to inspect has fired, because if another one
1261 1261 occurs, it clobbers the previous one.
1262 1262
1263 1263 If you want IPython to automatically do this on every exception, see
1264 1264 the %pdb magic for more details.
1265 1265 """
1266 1266 self.shell.debugger(force=True)
1267 1267
1268 @testdec.skip_doctest
1268 @skip_doctest
1269 1269 def magic_prun(self, parameter_s ='',user_mode=1,
1270 1270 opts=None,arg_lst=None,prog_ns=None):
1271 1271
1272 1272 """Run a statement through the python code profiler.
1273 1273
1274 1274 Usage:
1275 1275 %prun [options] statement
1276 1276
1277 1277 The given statement (which doesn't require quote marks) is run via the
1278 1278 python profiler in a manner similar to the profile.run() function.
1279 1279 Namespaces are internally managed to work correctly; profile.run
1280 1280 cannot be used in IPython because it makes certain assumptions about
1281 1281 namespaces which do not hold under IPython.
1282 1282
1283 1283 Options:
1284 1284
1285 1285 -l <limit>: you can place restrictions on what or how much of the
1286 1286 profile gets printed. The limit value can be:
1287 1287
1288 1288 * A string: only information for function names containing this string
1289 1289 is printed.
1290 1290
1291 1291 * An integer: only these many lines are printed.
1292 1292
1293 1293 * A float (between 0 and 1): this fraction of the report is printed
1294 1294 (for example, use a limit of 0.4 to see the topmost 40% only).
1295 1295
1296 1296 You can combine several limits with repeated use of the option. For
1297 1297 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1298 1298 information about class constructors.
1299 1299
1300 1300 -r: return the pstats.Stats object generated by the profiling. This
1301 1301 object has all the information about the profile in it, and you can
1302 1302 later use it for further analysis or in other functions.
1303 1303
1304 1304 -s <key>: sort profile by given key. You can provide more than one key
1305 1305 by using the option several times: '-s key1 -s key2 -s key3...'. The
1306 1306 default sorting key is 'time'.
1307 1307
1308 1308 The following is copied verbatim from the profile documentation
1309 1309 referenced below:
1310 1310
1311 1311 When more than one key is provided, additional keys are used as
1312 1312 secondary criteria when the there is equality in all keys selected
1313 1313 before them.
1314 1314
1315 1315 Abbreviations can be used for any key names, as long as the
1316 1316 abbreviation is unambiguous. The following are the keys currently
1317 1317 defined:
1318 1318
1319 1319 Valid Arg Meaning
1320 1320 "calls" call count
1321 1321 "cumulative" cumulative time
1322 1322 "file" file name
1323 1323 "module" file name
1324 1324 "pcalls" primitive call count
1325 1325 "line" line number
1326 1326 "name" function name
1327 1327 "nfl" name/file/line
1328 1328 "stdname" standard name
1329 1329 "time" internal time
1330 1330
1331 1331 Note that all sorts on statistics are in descending order (placing
1332 1332 most time consuming items first), where as name, file, and line number
1333 1333 searches are in ascending order (i.e., alphabetical). The subtle
1334 1334 distinction between "nfl" and "stdname" is that the standard name is a
1335 1335 sort of the name as printed, which means that the embedded line
1336 1336 numbers get compared in an odd way. For example, lines 3, 20, and 40
1337 1337 would (if the file names were the same) appear in the string order
1338 1338 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1339 1339 line numbers. In fact, sort_stats("nfl") is the same as
1340 1340 sort_stats("name", "file", "line").
1341 1341
1342 1342 -T <filename>: save profile results as shown on screen to a text
1343 1343 file. The profile is still shown on screen.
1344 1344
1345 1345 -D <filename>: save (via dump_stats) profile statistics to given
1346 1346 filename. This data is in a format understod by the pstats module, and
1347 1347 is generated by a call to the dump_stats() method of profile
1348 1348 objects. The profile is still shown on screen.
1349 1349
1350 1350 If you want to run complete programs under the profiler's control, use
1351 1351 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1352 1352 contains profiler specific options as described here.
1353 1353
1354 1354 You can read the complete documentation for the profile module with::
1355 1355
1356 1356 In [1]: import profile; profile.help()
1357 1357 """
1358 1358
1359 1359 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1360 1360 # protect user quote marks
1361 1361 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1362 1362
1363 1363 if user_mode: # regular user call
1364 1364 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1365 1365 list_all=1)
1366 1366 namespace = self.shell.user_ns
1367 1367 else: # called to run a program by %run -p
1368 1368 try:
1369 1369 filename = get_py_filename(arg_lst[0])
1370 1370 except IOError,msg:
1371 1371 error(msg)
1372 1372 return
1373 1373
1374 1374 arg_str = 'execfile(filename,prog_ns)'
1375 1375 namespace = locals()
1376 1376
1377 1377 opts.merge(opts_def)
1378 1378
1379 1379 prof = profile.Profile()
1380 1380 try:
1381 1381 prof = prof.runctx(arg_str,namespace,namespace)
1382 1382 sys_exit = ''
1383 1383 except SystemExit:
1384 1384 sys_exit = """*** SystemExit exception caught in code being profiled."""
1385 1385
1386 1386 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1387 1387
1388 1388 lims = opts.l
1389 1389 if lims:
1390 1390 lims = [] # rebuild lims with ints/floats/strings
1391 1391 for lim in opts.l:
1392 1392 try:
1393 1393 lims.append(int(lim))
1394 1394 except ValueError:
1395 1395 try:
1396 1396 lims.append(float(lim))
1397 1397 except ValueError:
1398 1398 lims.append(lim)
1399 1399
1400 1400 # Trap output.
1401 1401 stdout_trap = StringIO()
1402 1402
1403 1403 if hasattr(stats,'stream'):
1404 1404 # In newer versions of python, the stats object has a 'stream'
1405 1405 # attribute to write into.
1406 1406 stats.stream = stdout_trap
1407 1407 stats.print_stats(*lims)
1408 1408 else:
1409 1409 # For older versions, we manually redirect stdout during printing
1410 1410 sys_stdout = sys.stdout
1411 1411 try:
1412 1412 sys.stdout = stdout_trap
1413 1413 stats.print_stats(*lims)
1414 1414 finally:
1415 1415 sys.stdout = sys_stdout
1416 1416
1417 1417 output = stdout_trap.getvalue()
1418 1418 output = output.rstrip()
1419 1419
1420 1420 page.page(output)
1421 1421 print sys_exit,
1422 1422
1423 1423 dump_file = opts.D[0]
1424 1424 text_file = opts.T[0]
1425 1425 if dump_file:
1426 1426 prof.dump_stats(dump_file)
1427 1427 print '\n*** Profile stats marshalled to file',\
1428 1428 `dump_file`+'.',sys_exit
1429 1429 if text_file:
1430 1430 pfile = file(text_file,'w')
1431 1431 pfile.write(output)
1432 1432 pfile.close()
1433 1433 print '\n*** Profile printout saved to text file',\
1434 1434 `text_file`+'.',sys_exit
1435 1435
1436 1436 if opts.has_key('r'):
1437 1437 return stats
1438 1438 else:
1439 1439 return None
1440 1440
1441 @testdec.skip_doctest
1441 @skip_doctest
1442 1442 def magic_run(self, parameter_s ='',runner=None,
1443 1443 file_finder=get_py_filename):
1444 1444 """Run the named file inside IPython as a program.
1445 1445
1446 1446 Usage:\\
1447 1447 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1448 1448
1449 1449 Parameters after the filename are passed as command-line arguments to
1450 1450 the program (put in sys.argv). Then, control returns to IPython's
1451 1451 prompt.
1452 1452
1453 1453 This is similar to running at a system prompt:\\
1454 1454 $ python file args\\
1455 1455 but with the advantage of giving you IPython's tracebacks, and of
1456 1456 loading all variables into your interactive namespace for further use
1457 1457 (unless -p is used, see below).
1458 1458
1459 1459 The file is executed in a namespace initially consisting only of
1460 1460 __name__=='__main__' and sys.argv constructed as indicated. It thus
1461 1461 sees its environment as if it were being run as a stand-alone program
1462 1462 (except for sharing global objects such as previously imported
1463 1463 modules). But after execution, the IPython interactive namespace gets
1464 1464 updated with all variables defined in the program (except for __name__
1465 1465 and sys.argv). This allows for very convenient loading of code for
1466 1466 interactive work, while giving each program a 'clean sheet' to run in.
1467 1467
1468 1468 Options:
1469 1469
1470 1470 -n: __name__ is NOT set to '__main__', but to the running file's name
1471 1471 without extension (as python does under import). This allows running
1472 1472 scripts and reloading the definitions in them without calling code
1473 1473 protected by an ' if __name__ == "__main__" ' clause.
1474 1474
1475 1475 -i: run the file in IPython's namespace instead of an empty one. This
1476 1476 is useful if you are experimenting with code written in a text editor
1477 1477 which depends on variables defined interactively.
1478 1478
1479 1479 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1480 1480 being run. This is particularly useful if IPython is being used to
1481 1481 run unittests, which always exit with a sys.exit() call. In such
1482 1482 cases you are interested in the output of the test results, not in
1483 1483 seeing a traceback of the unittest module.
1484 1484
1485 1485 -t: print timing information at the end of the run. IPython will give
1486 1486 you an estimated CPU time consumption for your script, which under
1487 1487 Unix uses the resource module to avoid the wraparound problems of
1488 1488 time.clock(). Under Unix, an estimate of time spent on system tasks
1489 1489 is also given (for Windows platforms this is reported as 0.0).
1490 1490
1491 1491 If -t is given, an additional -N<N> option can be given, where <N>
1492 1492 must be an integer indicating how many times you want the script to
1493 1493 run. The final timing report will include total and per run results.
1494 1494
1495 1495 For example (testing the script uniq_stable.py):
1496 1496
1497 1497 In [1]: run -t uniq_stable
1498 1498
1499 1499 IPython CPU timings (estimated):\\
1500 1500 User : 0.19597 s.\\
1501 1501 System: 0.0 s.\\
1502 1502
1503 1503 In [2]: run -t -N5 uniq_stable
1504 1504
1505 1505 IPython CPU timings (estimated):\\
1506 1506 Total runs performed: 5\\
1507 1507 Times : Total Per run\\
1508 1508 User : 0.910862 s, 0.1821724 s.\\
1509 1509 System: 0.0 s, 0.0 s.
1510 1510
1511 1511 -d: run your program under the control of pdb, the Python debugger.
1512 1512 This allows you to execute your program step by step, watch variables,
1513 1513 etc. Internally, what IPython does is similar to calling:
1514 1514
1515 1515 pdb.run('execfile("YOURFILENAME")')
1516 1516
1517 1517 with a breakpoint set on line 1 of your file. You can change the line
1518 1518 number for this automatic breakpoint to be <N> by using the -bN option
1519 1519 (where N must be an integer). For example:
1520 1520
1521 1521 %run -d -b40 myscript
1522 1522
1523 1523 will set the first breakpoint at line 40 in myscript.py. Note that
1524 1524 the first breakpoint must be set on a line which actually does
1525 1525 something (not a comment or docstring) for it to stop execution.
1526 1526
1527 1527 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1528 1528 first enter 'c' (without qoutes) to start execution up to the first
1529 1529 breakpoint.
1530 1530
1531 1531 Entering 'help' gives information about the use of the debugger. You
1532 1532 can easily see pdb's full documentation with "import pdb;pdb.help()"
1533 1533 at a prompt.
1534 1534
1535 1535 -p: run program under the control of the Python profiler module (which
1536 1536 prints a detailed report of execution times, function calls, etc).
1537 1537
1538 1538 You can pass other options after -p which affect the behavior of the
1539 1539 profiler itself. See the docs for %prun for details.
1540 1540
1541 1541 In this mode, the program's variables do NOT propagate back to the
1542 1542 IPython interactive namespace (because they remain in the namespace
1543 1543 where the profiler executes them).
1544 1544
1545 1545 Internally this triggers a call to %prun, see its documentation for
1546 1546 details on the options available specifically for profiling.
1547 1547
1548 1548 There is one special usage for which the text above doesn't apply:
1549 1549 if the filename ends with .ipy, the file is run as ipython script,
1550 1550 just as if the commands were written on IPython prompt.
1551 1551 """
1552 1552
1553 1553 # get arguments and set sys.argv for program to be run.
1554 1554 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1555 1555 mode='list',list_all=1)
1556 1556
1557 1557 try:
1558 1558 filename = file_finder(arg_lst[0])
1559 1559 except IndexError:
1560 1560 warn('you must provide at least a filename.')
1561 1561 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1562 1562 return
1563 1563 except IOError,msg:
1564 1564 error(msg)
1565 1565 return
1566 1566
1567 1567 if filename.lower().endswith('.ipy'):
1568 1568 self.shell.safe_execfile_ipy(filename)
1569 1569 return
1570 1570
1571 1571 # Control the response to exit() calls made by the script being run
1572 1572 exit_ignore = opts.has_key('e')
1573 1573
1574 1574 # Make sure that the running script gets a proper sys.argv as if it
1575 1575 # were run from a system shell.
1576 1576 save_argv = sys.argv # save it for later restoring
1577 1577 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1578 1578
1579 1579 if opts.has_key('i'):
1580 1580 # Run in user's interactive namespace
1581 1581 prog_ns = self.shell.user_ns
1582 1582 __name__save = self.shell.user_ns['__name__']
1583 1583 prog_ns['__name__'] = '__main__'
1584 1584 main_mod = self.shell.new_main_mod(prog_ns)
1585 1585 else:
1586 1586 # Run in a fresh, empty namespace
1587 1587 if opts.has_key('n'):
1588 1588 name = os.path.splitext(os.path.basename(filename))[0]
1589 1589 else:
1590 1590 name = '__main__'
1591 1591
1592 1592 main_mod = self.shell.new_main_mod()
1593 1593 prog_ns = main_mod.__dict__
1594 1594 prog_ns['__name__'] = name
1595 1595
1596 1596 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1597 1597 # set the __file__ global in the script's namespace
1598 1598 prog_ns['__file__'] = filename
1599 1599
1600 1600 # pickle fix. See interactiveshell for an explanation. But we need to make sure
1601 1601 # that, if we overwrite __main__, we replace it at the end
1602 1602 main_mod_name = prog_ns['__name__']
1603 1603
1604 1604 if main_mod_name == '__main__':
1605 1605 restore_main = sys.modules['__main__']
1606 1606 else:
1607 1607 restore_main = False
1608 1608
1609 1609 # This needs to be undone at the end to prevent holding references to
1610 1610 # every single object ever created.
1611 1611 sys.modules[main_mod_name] = main_mod
1612 1612
1613 1613 try:
1614 1614 stats = None
1615 1615 with self.readline_no_record:
1616 1616 if opts.has_key('p'):
1617 1617 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1618 1618 else:
1619 1619 if opts.has_key('d'):
1620 1620 deb = debugger.Pdb(self.shell.colors)
1621 1621 # reset Breakpoint state, which is moronically kept
1622 1622 # in a class
1623 1623 bdb.Breakpoint.next = 1
1624 1624 bdb.Breakpoint.bplist = {}
1625 1625 bdb.Breakpoint.bpbynumber = [None]
1626 1626 # Set an initial breakpoint to stop execution
1627 1627 maxtries = 10
1628 1628 bp = int(opts.get('b',[1])[0])
1629 1629 checkline = deb.checkline(filename,bp)
1630 1630 if not checkline:
1631 1631 for bp in range(bp+1,bp+maxtries+1):
1632 1632 if deb.checkline(filename,bp):
1633 1633 break
1634 1634 else:
1635 1635 msg = ("\nI failed to find a valid line to set "
1636 1636 "a breakpoint\n"
1637 1637 "after trying up to line: %s.\n"
1638 1638 "Please set a valid breakpoint manually "
1639 1639 "with the -b option." % bp)
1640 1640 error(msg)
1641 1641 return
1642 1642 # if we find a good linenumber, set the breakpoint
1643 1643 deb.do_break('%s:%s' % (filename,bp))
1644 1644 # Start file run
1645 1645 print "NOTE: Enter 'c' at the",
1646 1646 print "%s prompt to start your script." % deb.prompt
1647 1647 try:
1648 1648 deb.run('execfile("%s")' % filename,prog_ns)
1649 1649
1650 1650 except:
1651 1651 etype, value, tb = sys.exc_info()
1652 1652 # Skip three frames in the traceback: the %run one,
1653 1653 # one inside bdb.py, and the command-line typed by the
1654 1654 # user (run by exec in pdb itself).
1655 1655 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1656 1656 else:
1657 1657 if runner is None:
1658 1658 runner = self.shell.safe_execfile
1659 1659 if opts.has_key('t'):
1660 1660 # timed execution
1661 1661 try:
1662 1662 nruns = int(opts['N'][0])
1663 1663 if nruns < 1:
1664 1664 error('Number of runs must be >=1')
1665 1665 return
1666 1666 except (KeyError):
1667 1667 nruns = 1
1668 1668 if nruns == 1:
1669 1669 t0 = clock2()
1670 1670 runner(filename,prog_ns,prog_ns,
1671 1671 exit_ignore=exit_ignore)
1672 1672 t1 = clock2()
1673 1673 t_usr = t1[0]-t0[0]
1674 1674 t_sys = t1[1]-t0[1]
1675 1675 print "\nIPython CPU timings (estimated):"
1676 1676 print " User : %10s s." % t_usr
1677 1677 print " System: %10s s." % t_sys
1678 1678 else:
1679 1679 runs = range(nruns)
1680 1680 t0 = clock2()
1681 1681 for nr in runs:
1682 1682 runner(filename,prog_ns,prog_ns,
1683 1683 exit_ignore=exit_ignore)
1684 1684 t1 = clock2()
1685 1685 t_usr = t1[0]-t0[0]
1686 1686 t_sys = t1[1]-t0[1]
1687 1687 print "\nIPython CPU timings (estimated):"
1688 1688 print "Total runs performed:",nruns
1689 1689 print " Times : %10s %10s" % ('Total','Per run')
1690 1690 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1691 1691 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1692 1692
1693 1693 else:
1694 1694 # regular execution
1695 1695 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1696 1696
1697 1697 if opts.has_key('i'):
1698 1698 self.shell.user_ns['__name__'] = __name__save
1699 1699 else:
1700 1700 # The shell MUST hold a reference to prog_ns so after %run
1701 1701 # exits, the python deletion mechanism doesn't zero it out
1702 1702 # (leaving dangling references).
1703 1703 self.shell.cache_main_mod(prog_ns,filename)
1704 1704 # update IPython interactive namespace
1705 1705
1706 1706 # Some forms of read errors on the file may mean the
1707 1707 # __name__ key was never set; using pop we don't have to
1708 1708 # worry about a possible KeyError.
1709 1709 prog_ns.pop('__name__', None)
1710 1710
1711 1711 self.shell.user_ns.update(prog_ns)
1712 1712 finally:
1713 1713 # It's a bit of a mystery why, but __builtins__ can change from
1714 1714 # being a module to becoming a dict missing some key data after
1715 1715 # %run. As best I can see, this is NOT something IPython is doing
1716 1716 # at all, and similar problems have been reported before:
1717 1717 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1718 1718 # Since this seems to be done by the interpreter itself, the best
1719 1719 # we can do is to at least restore __builtins__ for the user on
1720 1720 # exit.
1721 1721 self.shell.user_ns['__builtins__'] = __builtin__
1722 1722
1723 1723 # Ensure key global structures are restored
1724 1724 sys.argv = save_argv
1725 1725 if restore_main:
1726 1726 sys.modules['__main__'] = restore_main
1727 1727 else:
1728 1728 # Remove from sys.modules the reference to main_mod we'd
1729 1729 # added. Otherwise it will trap references to objects
1730 1730 # contained therein.
1731 1731 del sys.modules[main_mod_name]
1732 1732
1733 1733 return stats
1734 1734
1735 @testdec.skip_doctest
1735 @skip_doctest
1736 1736 def magic_timeit(self, parameter_s =''):
1737 1737 """Time execution of a Python statement or expression
1738 1738
1739 1739 Usage:\\
1740 1740 %timeit [-n<N> -r<R> [-t|-c]] statement
1741 1741
1742 1742 Time execution of a Python statement or expression using the timeit
1743 1743 module.
1744 1744
1745 1745 Options:
1746 1746 -n<N>: execute the given statement <N> times in a loop. If this value
1747 1747 is not given, a fitting value is chosen.
1748 1748
1749 1749 -r<R>: repeat the loop iteration <R> times and take the best result.
1750 1750 Default: 3
1751 1751
1752 1752 -t: use time.time to measure the time, which is the default on Unix.
1753 1753 This function measures wall time.
1754 1754
1755 1755 -c: use time.clock to measure the time, which is the default on
1756 1756 Windows and measures wall time. On Unix, resource.getrusage is used
1757 1757 instead and returns the CPU user time.
1758 1758
1759 1759 -p<P>: use a precision of <P> digits to display the timing result.
1760 1760 Default: 3
1761 1761
1762 1762
1763 1763 Examples:
1764 1764
1765 1765 In [1]: %timeit pass
1766 1766 10000000 loops, best of 3: 53.3 ns per loop
1767 1767
1768 1768 In [2]: u = None
1769 1769
1770 1770 In [3]: %timeit u is None
1771 1771 10000000 loops, best of 3: 184 ns per loop
1772 1772
1773 1773 In [4]: %timeit -r 4 u == None
1774 1774 1000000 loops, best of 4: 242 ns per loop
1775 1775
1776 1776 In [5]: import time
1777 1777
1778 1778 In [6]: %timeit -n1 time.sleep(2)
1779 1779 1 loops, best of 3: 2 s per loop
1780 1780
1781 1781
1782 1782 The times reported by %timeit will be slightly higher than those
1783 1783 reported by the timeit.py script when variables are accessed. This is
1784 1784 due to the fact that %timeit executes the statement in the namespace
1785 1785 of the shell, compared with timeit.py, which uses a single setup
1786 1786 statement to import function or create variables. Generally, the bias
1787 1787 does not matter as long as results from timeit.py are not mixed with
1788 1788 those from %timeit."""
1789 1789
1790 1790 import timeit
1791 1791 import math
1792 1792
1793 1793 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1794 1794 # certain terminals. Until we figure out a robust way of
1795 1795 # auto-detecting if the terminal can deal with it, use plain 'us' for
1796 1796 # microseconds. I am really NOT happy about disabling the proper
1797 1797 # 'micro' prefix, but crashing is worse... If anyone knows what the
1798 1798 # right solution for this is, I'm all ears...
1799 1799 #
1800 1800 # Note: using
1801 1801 #
1802 1802 # s = u'\xb5'
1803 1803 # s.encode(sys.getdefaultencoding())
1804 1804 #
1805 1805 # is not sufficient, as I've seen terminals where that fails but
1806 1806 # print s
1807 1807 #
1808 1808 # succeeds
1809 1809 #
1810 1810 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1811 1811
1812 1812 #units = [u"s", u"ms",u'\xb5',"ns"]
1813 1813 units = [u"s", u"ms",u'us',"ns"]
1814 1814
1815 1815 scaling = [1, 1e3, 1e6, 1e9]
1816 1816
1817 1817 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1818 1818 posix=False)
1819 1819 if stmt == "":
1820 1820 return
1821 1821 timefunc = timeit.default_timer
1822 1822 number = int(getattr(opts, "n", 0))
1823 1823 repeat = int(getattr(opts, "r", timeit.default_repeat))
1824 1824 precision = int(getattr(opts, "p", 3))
1825 1825 if hasattr(opts, "t"):
1826 1826 timefunc = time.time
1827 1827 if hasattr(opts, "c"):
1828 1828 timefunc = clock
1829 1829
1830 1830 timer = timeit.Timer(timer=timefunc)
1831 1831 # this code has tight coupling to the inner workings of timeit.Timer,
1832 1832 # but is there a better way to achieve that the code stmt has access
1833 1833 # to the shell namespace?
1834 1834
1835 1835 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1836 1836 'setup': "pass"}
1837 1837 # Track compilation time so it can be reported if too long
1838 1838 # Minimum time above which compilation time will be reported
1839 1839 tc_min = 0.1
1840 1840
1841 1841 t0 = clock()
1842 1842 code = compile(src, "<magic-timeit>", "exec")
1843 1843 tc = clock()-t0
1844 1844
1845 1845 ns = {}
1846 1846 exec code in self.shell.user_ns, ns
1847 1847 timer.inner = ns["inner"]
1848 1848
1849 1849 if number == 0:
1850 1850 # determine number so that 0.2 <= total time < 2.0
1851 1851 number = 1
1852 1852 for i in range(1, 10):
1853 1853 if timer.timeit(number) >= 0.2:
1854 1854 break
1855 1855 number *= 10
1856 1856
1857 1857 best = min(timer.repeat(repeat, number)) / number
1858 1858
1859 1859 if best > 0.0 and best < 1000.0:
1860 1860 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1861 1861 elif best >= 1000.0:
1862 1862 order = 0
1863 1863 else:
1864 1864 order = 3
1865 1865 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1866 1866 precision,
1867 1867 best * scaling[order],
1868 1868 units[order])
1869 1869 if tc > tc_min:
1870 1870 print "Compiler time: %.2f s" % tc
1871 1871
1872 @testdec.skip_doctest
1872 @skip_doctest
1873 1873 @needs_local_scope
1874 1874 def magic_time(self,parameter_s = ''):
1875 1875 """Time execution of a Python statement or expression.
1876 1876
1877 1877 The CPU and wall clock times are printed, and the value of the
1878 1878 expression (if any) is returned. Note that under Win32, system time
1879 1879 is always reported as 0, since it can not be measured.
1880 1880
1881 1881 This function provides very basic timing functionality. In Python
1882 1882 2.3, the timeit module offers more control and sophistication, so this
1883 1883 could be rewritten to use it (patches welcome).
1884 1884
1885 1885 Some examples:
1886 1886
1887 1887 In [1]: time 2**128
1888 1888 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1889 1889 Wall time: 0.00
1890 1890 Out[1]: 340282366920938463463374607431768211456L
1891 1891
1892 1892 In [2]: n = 1000000
1893 1893
1894 1894 In [3]: time sum(range(n))
1895 1895 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1896 1896 Wall time: 1.37
1897 1897 Out[3]: 499999500000L
1898 1898
1899 1899 In [4]: time print 'hello world'
1900 1900 hello world
1901 1901 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1902 1902 Wall time: 0.00
1903 1903
1904 1904 Note that the time needed by Python to compile the given expression
1905 1905 will be reported if it is more than 0.1s. In this example, the
1906 1906 actual exponentiation is done by Python at compilation time, so while
1907 1907 the expression can take a noticeable amount of time to compute, that
1908 1908 time is purely due to the compilation:
1909 1909
1910 1910 In [5]: time 3**9999;
1911 1911 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1912 1912 Wall time: 0.00 s
1913 1913
1914 1914 In [6]: time 3**999999;
1915 1915 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1916 1916 Wall time: 0.00 s
1917 1917 Compiler : 0.78 s
1918 1918 """
1919 1919
1920 1920 # fail immediately if the given expression can't be compiled
1921 1921
1922 1922 expr = self.shell.prefilter(parameter_s,False)
1923 1923
1924 1924 # Minimum time above which compilation time will be reported
1925 1925 tc_min = 0.1
1926 1926
1927 1927 try:
1928 1928 mode = 'eval'
1929 1929 t0 = clock()
1930 1930 code = compile(expr,'<timed eval>',mode)
1931 1931 tc = clock()-t0
1932 1932 except SyntaxError:
1933 1933 mode = 'exec'
1934 1934 t0 = clock()
1935 1935 code = compile(expr,'<timed exec>',mode)
1936 1936 tc = clock()-t0
1937 1937 # skew measurement as little as possible
1938 1938 glob = self.shell.user_ns
1939 1939 locs = self._magic_locals
1940 1940 clk = clock2
1941 1941 wtime = time.time
1942 1942 # time execution
1943 1943 wall_st = wtime()
1944 1944 if mode=='eval':
1945 1945 st = clk()
1946 1946 out = eval(code, glob, locs)
1947 1947 end = clk()
1948 1948 else:
1949 1949 st = clk()
1950 1950 exec code in glob, locs
1951 1951 end = clk()
1952 1952 out = None
1953 1953 wall_end = wtime()
1954 1954 # Compute actual times and report
1955 1955 wall_time = wall_end-wall_st
1956 1956 cpu_user = end[0]-st[0]
1957 1957 cpu_sys = end[1]-st[1]
1958 1958 cpu_tot = cpu_user+cpu_sys
1959 1959 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1960 1960 (cpu_user,cpu_sys,cpu_tot)
1961 1961 print "Wall time: %.2f s" % wall_time
1962 1962 if tc > tc_min:
1963 1963 print "Compiler : %.2f s" % tc
1964 1964 return out
1965 1965
1966 @testdec.skip_doctest
1966 @skip_doctest
1967 1967 def magic_macro(self,parameter_s = ''):
1968 1968 """Define a macro for future re-execution. It accepts ranges of history,
1969 1969 filenames or string objects.
1970 1970
1971 1971 Usage:\\
1972 1972 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1973 1973
1974 1974 Options:
1975 1975
1976 1976 -r: use 'raw' input. By default, the 'processed' history is used,
1977 1977 so that magics are loaded in their transformed version to valid
1978 1978 Python. If this option is given, the raw input as typed as the
1979 1979 command line is used instead.
1980 1980
1981 1981 This will define a global variable called `name` which is a string
1982 1982 made of joining the slices and lines you specify (n1,n2,... numbers
1983 1983 above) from your input history into a single string. This variable
1984 1984 acts like an automatic function which re-executes those lines as if
1985 1985 you had typed them. You just type 'name' at the prompt and the code
1986 1986 executes.
1987 1987
1988 1988 The syntax for indicating input ranges is described in %history.
1989 1989
1990 1990 Note: as a 'hidden' feature, you can also use traditional python slice
1991 1991 notation, where N:M means numbers N through M-1.
1992 1992
1993 1993 For example, if your history contains (%hist prints it):
1994 1994
1995 1995 44: x=1
1996 1996 45: y=3
1997 1997 46: z=x+y
1998 1998 47: print x
1999 1999 48: a=5
2000 2000 49: print 'x',x,'y',y
2001 2001
2002 2002 you can create a macro with lines 44 through 47 (included) and line 49
2003 2003 called my_macro with:
2004 2004
2005 2005 In [55]: %macro my_macro 44-47 49
2006 2006
2007 2007 Now, typing `my_macro` (without quotes) will re-execute all this code
2008 2008 in one pass.
2009 2009
2010 2010 You don't need to give the line-numbers in order, and any given line
2011 2011 number can appear multiple times. You can assemble macros with any
2012 2012 lines from your input history in any order.
2013 2013
2014 2014 The macro is a simple object which holds its value in an attribute,
2015 2015 but IPython's display system checks for macros and executes them as
2016 2016 code instead of printing them when you type their name.
2017 2017
2018 2018 You can view a macro's contents by explicitly printing it with:
2019 2019
2020 2020 'print macro_name'.
2021 2021
2022 2022 """
2023 2023
2024 2024 opts,args = self.parse_options(parameter_s,'r',mode='list')
2025 2025 if not args: # List existing macros
2026 2026 return sorted(k for k,v in self.shell.user_ns.iteritems() if\
2027 2027 isinstance(v, Macro))
2028 2028 if len(args) == 1:
2029 2029 raise UsageError(
2030 2030 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2031 2031 name, codefrom = args[0], " ".join(args[1:])
2032 2032
2033 2033 #print 'rng',ranges # dbg
2034 2034 try:
2035 2035 lines = self.shell.find_user_code(codefrom, 'r' in opts)
2036 2036 except (ValueError, TypeError) as e:
2037 2037 print e.args[0]
2038 2038 return
2039 2039 macro = Macro(lines)
2040 2040 self.shell.define_macro(name, macro)
2041 2041 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2042 2042 print '=== Macro contents: ==='
2043 2043 print macro,
2044 2044
2045 2045 def magic_save(self,parameter_s = ''):
2046 2046 """Save a set of lines or a macro to a given filename.
2047 2047
2048 2048 Usage:\\
2049 2049 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2050 2050
2051 2051 Options:
2052 2052
2053 2053 -r: use 'raw' input. By default, the 'processed' history is used,
2054 2054 so that magics are loaded in their transformed version to valid
2055 2055 Python. If this option is given, the raw input as typed as the
2056 2056 command line is used instead.
2057 2057
2058 2058 This function uses the same syntax as %history for input ranges,
2059 2059 then saves the lines to the filename you specify.
2060 2060
2061 2061 It adds a '.py' extension to the file if you don't do so yourself, and
2062 2062 it asks for confirmation before overwriting existing files."""
2063 2063
2064 2064 opts,args = self.parse_options(parameter_s,'r',mode='list')
2065 2065 fname, codefrom = args[0], " ".join(args[1:])
2066 2066 if not fname.endswith('.py'):
2067 2067 fname += '.py'
2068 2068 if os.path.isfile(fname):
2069 2069 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2070 2070 if ans.lower() not in ['y','yes']:
2071 2071 print 'Operation cancelled.'
2072 2072 return
2073 2073 try:
2074 2074 cmds = self.shell.find_user_code(codefrom, 'r' in opts)
2075 2075 except (TypeError, ValueError) as e:
2076 2076 print e.args[0]
2077 2077 return
2078 2078 if isinstance(cmds, unicode):
2079 2079 cmds = cmds.encode("utf-8")
2080 2080 with open(fname,'w') as f:
2081 2081 f.write("# coding: utf-8\n")
2082 2082 f.write(cmds)
2083 2083 print 'The following commands were written to file `%s`:' % fname
2084 2084 print cmds
2085 2085
2086 2086 def magic_pastebin(self, parameter_s = ''):
2087 2087 """Upload code to the 'Lodge it' paste bin, returning the URL."""
2088 2088 try:
2089 2089 code = self.shell.find_user_code(parameter_s)
2090 2090 except (ValueError, TypeError) as e:
2091 2091 print e.args[0]
2092 2092 return
2093 2093 pbserver = ServerProxy('http://paste.pocoo.org/xmlrpc/')
2094 2094 id = pbserver.pastes.newPaste("python", code)
2095 2095 return "http://paste.pocoo.org/show/" + id
2096 2096
2097 2097 def magic_loadpy(self, arg_s):
2098 2098 """Load a .py python script into the GUI console.
2099 2099
2100 2100 This magic command can either take a local filename or a url::
2101 2101
2102 2102 %loadpy myscript.py
2103 2103 %loadpy http://www.example.com/myscript.py
2104 2104 """
2105 2105 if not arg_s.endswith('.py'):
2106 2106 raise ValueError('%%load only works with .py files: %s' % arg_s)
2107 2107 if arg_s.startswith('http'):
2108 2108 import urllib2
2109 2109 response = urllib2.urlopen(arg_s)
2110 2110 content = response.read()
2111 2111 else:
2112 2112 content = open(arg_s).read()
2113 2113 self.set_next_input(content)
2114 2114
2115 2115 def _edit_macro(self,mname,macro):
2116 2116 """open an editor with the macro data in a file"""
2117 2117 filename = self.shell.mktempfile(macro.value)
2118 2118 self.shell.hooks.editor(filename)
2119 2119
2120 2120 # and make a new macro object, to replace the old one
2121 2121 mfile = open(filename)
2122 2122 mvalue = mfile.read()
2123 2123 mfile.close()
2124 2124 self.shell.user_ns[mname] = Macro(mvalue)
2125 2125
2126 2126 def magic_ed(self,parameter_s=''):
2127 2127 """Alias to %edit."""
2128 2128 return self.magic_edit(parameter_s)
2129 2129
2130 @testdec.skip_doctest
2130 @skip_doctest
2131 2131 def magic_edit(self,parameter_s='',last_call=['','']):
2132 2132 """Bring up an editor and execute the resulting code.
2133 2133
2134 2134 Usage:
2135 2135 %edit [options] [args]
2136 2136
2137 2137 %edit runs IPython's editor hook. The default version of this hook is
2138 2138 set to call the __IPYTHON__.rc.editor command. This is read from your
2139 2139 environment variable $EDITOR. If this isn't found, it will default to
2140 2140 vi under Linux/Unix and to notepad under Windows. See the end of this
2141 2141 docstring for how to change the editor hook.
2142 2142
2143 2143 You can also set the value of this editor via the command line option
2144 2144 '-editor' or in your ipythonrc file. This is useful if you wish to use
2145 2145 specifically for IPython an editor different from your typical default
2146 2146 (and for Windows users who typically don't set environment variables).
2147 2147
2148 2148 This command allows you to conveniently edit multi-line code right in
2149 2149 your IPython session.
2150 2150
2151 2151 If called without arguments, %edit opens up an empty editor with a
2152 2152 temporary file and will execute the contents of this file when you
2153 2153 close it (don't forget to save it!).
2154 2154
2155 2155
2156 2156 Options:
2157 2157
2158 2158 -n <number>: open the editor at a specified line number. By default,
2159 2159 the IPython editor hook uses the unix syntax 'editor +N filename', but
2160 2160 you can configure this by providing your own modified hook if your
2161 2161 favorite editor supports line-number specifications with a different
2162 2162 syntax.
2163 2163
2164 2164 -p: this will call the editor with the same data as the previous time
2165 2165 it was used, regardless of how long ago (in your current session) it
2166 2166 was.
2167 2167
2168 2168 -r: use 'raw' input. This option only applies to input taken from the
2169 2169 user's history. By default, the 'processed' history is used, so that
2170 2170 magics are loaded in their transformed version to valid Python. If
2171 2171 this option is given, the raw input as typed as the command line is
2172 2172 used instead. When you exit the editor, it will be executed by
2173 2173 IPython's own processor.
2174 2174
2175 2175 -x: do not execute the edited code immediately upon exit. This is
2176 2176 mainly useful if you are editing programs which need to be called with
2177 2177 command line arguments, which you can then do using %run.
2178 2178
2179 2179
2180 2180 Arguments:
2181 2181
2182 2182 If arguments are given, the following possibilites exist:
2183 2183
2184 2184 - If the argument is a filename, IPython will load that into the
2185 2185 editor. It will execute its contents with execfile() when you exit,
2186 2186 loading any code in the file into your interactive namespace.
2187 2187
2188 2188 - The arguments are ranges of input history, e.g. "7 ~1/4-6".
2189 2189 The syntax is the same as in the %history magic.
2190 2190
2191 2191 - If the argument is a string variable, its contents are loaded
2192 2192 into the editor. You can thus edit any string which contains
2193 2193 python code (including the result of previous edits).
2194 2194
2195 2195 - If the argument is the name of an object (other than a string),
2196 2196 IPython will try to locate the file where it was defined and open the
2197 2197 editor at the point where it is defined. You can use `%edit function`
2198 2198 to load an editor exactly at the point where 'function' is defined,
2199 2199 edit it and have the file be executed automatically.
2200 2200
2201 2201 If the object is a macro (see %macro for details), this opens up your
2202 2202 specified editor with a temporary file containing the macro's data.
2203 2203 Upon exit, the macro is reloaded with the contents of the file.
2204 2204
2205 2205 Note: opening at an exact line is only supported under Unix, and some
2206 2206 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2207 2207 '+NUMBER' parameter necessary for this feature. Good editors like
2208 2208 (X)Emacs, vi, jed, pico and joe all do.
2209 2209
2210 2210 After executing your code, %edit will return as output the code you
2211 2211 typed in the editor (except when it was an existing file). This way
2212 2212 you can reload the code in further invocations of %edit as a variable,
2213 2213 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2214 2214 the output.
2215 2215
2216 2216 Note that %edit is also available through the alias %ed.
2217 2217
2218 2218 This is an example of creating a simple function inside the editor and
2219 2219 then modifying it. First, start up the editor:
2220 2220
2221 2221 In [1]: ed
2222 2222 Editing... done. Executing edited code...
2223 2223 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2224 2224
2225 2225 We can then call the function foo():
2226 2226
2227 2227 In [2]: foo()
2228 2228 foo() was defined in an editing session
2229 2229
2230 2230 Now we edit foo. IPython automatically loads the editor with the
2231 2231 (temporary) file where foo() was previously defined:
2232 2232
2233 2233 In [3]: ed foo
2234 2234 Editing... done. Executing edited code...
2235 2235
2236 2236 And if we call foo() again we get the modified version:
2237 2237
2238 2238 In [4]: foo()
2239 2239 foo() has now been changed!
2240 2240
2241 2241 Here is an example of how to edit a code snippet successive
2242 2242 times. First we call the editor:
2243 2243
2244 2244 In [5]: ed
2245 2245 Editing... done. Executing edited code...
2246 2246 hello
2247 2247 Out[5]: "print 'hello'n"
2248 2248
2249 2249 Now we call it again with the previous output (stored in _):
2250 2250
2251 2251 In [6]: ed _
2252 2252 Editing... done. Executing edited code...
2253 2253 hello world
2254 2254 Out[6]: "print 'hello world'n"
2255 2255
2256 2256 Now we call it with the output #8 (stored in _8, also as Out[8]):
2257 2257
2258 2258 In [7]: ed _8
2259 2259 Editing... done. Executing edited code...
2260 2260 hello again
2261 2261 Out[7]: "print 'hello again'n"
2262 2262
2263 2263
2264 2264 Changing the default editor hook:
2265 2265
2266 2266 If you wish to write your own editor hook, you can put it in a
2267 2267 configuration file which you load at startup time. The default hook
2268 2268 is defined in the IPython.core.hooks module, and you can use that as a
2269 2269 starting example for further modifications. That file also has
2270 2270 general instructions on how to set a new hook for use once you've
2271 2271 defined it."""
2272 2272
2273 2273 # FIXME: This function has become a convoluted mess. It needs a
2274 2274 # ground-up rewrite with clean, simple logic.
2275 2275
2276 2276 def make_filename(arg):
2277 2277 "Make a filename from the given args"
2278 2278 try:
2279 2279 filename = get_py_filename(arg)
2280 2280 except IOError:
2281 2281 if args.endswith('.py'):
2282 2282 filename = arg
2283 2283 else:
2284 2284 filename = None
2285 2285 return filename
2286 2286
2287 2287 # custom exceptions
2288 2288 class DataIsObject(Exception): pass
2289 2289
2290 2290 opts,args = self.parse_options(parameter_s,'prxn:')
2291 2291 # Set a few locals from the options for convenience:
2292 2292 opts_prev = 'p' in opts
2293 2293 opts_raw = 'r' in opts
2294 2294
2295 2295 # Default line number value
2296 2296 lineno = opts.get('n',None)
2297 2297
2298 2298 if opts_prev:
2299 2299 args = '_%s' % last_call[0]
2300 2300 if not self.shell.user_ns.has_key(args):
2301 2301 args = last_call[1]
2302 2302
2303 2303 # use last_call to remember the state of the previous call, but don't
2304 2304 # let it be clobbered by successive '-p' calls.
2305 2305 try:
2306 2306 last_call[0] = self.shell.displayhook.prompt_count
2307 2307 if not opts_prev:
2308 2308 last_call[1] = parameter_s
2309 2309 except:
2310 2310 pass
2311 2311
2312 2312 # by default this is done with temp files, except when the given
2313 2313 # arg is a filename
2314 2314 use_temp = True
2315 2315
2316 2316 data = ''
2317 2317 if args.endswith('.py'):
2318 2318 filename = make_filename(args)
2319 2319 use_temp = False
2320 2320 elif args:
2321 2321 # Mode where user specifies ranges of lines, like in %macro.
2322 2322 data = self.extract_input_lines(args, opts_raw)
2323 2323 if not data:
2324 2324 try:
2325 2325 # Load the parameter given as a variable. If not a string,
2326 2326 # process it as an object instead (below)
2327 2327
2328 2328 #print '*** args',args,'type',type(args) # dbg
2329 2329 data = eval(args, self.shell.user_ns)
2330 2330 if not isinstance(data, basestring):
2331 2331 raise DataIsObject
2332 2332
2333 2333 except (NameError,SyntaxError):
2334 2334 # given argument is not a variable, try as a filename
2335 2335 filename = make_filename(args)
2336 2336 if filename is None:
2337 2337 warn("Argument given (%s) can't be found as a variable "
2338 2338 "or as a filename." % args)
2339 2339 return
2340 2340 use_temp = False
2341 2341
2342 2342 except DataIsObject:
2343 2343 # macros have a special edit function
2344 2344 if isinstance(data, Macro):
2345 2345 self._edit_macro(args,data)
2346 2346 return
2347 2347
2348 2348 # For objects, try to edit the file where they are defined
2349 2349 try:
2350 2350 filename = inspect.getabsfile(data)
2351 2351 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2352 2352 # class created by %edit? Try to find source
2353 2353 # by looking for method definitions instead, the
2354 2354 # __module__ in those classes is FakeModule.
2355 2355 attrs = [getattr(data, aname) for aname in dir(data)]
2356 2356 for attr in attrs:
2357 2357 if not inspect.ismethod(attr):
2358 2358 continue
2359 2359 filename = inspect.getabsfile(attr)
2360 2360 if filename and 'fakemodule' not in filename.lower():
2361 2361 # change the attribute to be the edit target instead
2362 2362 data = attr
2363 2363 break
2364 2364
2365 2365 datafile = 1
2366 2366 except TypeError:
2367 2367 filename = make_filename(args)
2368 2368 datafile = 1
2369 2369 warn('Could not find file where `%s` is defined.\n'
2370 2370 'Opening a file named `%s`' % (args,filename))
2371 2371 # Now, make sure we can actually read the source (if it was in
2372 2372 # a temp file it's gone by now).
2373 2373 if datafile:
2374 2374 try:
2375 2375 if lineno is None:
2376 2376 lineno = inspect.getsourcelines(data)[1]
2377 2377 except IOError:
2378 2378 filename = make_filename(args)
2379 2379 if filename is None:
2380 2380 warn('The file `%s` where `%s` was defined cannot '
2381 2381 'be read.' % (filename,data))
2382 2382 return
2383 2383 use_temp = False
2384 2384
2385 2385 if use_temp:
2386 2386 filename = self.shell.mktempfile(data)
2387 2387 print 'IPython will make a temporary file named:',filename
2388 2388
2389 2389 # do actual editing here
2390 2390 print 'Editing...',
2391 2391 sys.stdout.flush()
2392 2392 try:
2393 2393 # Quote filenames that may have spaces in them
2394 2394 if ' ' in filename:
2395 2395 filename = "%s" % filename
2396 2396 self.shell.hooks.editor(filename,lineno)
2397 2397 except TryNext:
2398 2398 warn('Could not open editor')
2399 2399 return
2400 2400
2401 2401 # XXX TODO: should this be generalized for all string vars?
2402 2402 # For now, this is special-cased to blocks created by cpaste
2403 2403 if args.strip() == 'pasted_block':
2404 2404 self.shell.user_ns['pasted_block'] = file_read(filename)
2405 2405
2406 2406 if 'x' in opts: # -x prevents actual execution
2407 2407 print
2408 2408 else:
2409 2409 print 'done. Executing edited code...'
2410 2410 if opts_raw:
2411 2411 self.shell.run_cell(file_read(filename),
2412 2412 store_history=False)
2413 2413 else:
2414 2414 self.shell.safe_execfile(filename,self.shell.user_ns,
2415 2415 self.shell.user_ns)
2416 2416
2417 2417
2418 2418 if use_temp:
2419 2419 try:
2420 2420 return open(filename).read()
2421 2421 except IOError,msg:
2422 2422 if msg.filename == filename:
2423 2423 warn('File not found. Did you forget to save?')
2424 2424 return
2425 2425 else:
2426 2426 self.shell.showtraceback()
2427 2427
2428 2428 def magic_xmode(self,parameter_s = ''):
2429 2429 """Switch modes for the exception handlers.
2430 2430
2431 2431 Valid modes: Plain, Context and Verbose.
2432 2432
2433 2433 If called without arguments, acts as a toggle."""
2434 2434
2435 2435 def xmode_switch_err(name):
2436 2436 warn('Error changing %s exception modes.\n%s' %
2437 2437 (name,sys.exc_info()[1]))
2438 2438
2439 2439 shell = self.shell
2440 2440 new_mode = parameter_s.strip().capitalize()
2441 2441 try:
2442 2442 shell.InteractiveTB.set_mode(mode=new_mode)
2443 2443 print 'Exception reporting mode:',shell.InteractiveTB.mode
2444 2444 except:
2445 2445 xmode_switch_err('user')
2446 2446
2447 2447 def magic_colors(self,parameter_s = ''):
2448 2448 """Switch color scheme for prompts, info system and exception handlers.
2449 2449
2450 2450 Currently implemented schemes: NoColor, Linux, LightBG.
2451 2451
2452 2452 Color scheme names are not case-sensitive.
2453 2453
2454 2454 Examples
2455 2455 --------
2456 2456 To get a plain black and white terminal::
2457 2457
2458 2458 %colors nocolor
2459 2459 """
2460 2460
2461 2461 def color_switch_err(name):
2462 2462 warn('Error changing %s color schemes.\n%s' %
2463 2463 (name,sys.exc_info()[1]))
2464 2464
2465 2465
2466 2466 new_scheme = parameter_s.strip()
2467 2467 if not new_scheme:
2468 2468 raise UsageError(
2469 2469 "%colors: you must specify a color scheme. See '%colors?'")
2470 2470 return
2471 2471 # local shortcut
2472 2472 shell = self.shell
2473 2473
2474 2474 import IPython.utils.rlineimpl as readline
2475 2475
2476 2476 if not readline.have_readline and sys.platform == "win32":
2477 2477 msg = """\
2478 2478 Proper color support under MS Windows requires the pyreadline library.
2479 2479 You can find it at:
2480 2480 http://ipython.scipy.org/moin/PyReadline/Intro
2481 2481 Gary's readline needs the ctypes module, from:
2482 2482 http://starship.python.net/crew/theller/ctypes
2483 2483 (Note that ctypes is already part of Python versions 2.5 and newer).
2484 2484
2485 2485 Defaulting color scheme to 'NoColor'"""
2486 2486 new_scheme = 'NoColor'
2487 2487 warn(msg)
2488 2488
2489 2489 # readline option is 0
2490 2490 if not shell.has_readline:
2491 2491 new_scheme = 'NoColor'
2492 2492
2493 2493 # Set prompt colors
2494 2494 try:
2495 2495 shell.displayhook.set_colors(new_scheme)
2496 2496 except:
2497 2497 color_switch_err('prompt')
2498 2498 else:
2499 2499 shell.colors = \
2500 2500 shell.displayhook.color_table.active_scheme_name
2501 2501 # Set exception colors
2502 2502 try:
2503 2503 shell.InteractiveTB.set_colors(scheme = new_scheme)
2504 2504 shell.SyntaxTB.set_colors(scheme = new_scheme)
2505 2505 except:
2506 2506 color_switch_err('exception')
2507 2507
2508 2508 # Set info (for 'object?') colors
2509 2509 if shell.color_info:
2510 2510 try:
2511 2511 shell.inspector.set_active_scheme(new_scheme)
2512 2512 except:
2513 2513 color_switch_err('object inspector')
2514 2514 else:
2515 2515 shell.inspector.set_active_scheme('NoColor')
2516 2516
2517 2517 def magic_pprint(self, parameter_s=''):
2518 2518 """Toggle pretty printing on/off."""
2519 2519 ptformatter = self.shell.display_formatter.formatters['text/plain']
2520 2520 ptformatter.pprint = bool(1 - ptformatter.pprint)
2521 2521 print 'Pretty printing has been turned', \
2522 2522 ['OFF','ON'][ptformatter.pprint]
2523 2523
2524 2524 #......................................................................
2525 2525 # Functions to implement unix shell-type things
2526 2526
2527 @testdec.skip_doctest
2527 @skip_doctest
2528 2528 def magic_alias(self, parameter_s = ''):
2529 2529 """Define an alias for a system command.
2530 2530
2531 2531 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2532 2532
2533 2533 Then, typing 'alias_name params' will execute the system command 'cmd
2534 2534 params' (from your underlying operating system).
2535 2535
2536 2536 Aliases have lower precedence than magic functions and Python normal
2537 2537 variables, so if 'foo' is both a Python variable and an alias, the
2538 2538 alias can not be executed until 'del foo' removes the Python variable.
2539 2539
2540 2540 You can use the %l specifier in an alias definition to represent the
2541 2541 whole line when the alias is called. For example:
2542 2542
2543 2543 In [2]: alias bracket echo "Input in brackets: <%l>"
2544 2544 In [3]: bracket hello world
2545 2545 Input in brackets: <hello world>
2546 2546
2547 2547 You can also define aliases with parameters using %s specifiers (one
2548 2548 per parameter):
2549 2549
2550 2550 In [1]: alias parts echo first %s second %s
2551 2551 In [2]: %parts A B
2552 2552 first A second B
2553 2553 In [3]: %parts A
2554 2554 Incorrect number of arguments: 2 expected.
2555 2555 parts is an alias to: 'echo first %s second %s'
2556 2556
2557 2557 Note that %l and %s are mutually exclusive. You can only use one or
2558 2558 the other in your aliases.
2559 2559
2560 2560 Aliases expand Python variables just like system calls using ! or !!
2561 2561 do: all expressions prefixed with '$' get expanded. For details of
2562 2562 the semantic rules, see PEP-215:
2563 2563 http://www.python.org/peps/pep-0215.html. This is the library used by
2564 2564 IPython for variable expansion. If you want to access a true shell
2565 2565 variable, an extra $ is necessary to prevent its expansion by IPython:
2566 2566
2567 2567 In [6]: alias show echo
2568 2568 In [7]: PATH='A Python string'
2569 2569 In [8]: show $PATH
2570 2570 A Python string
2571 2571 In [9]: show $$PATH
2572 2572 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2573 2573
2574 2574 You can use the alias facility to acess all of $PATH. See the %rehash
2575 2575 and %rehashx functions, which automatically create aliases for the
2576 2576 contents of your $PATH.
2577 2577
2578 2578 If called with no parameters, %alias prints the current alias table."""
2579 2579
2580 2580 par = parameter_s.strip()
2581 2581 if not par:
2582 2582 stored = self.db.get('stored_aliases', {} )
2583 2583 aliases = sorted(self.shell.alias_manager.aliases)
2584 2584 # for k, v in stored:
2585 2585 # atab.append(k, v[0])
2586 2586
2587 2587 print "Total number of aliases:", len(aliases)
2588 2588 sys.stdout.flush()
2589 2589 return aliases
2590 2590
2591 2591 # Now try to define a new one
2592 2592 try:
2593 2593 alias,cmd = par.split(None, 1)
2594 2594 except:
2595 2595 print oinspect.getdoc(self.magic_alias)
2596 2596 else:
2597 2597 self.shell.alias_manager.soft_define_alias(alias, cmd)
2598 2598 # end magic_alias
2599 2599
2600 2600 def magic_unalias(self, parameter_s = ''):
2601 2601 """Remove an alias"""
2602 2602
2603 2603 aname = parameter_s.strip()
2604 2604 self.shell.alias_manager.undefine_alias(aname)
2605 2605 stored = self.db.get('stored_aliases', {} )
2606 2606 if aname in stored:
2607 2607 print "Removing %stored alias",aname
2608 2608 del stored[aname]
2609 2609 self.db['stored_aliases'] = stored
2610 2610
2611 2611 def magic_rehashx(self, parameter_s = ''):
2612 2612 """Update the alias table with all executable files in $PATH.
2613 2613
2614 2614 This version explicitly checks that every entry in $PATH is a file
2615 2615 with execute access (os.X_OK), so it is much slower than %rehash.
2616 2616
2617 2617 Under Windows, it checks executability as a match agains a
2618 2618 '|'-separated string of extensions, stored in the IPython config
2619 2619 variable win_exec_ext. This defaults to 'exe|com|bat'.
2620 2620
2621 2621 This function also resets the root module cache of module completer,
2622 2622 used on slow filesystems.
2623 2623 """
2624 2624 from IPython.core.alias import InvalidAliasError
2625 2625
2626 2626 # for the benefit of module completer in ipy_completers.py
2627 2627 del self.db['rootmodules']
2628 2628
2629 2629 path = [os.path.abspath(os.path.expanduser(p)) for p in
2630 2630 os.environ.get('PATH','').split(os.pathsep)]
2631 2631 path = filter(os.path.isdir,path)
2632 2632
2633 2633 syscmdlist = []
2634 2634 # Now define isexec in a cross platform manner.
2635 2635 if os.name == 'posix':
2636 2636 isexec = lambda fname:os.path.isfile(fname) and \
2637 2637 os.access(fname,os.X_OK)
2638 2638 else:
2639 2639 try:
2640 2640 winext = os.environ['pathext'].replace(';','|').replace('.','')
2641 2641 except KeyError:
2642 2642 winext = 'exe|com|bat|py'
2643 2643 if 'py' not in winext:
2644 2644 winext += '|py'
2645 2645 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2646 2646 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2647 2647 savedir = os.getcwd()
2648 2648
2649 2649 # Now walk the paths looking for executables to alias.
2650 2650 try:
2651 2651 # write the whole loop for posix/Windows so we don't have an if in
2652 2652 # the innermost part
2653 2653 if os.name == 'posix':
2654 2654 for pdir in path:
2655 2655 os.chdir(pdir)
2656 2656 for ff in os.listdir(pdir):
2657 2657 if isexec(ff):
2658 2658 try:
2659 2659 # Removes dots from the name since ipython
2660 2660 # will assume names with dots to be python.
2661 2661 self.shell.alias_manager.define_alias(
2662 2662 ff.replace('.',''), ff)
2663 2663 except InvalidAliasError:
2664 2664 pass
2665 2665 else:
2666 2666 syscmdlist.append(ff)
2667 2667 else:
2668 2668 no_alias = self.shell.alias_manager.no_alias
2669 2669 for pdir in path:
2670 2670 os.chdir(pdir)
2671 2671 for ff in os.listdir(pdir):
2672 2672 base, ext = os.path.splitext(ff)
2673 2673 if isexec(ff) and base.lower() not in no_alias:
2674 2674 if ext.lower() == '.exe':
2675 2675 ff = base
2676 2676 try:
2677 2677 # Removes dots from the name since ipython
2678 2678 # will assume names with dots to be python.
2679 2679 self.shell.alias_manager.define_alias(
2680 2680 base.lower().replace('.',''), ff)
2681 2681 except InvalidAliasError:
2682 2682 pass
2683 2683 syscmdlist.append(ff)
2684 2684 db = self.db
2685 2685 db['syscmdlist'] = syscmdlist
2686 2686 finally:
2687 2687 os.chdir(savedir)
2688 2688
2689 @testdec.skip_doctest
2689 @skip_doctest
2690 2690 def magic_pwd(self, parameter_s = ''):
2691 2691 """Return the current working directory path.
2692 2692
2693 2693 Examples
2694 2694 --------
2695 2695 ::
2696 2696
2697 2697 In [9]: pwd
2698 2698 Out[9]: '/home/tsuser/sprint/ipython'
2699 2699 """
2700 2700 return os.getcwd()
2701 2701
2702 @testdec.skip_doctest
2702 @skip_doctest
2703 2703 def magic_cd(self, parameter_s=''):
2704 2704 """Change the current working directory.
2705 2705
2706 2706 This command automatically maintains an internal list of directories
2707 2707 you visit during your IPython session, in the variable _dh. The
2708 2708 command %dhist shows this history nicely formatted. You can also
2709 2709 do 'cd -<tab>' to see directory history conveniently.
2710 2710
2711 2711 Usage:
2712 2712
2713 2713 cd 'dir': changes to directory 'dir'.
2714 2714
2715 2715 cd -: changes to the last visited directory.
2716 2716
2717 2717 cd -<n>: changes to the n-th directory in the directory history.
2718 2718
2719 2719 cd --foo: change to directory that matches 'foo' in history
2720 2720
2721 2721 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2722 2722 (note: cd <bookmark_name> is enough if there is no
2723 2723 directory <bookmark_name>, but a bookmark with the name exists.)
2724 2724 'cd -b <tab>' allows you to tab-complete bookmark names.
2725 2725
2726 2726 Options:
2727 2727
2728 2728 -q: quiet. Do not print the working directory after the cd command is
2729 2729 executed. By default IPython's cd command does print this directory,
2730 2730 since the default prompts do not display path information.
2731 2731
2732 2732 Note that !cd doesn't work for this purpose because the shell where
2733 2733 !command runs is immediately discarded after executing 'command'.
2734 2734
2735 2735 Examples
2736 2736 --------
2737 2737 ::
2738 2738
2739 2739 In [10]: cd parent/child
2740 2740 /home/tsuser/parent/child
2741 2741 """
2742 2742
2743 2743 parameter_s = parameter_s.strip()
2744 2744 #bkms = self.shell.persist.get("bookmarks",{})
2745 2745
2746 2746 oldcwd = os.getcwd()
2747 2747 numcd = re.match(r'(-)(\d+)$',parameter_s)
2748 2748 # jump in directory history by number
2749 2749 if numcd:
2750 2750 nn = int(numcd.group(2))
2751 2751 try:
2752 2752 ps = self.shell.user_ns['_dh'][nn]
2753 2753 except IndexError:
2754 2754 print 'The requested directory does not exist in history.'
2755 2755 return
2756 2756 else:
2757 2757 opts = {}
2758 2758 elif parameter_s.startswith('--'):
2759 2759 ps = None
2760 2760 fallback = None
2761 2761 pat = parameter_s[2:]
2762 2762 dh = self.shell.user_ns['_dh']
2763 2763 # first search only by basename (last component)
2764 2764 for ent in reversed(dh):
2765 2765 if pat in os.path.basename(ent) and os.path.isdir(ent):
2766 2766 ps = ent
2767 2767 break
2768 2768
2769 2769 if fallback is None and pat in ent and os.path.isdir(ent):
2770 2770 fallback = ent
2771 2771
2772 2772 # if we have no last part match, pick the first full path match
2773 2773 if ps is None:
2774 2774 ps = fallback
2775 2775
2776 2776 if ps is None:
2777 2777 print "No matching entry in directory history"
2778 2778 return
2779 2779 else:
2780 2780 opts = {}
2781 2781
2782 2782
2783 2783 else:
2784 2784 #turn all non-space-escaping backslashes to slashes,
2785 2785 # for c:\windows\directory\names\
2786 2786 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2787 2787 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2788 2788 # jump to previous
2789 2789 if ps == '-':
2790 2790 try:
2791 2791 ps = self.shell.user_ns['_dh'][-2]
2792 2792 except IndexError:
2793 2793 raise UsageError('%cd -: No previous directory to change to.')
2794 2794 # jump to bookmark if needed
2795 2795 else:
2796 2796 if not os.path.isdir(ps) or opts.has_key('b'):
2797 2797 bkms = self.db.get('bookmarks', {})
2798 2798
2799 2799 if bkms.has_key(ps):
2800 2800 target = bkms[ps]
2801 2801 print '(bookmark:%s) -> %s' % (ps,target)
2802 2802 ps = target
2803 2803 else:
2804 2804 if opts.has_key('b'):
2805 2805 raise UsageError("Bookmark '%s' not found. "
2806 2806 "Use '%%bookmark -l' to see your bookmarks." % ps)
2807 2807
2808 2808 # at this point ps should point to the target dir
2809 2809 if ps:
2810 2810 try:
2811 2811 os.chdir(os.path.expanduser(ps))
2812 2812 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2813 2813 set_term_title('IPython: ' + abbrev_cwd())
2814 2814 except OSError:
2815 2815 print sys.exc_info()[1]
2816 2816 else:
2817 2817 cwd = os.getcwd()
2818 2818 dhist = self.shell.user_ns['_dh']
2819 2819 if oldcwd != cwd:
2820 2820 dhist.append(cwd)
2821 2821 self.db['dhist'] = compress_dhist(dhist)[-100:]
2822 2822
2823 2823 else:
2824 2824 os.chdir(self.shell.home_dir)
2825 2825 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2826 2826 set_term_title('IPython: ' + '~')
2827 2827 cwd = os.getcwd()
2828 2828 dhist = self.shell.user_ns['_dh']
2829 2829
2830 2830 if oldcwd != cwd:
2831 2831 dhist.append(cwd)
2832 2832 self.db['dhist'] = compress_dhist(dhist)[-100:]
2833 2833 if not 'q' in opts and self.shell.user_ns['_dh']:
2834 2834 print self.shell.user_ns['_dh'][-1]
2835 2835
2836 2836
2837 2837 def magic_env(self, parameter_s=''):
2838 2838 """List environment variables."""
2839 2839
2840 2840 return os.environ.data
2841 2841
2842 2842 def magic_pushd(self, parameter_s=''):
2843 2843 """Place the current dir on stack and change directory.
2844 2844
2845 2845 Usage:\\
2846 2846 %pushd ['dirname']
2847 2847 """
2848 2848
2849 2849 dir_s = self.shell.dir_stack
2850 2850 tgt = os.path.expanduser(parameter_s)
2851 2851 cwd = os.getcwd().replace(self.home_dir,'~')
2852 2852 if tgt:
2853 2853 self.magic_cd(parameter_s)
2854 2854 dir_s.insert(0,cwd)
2855 2855 return self.magic_dirs()
2856 2856
2857 2857 def magic_popd(self, parameter_s=''):
2858 2858 """Change to directory popped off the top of the stack.
2859 2859 """
2860 2860 if not self.shell.dir_stack:
2861 2861 raise UsageError("%popd on empty stack")
2862 2862 top = self.shell.dir_stack.pop(0)
2863 2863 self.magic_cd(top)
2864 2864 print "popd ->",top
2865 2865
2866 2866 def magic_dirs(self, parameter_s=''):
2867 2867 """Return the current directory stack."""
2868 2868
2869 2869 return self.shell.dir_stack
2870 2870
2871 2871 def magic_dhist(self, parameter_s=''):
2872 2872 """Print your history of visited directories.
2873 2873
2874 2874 %dhist -> print full history\\
2875 2875 %dhist n -> print last n entries only\\
2876 2876 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2877 2877
2878 2878 This history is automatically maintained by the %cd command, and
2879 2879 always available as the global list variable _dh. You can use %cd -<n>
2880 2880 to go to directory number <n>.
2881 2881
2882 2882 Note that most of time, you should view directory history by entering
2883 2883 cd -<TAB>.
2884 2884
2885 2885 """
2886 2886
2887 2887 dh = self.shell.user_ns['_dh']
2888 2888 if parameter_s:
2889 2889 try:
2890 2890 args = map(int,parameter_s.split())
2891 2891 except:
2892 2892 self.arg_err(Magic.magic_dhist)
2893 2893 return
2894 2894 if len(args) == 1:
2895 2895 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2896 2896 elif len(args) == 2:
2897 2897 ini,fin = args
2898 2898 else:
2899 2899 self.arg_err(Magic.magic_dhist)
2900 2900 return
2901 2901 else:
2902 2902 ini,fin = 0,len(dh)
2903 2903 nlprint(dh,
2904 2904 header = 'Directory history (kept in _dh)',
2905 2905 start=ini,stop=fin)
2906 2906
2907 @testdec.skip_doctest
2907 @skip_doctest
2908 2908 def magic_sc(self, parameter_s=''):
2909 2909 """Shell capture - execute a shell command and capture its output.
2910 2910
2911 2911 DEPRECATED. Suboptimal, retained for backwards compatibility.
2912 2912
2913 2913 You should use the form 'var = !command' instead. Example:
2914 2914
2915 2915 "%sc -l myfiles = ls ~" should now be written as
2916 2916
2917 2917 "myfiles = !ls ~"
2918 2918
2919 2919 myfiles.s, myfiles.l and myfiles.n still apply as documented
2920 2920 below.
2921 2921
2922 2922 --
2923 2923 %sc [options] varname=command
2924 2924
2925 2925 IPython will run the given command using commands.getoutput(), and
2926 2926 will then update the user's interactive namespace with a variable
2927 2927 called varname, containing the value of the call. Your command can
2928 2928 contain shell wildcards, pipes, etc.
2929 2929
2930 2930 The '=' sign in the syntax is mandatory, and the variable name you
2931 2931 supply must follow Python's standard conventions for valid names.
2932 2932
2933 2933 (A special format without variable name exists for internal use)
2934 2934
2935 2935 Options:
2936 2936
2937 2937 -l: list output. Split the output on newlines into a list before
2938 2938 assigning it to the given variable. By default the output is stored
2939 2939 as a single string.
2940 2940
2941 2941 -v: verbose. Print the contents of the variable.
2942 2942
2943 2943 In most cases you should not need to split as a list, because the
2944 2944 returned value is a special type of string which can automatically
2945 2945 provide its contents either as a list (split on newlines) or as a
2946 2946 space-separated string. These are convenient, respectively, either
2947 2947 for sequential processing or to be passed to a shell command.
2948 2948
2949 2949 For example:
2950 2950
2951 2951 # all-random
2952 2952
2953 2953 # Capture into variable a
2954 2954 In [1]: sc a=ls *py
2955 2955
2956 2956 # a is a string with embedded newlines
2957 2957 In [2]: a
2958 2958 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2959 2959
2960 2960 # which can be seen as a list:
2961 2961 In [3]: a.l
2962 2962 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2963 2963
2964 2964 # or as a whitespace-separated string:
2965 2965 In [4]: a.s
2966 2966 Out[4]: 'setup.py win32_manual_post_install.py'
2967 2967
2968 2968 # a.s is useful to pass as a single command line:
2969 2969 In [5]: !wc -l $a.s
2970 2970 146 setup.py
2971 2971 130 win32_manual_post_install.py
2972 2972 276 total
2973 2973
2974 2974 # while the list form is useful to loop over:
2975 2975 In [6]: for f in a.l:
2976 2976 ...: !wc -l $f
2977 2977 ...:
2978 2978 146 setup.py
2979 2979 130 win32_manual_post_install.py
2980 2980
2981 2981 Similiarly, the lists returned by the -l option are also special, in
2982 2982 the sense that you can equally invoke the .s attribute on them to
2983 2983 automatically get a whitespace-separated string from their contents:
2984 2984
2985 2985 In [7]: sc -l b=ls *py
2986 2986
2987 2987 In [8]: b
2988 2988 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2989 2989
2990 2990 In [9]: b.s
2991 2991 Out[9]: 'setup.py win32_manual_post_install.py'
2992 2992
2993 2993 In summary, both the lists and strings used for ouptut capture have
2994 2994 the following special attributes:
2995 2995
2996 2996 .l (or .list) : value as list.
2997 2997 .n (or .nlstr): value as newline-separated string.
2998 2998 .s (or .spstr): value as space-separated string.
2999 2999 """
3000 3000
3001 3001 opts,args = self.parse_options(parameter_s,'lv')
3002 3002 # Try to get a variable name and command to run
3003 3003 try:
3004 3004 # the variable name must be obtained from the parse_options
3005 3005 # output, which uses shlex.split to strip options out.
3006 3006 var,_ = args.split('=',1)
3007 3007 var = var.strip()
3008 3008 # But the the command has to be extracted from the original input
3009 3009 # parameter_s, not on what parse_options returns, to avoid the
3010 3010 # quote stripping which shlex.split performs on it.
3011 3011 _,cmd = parameter_s.split('=',1)
3012 3012 except ValueError:
3013 3013 var,cmd = '',''
3014 3014 # If all looks ok, proceed
3015 3015 split = 'l' in opts
3016 3016 out = self.shell.getoutput(cmd, split=split)
3017 3017 if opts.has_key('v'):
3018 3018 print '%s ==\n%s' % (var,pformat(out))
3019 3019 if var:
3020 3020 self.shell.user_ns.update({var:out})
3021 3021 else:
3022 3022 return out
3023 3023
3024 3024 def magic_sx(self, parameter_s=''):
3025 3025 """Shell execute - run a shell command and capture its output.
3026 3026
3027 3027 %sx command
3028 3028
3029 3029 IPython will run the given command using commands.getoutput(), and
3030 3030 return the result formatted as a list (split on '\\n'). Since the
3031 3031 output is _returned_, it will be stored in ipython's regular output
3032 3032 cache Out[N] and in the '_N' automatic variables.
3033 3033
3034 3034 Notes:
3035 3035
3036 3036 1) If an input line begins with '!!', then %sx is automatically
3037 3037 invoked. That is, while:
3038 3038 !ls
3039 3039 causes ipython to simply issue system('ls'), typing
3040 3040 !!ls
3041 3041 is a shorthand equivalent to:
3042 3042 %sx ls
3043 3043
3044 3044 2) %sx differs from %sc in that %sx automatically splits into a list,
3045 3045 like '%sc -l'. The reason for this is to make it as easy as possible
3046 3046 to process line-oriented shell output via further python commands.
3047 3047 %sc is meant to provide much finer control, but requires more
3048 3048 typing.
3049 3049
3050 3050 3) Just like %sc -l, this is a list with special attributes:
3051 3051
3052 3052 .l (or .list) : value as list.
3053 3053 .n (or .nlstr): value as newline-separated string.
3054 3054 .s (or .spstr): value as whitespace-separated string.
3055 3055
3056 3056 This is very useful when trying to use such lists as arguments to
3057 3057 system commands."""
3058 3058
3059 3059 if parameter_s:
3060 3060 return self.shell.getoutput(parameter_s)
3061 3061
3062 3062
3063 3063 def magic_bookmark(self, parameter_s=''):
3064 3064 """Manage IPython's bookmark system.
3065 3065
3066 3066 %bookmark <name> - set bookmark to current dir
3067 3067 %bookmark <name> <dir> - set bookmark to <dir>
3068 3068 %bookmark -l - list all bookmarks
3069 3069 %bookmark -d <name> - remove bookmark
3070 3070 %bookmark -r - remove all bookmarks
3071 3071
3072 3072 You can later on access a bookmarked folder with:
3073 3073 %cd -b <name>
3074 3074 or simply '%cd <name>' if there is no directory called <name> AND
3075 3075 there is such a bookmark defined.
3076 3076
3077 3077 Your bookmarks persist through IPython sessions, but they are
3078 3078 associated with each profile."""
3079 3079
3080 3080 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3081 3081 if len(args) > 2:
3082 3082 raise UsageError("%bookmark: too many arguments")
3083 3083
3084 3084 bkms = self.db.get('bookmarks',{})
3085 3085
3086 3086 if opts.has_key('d'):
3087 3087 try:
3088 3088 todel = args[0]
3089 3089 except IndexError:
3090 3090 raise UsageError(
3091 3091 "%bookmark -d: must provide a bookmark to delete")
3092 3092 else:
3093 3093 try:
3094 3094 del bkms[todel]
3095 3095 except KeyError:
3096 3096 raise UsageError(
3097 3097 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3098 3098
3099 3099 elif opts.has_key('r'):
3100 3100 bkms = {}
3101 3101 elif opts.has_key('l'):
3102 3102 bks = bkms.keys()
3103 3103 bks.sort()
3104 3104 if bks:
3105 3105 size = max(map(len,bks))
3106 3106 else:
3107 3107 size = 0
3108 3108 fmt = '%-'+str(size)+'s -> %s'
3109 3109 print 'Current bookmarks:'
3110 3110 for bk in bks:
3111 3111 print fmt % (bk,bkms[bk])
3112 3112 else:
3113 3113 if not args:
3114 3114 raise UsageError("%bookmark: You must specify the bookmark name")
3115 3115 elif len(args)==1:
3116 3116 bkms[args[0]] = os.getcwd()
3117 3117 elif len(args)==2:
3118 3118 bkms[args[0]] = args[1]
3119 3119 self.db['bookmarks'] = bkms
3120 3120
3121 3121 def magic_pycat(self, parameter_s=''):
3122 3122 """Show a syntax-highlighted file through a pager.
3123 3123
3124 3124 This magic is similar to the cat utility, but it will assume the file
3125 3125 to be Python source and will show it with syntax highlighting. """
3126 3126
3127 3127 try:
3128 3128 filename = get_py_filename(parameter_s)
3129 3129 cont = file_read(filename)
3130 3130 except IOError:
3131 3131 try:
3132 3132 cont = eval(parameter_s,self.user_ns)
3133 3133 except NameError:
3134 3134 cont = None
3135 3135 if cont is None:
3136 3136 print "Error: no such file or variable"
3137 3137 return
3138 3138
3139 3139 page.page(self.shell.pycolorize(cont))
3140 3140
3141 3141 def _rerun_pasted(self):
3142 3142 """ Rerun a previously pasted command.
3143 3143 """
3144 3144 b = self.user_ns.get('pasted_block', None)
3145 3145 if b is None:
3146 3146 raise UsageError('No previous pasted block available')
3147 3147 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3148 3148 exec b in self.user_ns
3149 3149
3150 3150 def _get_pasted_lines(self, sentinel):
3151 3151 """ Yield pasted lines until the user enters the given sentinel value.
3152 3152 """
3153 3153 from IPython.core import interactiveshell
3154 3154 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3155 3155 while True:
3156 3156 l = interactiveshell.raw_input_original(':')
3157 3157 if l == sentinel:
3158 3158 return
3159 3159 else:
3160 3160 yield l
3161 3161
3162 3162 def _strip_pasted_lines_for_code(self, raw_lines):
3163 3163 """ Strip non-code parts of a sequence of lines to return a block of
3164 3164 code.
3165 3165 """
3166 3166 # Regular expressions that declare text we strip from the input:
3167 3167 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3168 3168 r'^\s*(\s?>)+', # Python input prompt
3169 3169 r'^\s*\.{3,}', # Continuation prompts
3170 3170 r'^\++',
3171 3171 ]
3172 3172
3173 3173 strip_from_start = map(re.compile,strip_re)
3174 3174
3175 3175 lines = []
3176 3176 for l in raw_lines:
3177 3177 for pat in strip_from_start:
3178 3178 l = pat.sub('',l)
3179 3179 lines.append(l)
3180 3180
3181 3181 block = "\n".join(lines) + '\n'
3182 3182 #print "block:\n",block
3183 3183 return block
3184 3184
3185 3185 def _execute_block(self, block, par):
3186 3186 """ Execute a block, or store it in a variable, per the user's request.
3187 3187 """
3188 3188 if not par:
3189 3189 b = textwrap.dedent(block)
3190 3190 self.user_ns['pasted_block'] = b
3191 3191 exec b in self.user_ns
3192 3192 else:
3193 3193 self.user_ns[par] = SList(block.splitlines())
3194 3194 print "Block assigned to '%s'" % par
3195 3195
3196 3196 def magic_quickref(self,arg):
3197 3197 """ Show a quick reference sheet """
3198 3198 import IPython.core.usage
3199 3199 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3200 3200
3201 3201 page.page(qr)
3202 3202
3203 3203 def magic_doctest_mode(self,parameter_s=''):
3204 3204 """Toggle doctest mode on and off.
3205 3205
3206 3206 This mode is intended to make IPython behave as much as possible like a
3207 3207 plain Python shell, from the perspective of how its prompts, exceptions
3208 3208 and output look. This makes it easy to copy and paste parts of a
3209 3209 session into doctests. It does so by:
3210 3210
3211 3211 - Changing the prompts to the classic ``>>>`` ones.
3212 3212 - Changing the exception reporting mode to 'Plain'.
3213 3213 - Disabling pretty-printing of output.
3214 3214
3215 3215 Note that IPython also supports the pasting of code snippets that have
3216 3216 leading '>>>' and '...' prompts in them. This means that you can paste
3217 3217 doctests from files or docstrings (even if they have leading
3218 3218 whitespace), and the code will execute correctly. You can then use
3219 3219 '%history -t' to see the translated history; this will give you the
3220 3220 input after removal of all the leading prompts and whitespace, which
3221 3221 can be pasted back into an editor.
3222 3222
3223 3223 With these features, you can switch into this mode easily whenever you
3224 3224 need to do testing and changes to doctests, without having to leave
3225 3225 your existing IPython session.
3226 3226 """
3227 3227
3228 3228 from IPython.utils.ipstruct import Struct
3229 3229
3230 3230 # Shorthands
3231 3231 shell = self.shell
3232 3232 oc = shell.displayhook
3233 3233 meta = shell.meta
3234 3234 disp_formatter = self.shell.display_formatter
3235 3235 ptformatter = disp_formatter.formatters['text/plain']
3236 3236 # dstore is a data store kept in the instance metadata bag to track any
3237 3237 # changes we make, so we can undo them later.
3238 3238 dstore = meta.setdefault('doctest_mode',Struct())
3239 3239 save_dstore = dstore.setdefault
3240 3240
3241 3241 # save a few values we'll need to recover later
3242 3242 mode = save_dstore('mode',False)
3243 3243 save_dstore('rc_pprint',ptformatter.pprint)
3244 3244 save_dstore('xmode',shell.InteractiveTB.mode)
3245 3245 save_dstore('rc_separate_out',shell.separate_out)
3246 3246 save_dstore('rc_separate_out2',shell.separate_out2)
3247 3247 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3248 3248 save_dstore('rc_separate_in',shell.separate_in)
3249 3249 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
3250 3250
3251 3251 if mode == False:
3252 3252 # turn on
3253 3253 oc.prompt1.p_template = '>>> '
3254 3254 oc.prompt2.p_template = '... '
3255 3255 oc.prompt_out.p_template = ''
3256 3256
3257 3257 # Prompt separators like plain python
3258 3258 oc.input_sep = oc.prompt1.sep = ''
3259 3259 oc.output_sep = ''
3260 3260 oc.output_sep2 = ''
3261 3261
3262 3262 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3263 3263 oc.prompt_out.pad_left = False
3264 3264
3265 3265 ptformatter.pprint = False
3266 3266 disp_formatter.plain_text_only = True
3267 3267
3268 3268 shell.magic_xmode('Plain')
3269 3269 else:
3270 3270 # turn off
3271 3271 oc.prompt1.p_template = shell.prompt_in1
3272 3272 oc.prompt2.p_template = shell.prompt_in2
3273 3273 oc.prompt_out.p_template = shell.prompt_out
3274 3274
3275 3275 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3276 3276
3277 3277 oc.output_sep = dstore.rc_separate_out
3278 3278 oc.output_sep2 = dstore.rc_separate_out2
3279 3279
3280 3280 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3281 3281 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3282 3282
3283 3283 ptformatter.pprint = dstore.rc_pprint
3284 3284 disp_formatter.plain_text_only = dstore.rc_plain_text_only
3285 3285
3286 3286 shell.magic_xmode(dstore.xmode)
3287 3287
3288 3288 # Store new mode and inform
3289 3289 dstore.mode = bool(1-int(mode))
3290 3290 mode_label = ['OFF','ON'][dstore.mode]
3291 3291 print 'Doctest mode is:', mode_label
3292 3292
3293 3293 def magic_gui(self, parameter_s=''):
3294 3294 """Enable or disable IPython GUI event loop integration.
3295 3295
3296 3296 %gui [GUINAME]
3297 3297
3298 3298 This magic replaces IPython's threaded shells that were activated
3299 3299 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3300 3300 can now be enabled, disabled and changed at runtime and keyboard
3301 3301 interrupts should work without any problems. The following toolkits
3302 3302 are supported: wxPython, PyQt4, PyGTK, and Tk::
3303 3303
3304 3304 %gui wx # enable wxPython event loop integration
3305 3305 %gui qt4|qt # enable PyQt4 event loop integration
3306 3306 %gui gtk # enable PyGTK event loop integration
3307 3307 %gui tk # enable Tk event loop integration
3308 3308 %gui # disable all event loop integration
3309 3309
3310 3310 WARNING: after any of these has been called you can simply create
3311 3311 an application object, but DO NOT start the event loop yourself, as
3312 3312 we have already handled that.
3313 3313 """
3314 3314 from IPython.lib.inputhook import enable_gui
3315 3315 opts, arg = self.parse_options(parameter_s, '')
3316 3316 if arg=='': arg = None
3317 3317 return enable_gui(arg)
3318 3318
3319 3319 def magic_load_ext(self, module_str):
3320 3320 """Load an IPython extension by its module name."""
3321 3321 return self.extension_manager.load_extension(module_str)
3322 3322
3323 3323 def magic_unload_ext(self, module_str):
3324 3324 """Unload an IPython extension by its module name."""
3325 3325 self.extension_manager.unload_extension(module_str)
3326 3326
3327 3327 def magic_reload_ext(self, module_str):
3328 3328 """Reload an IPython extension by its module name."""
3329 3329 self.extension_manager.reload_extension(module_str)
3330 3330
3331 @testdec.skip_doctest
3331 @skip_doctest
3332 3332 def magic_install_profiles(self, s):
3333 3333 """Install the default IPython profiles into the .ipython dir.
3334 3334
3335 3335 If the default profiles have already been installed, they will not
3336 3336 be overwritten. You can force overwriting them by using the ``-o``
3337 3337 option::
3338 3338
3339 3339 In [1]: %install_profiles -o
3340 3340 """
3341 3341 if '-o' in s:
3342 3342 overwrite = True
3343 3343 else:
3344 3344 overwrite = False
3345 3345 from IPython.config import profile
3346 3346 profile_dir = os.path.split(profile.__file__)[0]
3347 3347 ipython_dir = self.ipython_dir
3348 3348 files = os.listdir(profile_dir)
3349 3349
3350 3350 to_install = []
3351 3351 for f in files:
3352 3352 if f.startswith('ipython_config'):
3353 3353 src = os.path.join(profile_dir, f)
3354 3354 dst = os.path.join(ipython_dir, f)
3355 3355 if (not os.path.isfile(dst)) or overwrite:
3356 3356 to_install.append((f, src, dst))
3357 3357 if len(to_install)>0:
3358 3358 print "Installing profiles to: ", ipython_dir
3359 3359 for (f, src, dst) in to_install:
3360 3360 shutil.copy(src, dst)
3361 3361 print " %s" % f
3362 3362
3363 3363 def magic_install_default_config(self, s):
3364 3364 """Install IPython's default config file into the .ipython dir.
3365 3365
3366 3366 If the default config file (:file:`ipython_config.py`) is already
3367 3367 installed, it will not be overwritten. You can force overwriting
3368 3368 by using the ``-o`` option::
3369 3369
3370 3370 In [1]: %install_default_config
3371 3371 """
3372 3372 if '-o' in s:
3373 3373 overwrite = True
3374 3374 else:
3375 3375 overwrite = False
3376 3376 from IPython.config import default
3377 3377 config_dir = os.path.split(default.__file__)[0]
3378 3378 ipython_dir = self.ipython_dir
3379 3379 default_config_file_name = 'ipython_config.py'
3380 3380 src = os.path.join(config_dir, default_config_file_name)
3381 3381 dst = os.path.join(ipython_dir, default_config_file_name)
3382 3382 if (not os.path.isfile(dst)) or overwrite:
3383 3383 shutil.copy(src, dst)
3384 3384 print "Installing default config file: %s" % dst
3385 3385
3386 3386 # Pylab support: simple wrappers that activate pylab, load gui input
3387 3387 # handling and modify slightly %run
3388 3388
3389 @testdec.skip_doctest
3389 @skip_doctest
3390 3390 def _pylab_magic_run(self, parameter_s=''):
3391 3391 Magic.magic_run(self, parameter_s,
3392 3392 runner=mpl_runner(self.shell.safe_execfile))
3393 3393
3394 3394 _pylab_magic_run.__doc__ = magic_run.__doc__
3395 3395
3396 @testdec.skip_doctest
3396 @skip_doctest
3397 3397 def magic_pylab(self, s):
3398 3398 """Load numpy and matplotlib to work interactively.
3399 3399
3400 3400 %pylab [GUINAME]
3401 3401
3402 3402 This function lets you activate pylab (matplotlib, numpy and
3403 3403 interactive support) at any point during an IPython session.
3404 3404
3405 3405 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3406 3406 pylab and mlab, as well as all names from numpy and pylab.
3407 3407
3408 3408 Parameters
3409 3409 ----------
3410 3410 guiname : optional
3411 3411 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk', 'osx' or
3412 3412 'tk'). If given, the corresponding Matplotlib backend is used,
3413 3413 otherwise matplotlib's default (which you can override in your
3414 3414 matplotlib config file) is used.
3415 3415
3416 3416 Examples
3417 3417 --------
3418 3418 In this case, where the MPL default is TkAgg:
3419 3419 In [2]: %pylab
3420 3420
3421 3421 Welcome to pylab, a matplotlib-based Python environment.
3422 3422 Backend in use: TkAgg
3423 3423 For more information, type 'help(pylab)'.
3424 3424
3425 3425 But you can explicitly request a different backend:
3426 3426 In [3]: %pylab qt
3427 3427
3428 3428 Welcome to pylab, a matplotlib-based Python environment.
3429 3429 Backend in use: Qt4Agg
3430 3430 For more information, type 'help(pylab)'.
3431 3431 """
3432 3432 self.shell.enable_pylab(s)
3433 3433
3434 3434 def magic_tb(self, s):
3435 3435 """Print the last traceback with the currently active exception mode.
3436 3436
3437 3437 See %xmode for changing exception reporting modes."""
3438 3438 self.shell.showtraceback()
3439 3439
3440 @testdec.skip_doctest
3440 @skip_doctest
3441 3441 def magic_precision(self, s=''):
3442 3442 """Set floating point precision for pretty printing.
3443 3443
3444 3444 Can set either integer precision or a format string.
3445 3445
3446 3446 If numpy has been imported and precision is an int,
3447 3447 numpy display precision will also be set, via ``numpy.set_printoptions``.
3448 3448
3449 3449 If no argument is given, defaults will be restored.
3450 3450
3451 3451 Examples
3452 3452 --------
3453 3453 ::
3454 3454
3455 3455 In [1]: from math import pi
3456 3456
3457 3457 In [2]: %precision 3
3458 3458 Out[2]: '%.3f'
3459 3459
3460 3460 In [3]: pi
3461 3461 Out[3]: 3.142
3462 3462
3463 3463 In [4]: %precision %i
3464 3464 Out[4]: '%i'
3465 3465
3466 3466 In [5]: pi
3467 3467 Out[5]: 3
3468 3468
3469 3469 In [6]: %precision %e
3470 3470 Out[6]: '%e'
3471 3471
3472 3472 In [7]: pi**10
3473 3473 Out[7]: 9.364805e+04
3474 3474
3475 3475 In [8]: %precision
3476 3476 Out[8]: '%r'
3477 3477
3478 3478 In [9]: pi**10
3479 3479 Out[9]: 93648.047476082982
3480 3480
3481 3481 """
3482 3482
3483 3483 ptformatter = self.shell.display_formatter.formatters['text/plain']
3484 3484 ptformatter.float_precision = s
3485 3485 return ptformatter.float_format
3486 3486
3487 3487 # end Magic
@@ -1,294 +1,294 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3
4 4 """Magic command interface for interactive parallel work."""
5 5
6 6 #-----------------------------------------------------------------------------
7 7 # Copyright (C) 2008-2009 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 import ast
18 18 import re
19 19
20 20 from IPython.core.plugin import Plugin
21 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 25 # Definitions of magic functions for use with IPython
26 26 #-----------------------------------------------------------------------------
27 27
28 28
29 29 NO_ACTIVE_VIEW = """
30 30 Use activate() on a DirectView object to activate it for magics.
31 31 """
32 32
33 33
34 34 class ParalleMagic(Plugin):
35 35 """A component to manage the %result, %px and %autopx magics."""
36 36
37 37 active_view = Instance('IPython.parallel.client.view.DirectView')
38 38 verbose = Bool(False, config=True)
39 39 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
40 40
41 41 def __init__(self, shell=None, config=None):
42 42 super(ParalleMagic, self).__init__(shell=shell, config=config)
43 43 self._define_magics()
44 44 # A flag showing if autopx is activated or not
45 45 self.autopx = False
46 46
47 47 def _define_magics(self):
48 48 """Define the magic functions."""
49 49 self.shell.define_magic('result', self.magic_result)
50 50 self.shell.define_magic('px', self.magic_px)
51 51 self.shell.define_magic('autopx', self.magic_autopx)
52 52
53 @testdec.skip_doctest
53 @skip_doctest
54 54 def magic_result(self, ipself, parameter_s=''):
55 55 """Print the result of command i on all engines..
56 56
57 57 To use this a :class:`DirectView` instance must be created
58 58 and then activated by calling its :meth:`activate` method.
59 59
60 60 Then you can do the following::
61 61
62 62 In [23]: %result
63 63 Out[23]:
64 64 <Results List>
65 65 [0] In [6]: a = 10
66 66 [1] In [6]: a = 10
67 67
68 68 In [22]: %result 6
69 69 Out[22]:
70 70 <Results List>
71 71 [0] In [6]: a = 10
72 72 [1] In [6]: a = 10
73 73 """
74 74 if self.active_view is None:
75 75 print NO_ACTIVE_VIEW
76 76 return
77 77
78 78 try:
79 79 index = int(parameter_s)
80 80 except:
81 81 index = None
82 82 result = self.active_view.get_result(index)
83 83 return result
84 84
85 @testdec.skip_doctest
85 @skip_doctest
86 86 def magic_px(self, ipself, parameter_s=''):
87 87 """Executes the given python command in parallel.
88 88
89 89 To use this a :class:`DirectView` instance must be created
90 90 and then activated by calling its :meth:`activate` method.
91 91
92 92 Then you can do the following::
93 93
94 94 In [24]: %px a = 5
95 95 Parallel execution on engines: all
96 96 Out[24]:
97 97 <Results List>
98 98 [0] In [7]: a = 5
99 99 [1] In [7]: a = 5
100 100 """
101 101
102 102 if self.active_view is None:
103 103 print NO_ACTIVE_VIEW
104 104 return
105 105 print "Parallel execution on engines: %s" % self.active_view.targets
106 106 result = self.active_view.execute(parameter_s, block=False)
107 107 if self.active_view.block:
108 108 result.get()
109 109 self._maybe_display_output(result)
110 110
111 @testdec.skip_doctest
111 @skip_doctest
112 112 def magic_autopx(self, ipself, parameter_s=''):
113 113 """Toggles auto parallel mode.
114 114
115 115 To use this a :class:`DirectView` instance must be created
116 116 and then activated by calling its :meth:`activate` method. Once this
117 117 is called, all commands typed at the command line are send to
118 118 the engines to be executed in parallel. To control which engine
119 119 are used, set the ``targets`` attributed of the multiengine client
120 120 before entering ``%autopx`` mode.
121 121
122 122 Then you can do the following::
123 123
124 124 In [25]: %autopx
125 125 %autopx to enabled
126 126
127 127 In [26]: a = 10
128 128 Parallel execution on engines: [0,1,2,3]
129 129 In [27]: print a
130 130 Parallel execution on engines: [0,1,2,3]
131 131 [stdout:0] 10
132 132 [stdout:1] 10
133 133 [stdout:2] 10
134 134 [stdout:3] 10
135 135
136 136
137 137 In [27]: %autopx
138 138 %autopx disabled
139 139 """
140 140 if self.autopx:
141 141 self._disable_autopx()
142 142 else:
143 143 self._enable_autopx()
144 144
145 145 def _enable_autopx(self):
146 146 """Enable %autopx mode by saving the original run_cell and installing
147 147 pxrun_cell.
148 148 """
149 149 if self.active_view is None:
150 150 print NO_ACTIVE_VIEW
151 151 return
152 152
153 153 # override run_cell and run_code
154 154 self._original_run_cell = self.shell.run_cell
155 155 self.shell.run_cell = self.pxrun_cell
156 156 self._original_run_code = self.shell.run_code
157 157 self.shell.run_code = self.pxrun_code
158 158
159 159 self.autopx = True
160 160 print "%autopx enabled"
161 161
162 162 def _disable_autopx(self):
163 163 """Disable %autopx by restoring the original InteractiveShell.run_cell.
164 164 """
165 165 if self.autopx:
166 166 self.shell.run_cell = self._original_run_cell
167 167 self.shell.run_code = self._original_run_code
168 168 self.autopx = False
169 169 print "%autopx disabled"
170 170
171 171 def _maybe_display_output(self, result):
172 172 """Maybe display the output of a parallel result.
173 173
174 174 If self.active_view.block is True, wait for the result
175 175 and display the result. Otherwise, this is a noop.
176 176 """
177 177 targets = self.active_view.targets
178 178 if isinstance(targets, int):
179 179 targets = [targets]
180 180 if targets == 'all':
181 181 targets = self.active_view.client.ids
182 182 stdout = [s.rstrip() for s in result.stdout]
183 183 if any(stdout):
184 184 for i,eid in enumerate(targets):
185 185 print '[stdout:%i]'%eid, stdout[i]
186 186
187 187
188 188 def pxrun_cell(self, raw_cell, store_history=True):
189 189 """drop-in replacement for InteractiveShell.run_cell.
190 190
191 191 This executes code remotely, instead of in the local namespace.
192 192
193 193 See InteractiveShell.run_cell for details.
194 194 """
195 195
196 196 if (not raw_cell) or raw_cell.isspace():
197 197 return
198 198
199 199 ipself = self.shell
200 200
201 201 with ipself.builtin_trap:
202 202 cell = ipself.prefilter_manager.prefilter_lines(raw_cell)
203 203
204 204 # Store raw and processed history
205 205 if store_history:
206 206 ipself.history_manager.store_inputs(ipself.execution_count,
207 207 cell, raw_cell)
208 208
209 209 # ipself.logger.log(cell, raw_cell)
210 210
211 211 cell_name = ipself.compile.cache(cell, ipself.execution_count)
212 212
213 213 try:
214 214 code_ast = ast.parse(cell, filename=cell_name)
215 215 except (OverflowError, SyntaxError, ValueError, TypeError, MemoryError):
216 216 # Case 1
217 217 ipself.showsyntaxerror()
218 218 ipself.execution_count += 1
219 219 return None
220 220 except NameError:
221 221 # ignore name errors, because we don't know the remote keys
222 222 pass
223 223
224 224 if store_history:
225 225 # Write output to the database. Does nothing unless
226 226 # history output logging is enabled.
227 227 ipself.history_manager.store_output(ipself.execution_count)
228 228 # Each cell is a *single* input, regardless of how many lines it has
229 229 ipself.execution_count += 1
230 230
231 231 if re.search(r'get_ipython\(\)\.magic\(u?"%?autopx', cell):
232 232 self._disable_autopx()
233 233 return False
234 234 else:
235 235 try:
236 236 result = self.active_view.execute(cell, block=False)
237 237 except:
238 238 ipself.showtraceback()
239 239 return True
240 240 else:
241 241 if self.active_view.block:
242 242 try:
243 243 result.get()
244 244 except:
245 245 self.shell.showtraceback()
246 246 return True
247 247 else:
248 248 self._maybe_display_output(result)
249 249 return False
250 250
251 251 def pxrun_code(self, code_obj):
252 252 """drop-in replacement for InteractiveShell.run_code.
253 253
254 254 This executes code remotely, instead of in the local namespace.
255 255
256 256 See InteractiveShell.run_code for details.
257 257 """
258 258 ipself = self.shell
259 259 # check code object for the autopx magic
260 260 if 'get_ipython' in code_obj.co_names and 'magic' in code_obj.co_names and \
261 261 any( [ isinstance(c, basestring) and 'autopx' in c for c in code_obj.co_consts ]):
262 262 self._disable_autopx()
263 263 return False
264 264 else:
265 265 try:
266 266 result = self.active_view.execute(code_obj, block=False)
267 267 except:
268 268 ipself.showtraceback()
269 269 return True
270 270 else:
271 271 if self.active_view.block:
272 272 try:
273 273 result.get()
274 274 except:
275 275 self.shell.showtraceback()
276 276 return True
277 277 else:
278 278 self._maybe_display_output(result)
279 279 return False
280 280
281 281
282 282
283 283
284 284 _loaded = False
285 285
286 286
287 287 def load_ipython_extension(ip):
288 288 """Load the extension in IPython."""
289 289 global _loaded
290 290 if not _loaded:
291 291 plugin = ParalleMagic(shell=ip, config=ip.config)
292 292 ip.plugin_manager.register_plugin('parallelmagic', plugin)
293 293 _loaded = True
294 294
@@ -1,558 +1,558 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Subclass of InteractiveShell for terminal based frontends."""
3 3
4 4 #-----------------------------------------------------------------------------
5 5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 7 # Copyright (C) 2008-2010 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 import __builtin__
18 18 import bdb
19 19 from contextlib import nested
20 20 import os
21 21 import re
22 22 import sys
23 23
24 24 from IPython.core.error import TryNext
25 25 from IPython.core.usage import interactive_usage, default_banner
26 26 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
27 27 from IPython.lib.inputhook import enable_gui
28 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 30 from IPython.utils.terminal import toggle_set_term_title, set_term_title
31 31 from IPython.utils.process import abbrev_cwd
32 32 from IPython.utils.warn import warn
33 33 from IPython.utils.text import num_ini_spaces
34 34 from IPython.utils.traitlets import Int, Str, CBool, Unicode
35 35
36 36 #-----------------------------------------------------------------------------
37 37 # Utilities
38 38 #-----------------------------------------------------------------------------
39 39
40 40 def get_default_editor():
41 41 try:
42 42 ed = os.environ['EDITOR']
43 43 except KeyError:
44 44 if os.name == 'posix':
45 45 ed = 'vi' # the only one guaranteed to be there!
46 46 else:
47 47 ed = 'notepad' # same in Windows!
48 48 return ed
49 49
50 50
51 51 # store the builtin raw_input globally, and use this always, in case user code
52 52 # overwrites it (like wx.py.PyShell does)
53 53 raw_input_original = raw_input
54 54
55 55 #-----------------------------------------------------------------------------
56 56 # Main class
57 57 #-----------------------------------------------------------------------------
58 58
59 59 class TerminalInteractiveShell(InteractiveShell):
60 60
61 61 autoedit_syntax = CBool(False, config=True)
62 62 banner = Unicode('')
63 63 banner1 = Unicode(default_banner, config=True)
64 64 banner2 = Unicode('', config=True)
65 65 confirm_exit = CBool(True, config=True)
66 66 # This display_banner only controls whether or not self.show_banner()
67 67 # is called when mainloop/interact are called. The default is False
68 68 # because for the terminal based application, the banner behavior
69 69 # is controlled by Global.display_banner, which IPythonApp looks at
70 70 # to determine if *it* should call show_banner() by hand or not.
71 71 display_banner = CBool(False) # This isn't configurable!
72 72 embedded = CBool(False)
73 73 embedded_active = CBool(False)
74 74 editor = Unicode(get_default_editor(), config=True)
75 75 pager = Unicode('less', config=True)
76 76
77 77 screen_length = Int(0, config=True)
78 78 term_title = CBool(False, config=True)
79 79
80 80 def __init__(self, config=None, ipython_dir=None, user_ns=None,
81 81 user_global_ns=None, custom_exceptions=((),None),
82 82 usage=None, banner1=None, banner2=None,
83 83 display_banner=None):
84 84
85 85 super(TerminalInteractiveShell, self).__init__(
86 86 config=config, ipython_dir=ipython_dir, user_ns=user_ns,
87 87 user_global_ns=user_global_ns, custom_exceptions=custom_exceptions
88 88 )
89 89 self.init_term_title()
90 90 self.init_usage(usage)
91 91 self.init_banner(banner1, banner2, display_banner)
92 92
93 93 #-------------------------------------------------------------------------
94 94 # Things related to the terminal
95 95 #-------------------------------------------------------------------------
96 96
97 97 @property
98 98 def usable_screen_length(self):
99 99 if self.screen_length == 0:
100 100 return 0
101 101 else:
102 102 num_lines_bot = self.separate_in.count('\n')+1
103 103 return self.screen_length - num_lines_bot
104 104
105 105 def init_term_title(self):
106 106 # Enable or disable the terminal title.
107 107 if self.term_title:
108 108 toggle_set_term_title(True)
109 109 set_term_title('IPython: ' + abbrev_cwd())
110 110 else:
111 111 toggle_set_term_title(False)
112 112
113 113 #-------------------------------------------------------------------------
114 114 # Things related to aliases
115 115 #-------------------------------------------------------------------------
116 116
117 117 def init_alias(self):
118 118 # The parent class defines aliases that can be safely used with any
119 119 # frontend.
120 120 super(TerminalInteractiveShell, self).init_alias()
121 121
122 122 # Now define aliases that only make sense on the terminal, because they
123 123 # need direct access to the console in a way that we can't emulate in
124 124 # GUI or web frontend
125 125 if os.name == 'posix':
126 126 aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
127 127 ('man', 'man')]
128 128 elif os.name == 'nt':
129 129 aliases = [('cls', 'cls')]
130 130
131 131
132 132 for name, cmd in aliases:
133 133 self.alias_manager.define_alias(name, cmd)
134 134
135 135 #-------------------------------------------------------------------------
136 136 # Things related to the banner and usage
137 137 #-------------------------------------------------------------------------
138 138
139 139 def _banner1_changed(self):
140 140 self.compute_banner()
141 141
142 142 def _banner2_changed(self):
143 143 self.compute_banner()
144 144
145 145 def _term_title_changed(self, name, new_value):
146 146 self.init_term_title()
147 147
148 148 def init_banner(self, banner1, banner2, display_banner):
149 149 if banner1 is not None:
150 150 self.banner1 = banner1
151 151 if banner2 is not None:
152 152 self.banner2 = banner2
153 153 if display_banner is not None:
154 154 self.display_banner = display_banner
155 155 self.compute_banner()
156 156
157 157 def show_banner(self, banner=None):
158 158 if banner is None:
159 159 banner = self.banner
160 160 self.write(banner)
161 161
162 162 def compute_banner(self):
163 163 self.banner = self.banner1
164 164 if self.profile:
165 165 self.banner += '\nIPython profile: %s\n' % self.profile
166 166 if self.banner2:
167 167 self.banner += '\n' + self.banner2
168 168
169 169 def init_usage(self, usage=None):
170 170 if usage is None:
171 171 self.usage = interactive_usage
172 172 else:
173 173 self.usage = usage
174 174
175 175 #-------------------------------------------------------------------------
176 176 # Mainloop and code execution logic
177 177 #-------------------------------------------------------------------------
178 178
179 179 def mainloop(self, display_banner=None):
180 180 """Start the mainloop.
181 181
182 182 If an optional banner argument is given, it will override the
183 183 internally created default banner.
184 184 """
185 185
186 186 with nested(self.builtin_trap, self.display_trap):
187 187
188 188 while 1:
189 189 try:
190 190 self.interact(display_banner=display_banner)
191 191 #self.interact_with_readline()
192 192 # XXX for testing of a readline-decoupled repl loop, call
193 193 # interact_with_readline above
194 194 break
195 195 except KeyboardInterrupt:
196 196 # this should not be necessary, but KeyboardInterrupt
197 197 # handling seems rather unpredictable...
198 198 self.write("\nKeyboardInterrupt in interact()\n")
199 199
200 200 def interact(self, display_banner=None):
201 201 """Closely emulate the interactive Python console."""
202 202
203 203 # batch run -> do not interact
204 204 if self.exit_now:
205 205 return
206 206
207 207 if display_banner is None:
208 208 display_banner = self.display_banner
209 209 if display_banner:
210 210 self.show_banner()
211 211
212 212 more = False
213 213
214 214 # Mark activity in the builtins
215 215 __builtin__.__dict__['__IPYTHON__active'] += 1
216 216
217 217 if self.has_readline:
218 218 self.readline_startup_hook(self.pre_readline)
219 219 # exit_now is set by a call to %Exit or %Quit, through the
220 220 # ask_exit callback.
221 221
222 222 while not self.exit_now:
223 223 self.hooks.pre_prompt_hook()
224 224 if more:
225 225 try:
226 226 prompt = self.hooks.generate_prompt(True)
227 227 except:
228 228 self.showtraceback()
229 229 if self.autoindent:
230 230 self.rl_do_indent = True
231 231
232 232 else:
233 233 try:
234 234 prompt = self.hooks.generate_prompt(False)
235 235 except:
236 236 self.showtraceback()
237 237 try:
238 238 line = self.raw_input(prompt)
239 239 if self.exit_now:
240 240 # quick exit on sys.std[in|out] close
241 241 break
242 242 if self.autoindent:
243 243 self.rl_do_indent = False
244 244
245 245 except KeyboardInterrupt:
246 246 #double-guard against keyboardinterrupts during kbdint handling
247 247 try:
248 248 self.write('\nKeyboardInterrupt\n')
249 249 self.input_splitter.reset()
250 250 more = False
251 251 except KeyboardInterrupt:
252 252 pass
253 253 except EOFError:
254 254 if self.autoindent:
255 255 self.rl_do_indent = False
256 256 if self.has_readline:
257 257 self.readline_startup_hook(None)
258 258 self.write('\n')
259 259 self.exit()
260 260 except bdb.BdbQuit:
261 261 warn('The Python debugger has exited with a BdbQuit exception.\n'
262 262 'Because of how pdb handles the stack, it is impossible\n'
263 263 'for IPython to properly format this particular exception.\n'
264 264 'IPython will resume normal operation.')
265 265 except:
266 266 # exceptions here are VERY RARE, but they can be triggered
267 267 # asynchronously by signal handlers, for example.
268 268 self.showtraceback()
269 269 else:
270 270 self.input_splitter.push(line)
271 271 more = self.input_splitter.push_accepts_more()
272 272 if (self.SyntaxTB.last_syntax_error and
273 273 self.autoedit_syntax):
274 274 self.edit_syntax_error()
275 275 if not more:
276 276 source_raw = self.input_splitter.source_raw_reset()[1]
277 277 self.run_cell(source_raw)
278 278
279 279 # We are off again...
280 280 __builtin__.__dict__['__IPYTHON__active'] -= 1
281 281
282 282 # Turn off the exit flag, so the mainloop can be restarted if desired
283 283 self.exit_now = False
284 284
285 285 def raw_input(self, prompt=''):
286 286 """Write a prompt and read a line.
287 287
288 288 The returned line does not include the trailing newline.
289 289 When the user enters the EOF key sequence, EOFError is raised.
290 290
291 291 Optional inputs:
292 292
293 293 - prompt(''): a string to be printed to prompt the user.
294 294
295 295 - continue_prompt(False): whether this line is the first one or a
296 296 continuation in a sequence of inputs.
297 297 """
298 298 # Code run by the user may have modified the readline completer state.
299 299 # We must ensure that our completer is back in place.
300 300
301 301 if self.has_readline:
302 302 self.set_readline_completer()
303 303
304 304 try:
305 305 line = raw_input_original(prompt).decode(self.stdin_encoding)
306 306 except ValueError:
307 307 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
308 308 " or sys.stdout.close()!\nExiting IPython!")
309 309 self.ask_exit()
310 310 return ""
311 311
312 312 # Try to be reasonably smart about not re-indenting pasted input more
313 313 # than necessary. We do this by trimming out the auto-indent initial
314 314 # spaces, if the user's actual input started itself with whitespace.
315 315 if self.autoindent:
316 316 if num_ini_spaces(line) > self.indent_current_nsp:
317 317 line = line[self.indent_current_nsp:]
318 318 self.indent_current_nsp = 0
319 319
320 320 return line
321 321
322 322 #-------------------------------------------------------------------------
323 323 # Methods to support auto-editing of SyntaxErrors.
324 324 #-------------------------------------------------------------------------
325 325
326 326 def edit_syntax_error(self):
327 327 """The bottom half of the syntax error handler called in the main loop.
328 328
329 329 Loop until syntax error is fixed or user cancels.
330 330 """
331 331
332 332 while self.SyntaxTB.last_syntax_error:
333 333 # copy and clear last_syntax_error
334 334 err = self.SyntaxTB.clear_err_state()
335 335 if not self._should_recompile(err):
336 336 return
337 337 try:
338 338 # may set last_syntax_error again if a SyntaxError is raised
339 339 self.safe_execfile(err.filename,self.user_ns)
340 340 except:
341 341 self.showtraceback()
342 342 else:
343 343 try:
344 344 f = file(err.filename)
345 345 try:
346 346 # This should be inside a display_trap block and I
347 347 # think it is.
348 348 sys.displayhook(f.read())
349 349 finally:
350 350 f.close()
351 351 except:
352 352 self.showtraceback()
353 353
354 354 def _should_recompile(self,e):
355 355 """Utility routine for edit_syntax_error"""
356 356
357 357 if e.filename in ('<ipython console>','<input>','<string>',
358 358 '<console>','<BackgroundJob compilation>',
359 359 None):
360 360
361 361 return False
362 362 try:
363 363 if (self.autoedit_syntax and
364 364 not self.ask_yes_no('Return to editor to correct syntax error? '
365 365 '[Y/n] ','y')):
366 366 return False
367 367 except EOFError:
368 368 return False
369 369
370 370 def int0(x):
371 371 try:
372 372 return int(x)
373 373 except TypeError:
374 374 return 0
375 375 # always pass integer line and offset values to editor hook
376 376 try:
377 377 self.hooks.fix_error_editor(e.filename,
378 378 int0(e.lineno),int0(e.offset),e.msg)
379 379 except TryNext:
380 380 warn('Could not open editor')
381 381 return False
382 382 return True
383 383
384 384 #-------------------------------------------------------------------------
385 385 # Things related to GUI support and pylab
386 386 #-------------------------------------------------------------------------
387 387
388 388 def enable_pylab(self, gui=None):
389 389 """Activate pylab support at runtime.
390 390
391 391 This turns on support for matplotlib, preloads into the interactive
392 392 namespace all of numpy and pylab, and configures IPython to correcdtly
393 393 interact with the GUI event loop. The GUI backend to be used can be
394 394 optionally selected with the optional :param:`gui` argument.
395 395
396 396 Parameters
397 397 ----------
398 398 gui : optional, string
399 399
400 400 If given, dictates the choice of matplotlib GUI backend to use
401 401 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
402 402 'gtk'), otherwise we use the default chosen by matplotlib (as
403 403 dictated by the matplotlib build-time options plus the user's
404 404 matplotlibrc configuration file).
405 405 """
406 406 # We want to prevent the loading of pylab to pollute the user's
407 407 # namespace as shown by the %who* magics, so we execute the activation
408 408 # code in an empty namespace, and we update *both* user_ns and
409 409 # user_ns_hidden with this information.
410 410 ns = {}
411 411 gui = pylab_activate(ns, gui)
412 412 self.user_ns.update(ns)
413 413 self.user_ns_hidden.update(ns)
414 414 # Now we must activate the gui pylab wants to use, and fix %run to take
415 415 # plot updates into account
416 416 enable_gui(gui)
417 417 self.magic_run = self._pylab_magic_run
418 418
419 419 #-------------------------------------------------------------------------
420 420 # Things related to exiting
421 421 #-------------------------------------------------------------------------
422 422
423 423 def ask_exit(self):
424 424 """ Ask the shell to exit. Can be overiden and used as a callback. """
425 425 self.exit_now = True
426 426
427 427 def exit(self):
428 428 """Handle interactive exit.
429 429
430 430 This method calls the ask_exit callback."""
431 431 if self.confirm_exit:
432 432 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
433 433 self.ask_exit()
434 434 else:
435 435 self.ask_exit()
436 436
437 437 #------------------------------------------------------------------------
438 438 # Magic overrides
439 439 #------------------------------------------------------------------------
440 440 # Once the base class stops inheriting from magic, this code needs to be
441 441 # moved into a separate machinery as well. For now, at least isolate here
442 442 # the magics which this class needs to implement differently from the base
443 443 # class, or that are unique to it.
444 444
445 445 def magic_autoindent(self, parameter_s = ''):
446 446 """Toggle autoindent on/off (if available)."""
447 447
448 448 self.shell.set_autoindent()
449 449 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
450 450
451 @testdec.skip_doctest
451 @skip_doctest
452 452 def magic_cpaste(self, parameter_s=''):
453 453 """Paste & execute a pre-formatted code block from clipboard.
454 454
455 455 You must terminate the block with '--' (two minus-signs) alone on the
456 456 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
457 457 is the new sentinel for this operation)
458 458
459 459 The block is dedented prior to execution to enable execution of method
460 460 definitions. '>' and '+' characters at the beginning of a line are
461 461 ignored, to allow pasting directly from e-mails, diff files and
462 462 doctests (the '...' continuation prompt is also stripped). The
463 463 executed block is also assigned to variable named 'pasted_block' for
464 464 later editing with '%edit pasted_block'.
465 465
466 466 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
467 467 This assigns the pasted block to variable 'foo' as string, without
468 468 dedenting or executing it (preceding >>> and + is still stripped)
469 469
470 470 '%cpaste -r' re-executes the block previously entered by cpaste.
471 471
472 472 Do not be alarmed by garbled output on Windows (it's a readline bug).
473 473 Just press enter and type -- (and press enter again) and the block
474 474 will be what was just pasted.
475 475
476 476 IPython statements (magics, shell escapes) are not supported (yet).
477 477
478 478 See also
479 479 --------
480 480 paste: automatically pull code from clipboard.
481 481
482 482 Examples
483 483 --------
484 484 ::
485 485
486 486 In [8]: %cpaste
487 487 Pasting code; enter '--' alone on the line to stop.
488 488 :>>> a = ["world!", "Hello"]
489 489 :>>> print " ".join(sorted(a))
490 490 :--
491 491 Hello world!
492 492 """
493 493
494 494 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
495 495 par = args.strip()
496 496 if opts.has_key('r'):
497 497 self._rerun_pasted()
498 498 return
499 499
500 500 sentinel = opts.get('s','--')
501 501
502 502 block = self._strip_pasted_lines_for_code(
503 503 self._get_pasted_lines(sentinel))
504 504
505 505 self._execute_block(block, par)
506 506
507 507 def magic_paste(self, parameter_s=''):
508 508 """Paste & execute a pre-formatted code block from clipboard.
509 509
510 510 The text is pulled directly from the clipboard without user
511 511 intervention and printed back on the screen before execution (unless
512 512 the -q flag is given to force quiet mode).
513 513
514 514 The block is dedented prior to execution to enable execution of method
515 515 definitions. '>' and '+' characters at the beginning of a line are
516 516 ignored, to allow pasting directly from e-mails, diff files and
517 517 doctests (the '...' continuation prompt is also stripped). The
518 518 executed block is also assigned to variable named 'pasted_block' for
519 519 later editing with '%edit pasted_block'.
520 520
521 521 You can also pass a variable name as an argument, e.g. '%paste foo'.
522 522 This assigns the pasted block to variable 'foo' as string, without
523 523 dedenting or executing it (preceding >>> and + is still stripped)
524 524
525 525 Options
526 526 -------
527 527
528 528 -r: re-executes the block previously entered by cpaste.
529 529
530 530 -q: quiet mode: do not echo the pasted text back to the terminal.
531 531
532 532 IPython statements (magics, shell escapes) are not supported (yet).
533 533
534 534 See also
535 535 --------
536 536 cpaste: manually paste code into terminal until you mark its end.
537 537 """
538 538 opts,args = self.parse_options(parameter_s,'rq',mode='string')
539 539 par = args.strip()
540 540 if opts.has_key('r'):
541 541 self._rerun_pasted()
542 542 return
543 543
544 544 text = self.shell.hooks.clipboard_get()
545 545 block = self._strip_pasted_lines_for_code(text.splitlines())
546 546
547 547 # By default, echo back to terminal unless quiet mode is requested
548 548 if not opts.has_key('q'):
549 549 write = self.shell.write
550 550 write(self.shell.pycolorize(block))
551 551 if not block.endswith('\n'):
552 552 write('\n')
553 553 write("## -- End pasted text --\n")
554 554
555 555 self._execute_block(block, par)
556 556
557 557
558 558 InteractiveShellABC.register(TerminalInteractiveShell)
@@ -1,200 +1,200 b''
1 1 """Remote Functions and decorators for Views."""
2 2 #-----------------------------------------------------------------------------
3 3 # Copyright (C) 2010 The IPython Development Team
4 4 #
5 5 # Distributed under the terms of the BSD License. The full license is in
6 6 # the file COPYING, distributed as part of this software.
7 7 #-----------------------------------------------------------------------------
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Imports
11 11 #-----------------------------------------------------------------------------
12 12
13 13 import warnings
14 14
15 from IPython.testing import decorators as testdec
15 from IPython.testing.skipdoctest import skip_doctest
16 16
17 17 from . import map as Map
18 18 from .asyncresult import AsyncMapResult
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Decorators
22 22 #-----------------------------------------------------------------------------
23 23
24 @testdec.skip_doctest
24 @skip_doctest
25 25 def remote(view, block=None, **flags):
26 26 """Turn a function into a remote function.
27 27
28 28 This method can be used for map:
29 29
30 30 In [1]: @remote(view,block=True)
31 31 ...: def func(a):
32 32 ...: pass
33 33 """
34 34
35 35 def remote_function(f):
36 36 return RemoteFunction(view, f, block=block, **flags)
37 37 return remote_function
38 38
39 @testdec.skip_doctest
39 @skip_doctest
40 40 def parallel(view, dist='b', block=None, **flags):
41 41 """Turn a function into a parallel remote function.
42 42
43 43 This method can be used for map:
44 44
45 45 In [1]: @parallel(view, block=True)
46 46 ...: def func(a):
47 47 ...: pass
48 48 """
49 49
50 50 def parallel_function(f):
51 51 return ParallelFunction(view, f, dist=dist, block=block, **flags)
52 52 return parallel_function
53 53
54 54 #--------------------------------------------------------------------------
55 55 # Classes
56 56 #--------------------------------------------------------------------------
57 57
58 58 class RemoteFunction(object):
59 59 """Turn an existing function into a remote function.
60 60
61 61 Parameters
62 62 ----------
63 63
64 64 view : View instance
65 65 The view to be used for execution
66 66 f : callable
67 67 The function to be wrapped into a remote function
68 68 block : bool [default: None]
69 69 Whether to wait for results or not. The default behavior is
70 70 to use the current `block` attribute of `view`
71 71
72 72 **flags : remaining kwargs are passed to View.temp_flags
73 73 """
74 74
75 75 view = None # the remote connection
76 76 func = None # the wrapped function
77 77 block = None # whether to block
78 78 flags = None # dict of extra kwargs for temp_flags
79 79
80 80 def __init__(self, view, f, block=None, **flags):
81 81 self.view = view
82 82 self.func = f
83 83 self.block=block
84 84 self.flags=flags
85 85
86 86 def __call__(self, *args, **kwargs):
87 87 block = self.view.block if self.block is None else self.block
88 88 with self.view.temp_flags(block=block, **self.flags):
89 89 return self.view.apply(self.func, *args, **kwargs)
90 90
91 91
92 92 class ParallelFunction(RemoteFunction):
93 93 """Class for mapping a function to sequences.
94 94
95 95 This will distribute the sequences according the a mapper, and call
96 96 the function on each sub-sequence. If called via map, then the function
97 97 will be called once on each element, rather that each sub-sequence.
98 98
99 99 Parameters
100 100 ----------
101 101
102 102 view : View instance
103 103 The view to be used for execution
104 104 f : callable
105 105 The function to be wrapped into a remote function
106 106 dist : str [default: 'b']
107 107 The key for which mapObject to use to distribute sequences
108 108 options are:
109 109 * 'b' : use contiguous chunks in order
110 110 * 'r' : use round-robin striping
111 111 block : bool [default: None]
112 112 Whether to wait for results or not. The default behavior is
113 113 to use the current `block` attribute of `view`
114 114 chunksize : int or None
115 115 The size of chunk to use when breaking up sequences in a load-balanced manner
116 116 **flags : remaining kwargs are passed to View.temp_flags
117 117 """
118 118
119 119 chunksize=None
120 120 mapObject=None
121 121
122 122 def __init__(self, view, f, dist='b', block=None, chunksize=None, **flags):
123 123 super(ParallelFunction, self).__init__(view, f, block=block, **flags)
124 124 self.chunksize = chunksize
125 125
126 126 mapClass = Map.dists[dist]
127 127 self.mapObject = mapClass()
128 128
129 129 def __call__(self, *sequences):
130 130 # check that the length of sequences match
131 131 len_0 = len(sequences[0])
132 132 for s in sequences:
133 133 if len(s)!=len_0:
134 134 msg = 'all sequences must have equal length, but %i!=%i'%(len_0,len(s))
135 135 raise ValueError(msg)
136 136 balanced = 'Balanced' in self.view.__class__.__name__
137 137 if balanced:
138 138 if self.chunksize:
139 139 nparts = len_0/self.chunksize + int(len_0%self.chunksize > 0)
140 140 else:
141 141 nparts = len_0
142 142 targets = [None]*nparts
143 143 else:
144 144 if self.chunksize:
145 145 warnings.warn("`chunksize` is ignored unless load balancing", UserWarning)
146 146 # multiplexed:
147 147 targets = self.view.targets
148 148 nparts = len(targets)
149 149
150 150 msg_ids = []
151 151 # my_f = lambda *a: map(self.func, *a)
152 152 client = self.view.client
153 153 for index, t in enumerate(targets):
154 154 args = []
155 155 for seq in sequences:
156 156 part = self.mapObject.getPartition(seq, index, nparts)
157 157 if len(part) == 0:
158 158 continue
159 159 else:
160 160 args.append(part)
161 161 if not args:
162 162 continue
163 163
164 164 # print (args)
165 165 if hasattr(self, '_map'):
166 166 f = map
167 167 args = [self.func]+args
168 168 else:
169 169 f=self.func
170 170
171 171 view = self.view if balanced else client[t]
172 172 with view.temp_flags(block=False, **self.flags):
173 173 ar = view.apply(f, *args)
174 174
175 175 msg_ids.append(ar.msg_ids[0])
176 176
177 177 r = AsyncMapResult(self.view.client, msg_ids, self.mapObject, fname=self.func.__name__)
178 178
179 179 if self.block:
180 180 try:
181 181 return r.get()
182 182 except KeyboardInterrupt:
183 183 return r
184 184 else:
185 185 return r
186 186
187 187 def map(self, *sequences):
188 188 """call a function on each element of a sequence remotely.
189 189 This should behave very much like the builtin map, but return an AsyncMapResult
190 190 if self.block is False.
191 191 """
192 192 # set _map as a flag for use inside self.__call__
193 193 self._map = True
194 194 try:
195 195 ret = self.__call__(*sequences)
196 196 finally:
197 197 del self._map
198 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 1 """Views of remote engines."""
2 2 #-----------------------------------------------------------------------------
3 3 # Copyright (C) 2010 The IPython Development Team
4 4 #
5 5 # Distributed under the terms of the BSD License. The full license is in
6 6 # the file COPYING, distributed as part of this software.
7 7 #-----------------------------------------------------------------------------
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Imports
11 11 #-----------------------------------------------------------------------------
12 12
13 13 import imp
14 14 import sys
15 15 import warnings
16 16 from contextlib import contextmanager
17 17 from types import ModuleType
18 18
19 19 import zmq
20 20
21 from IPython.testing import decorators as testdec
21 from IPython.testing.skipdoctest import skip_doctest
22 22 from IPython.utils.traitlets import HasTraits, Any, Bool, List, Dict, Set, Int, Instance, CFloat, CInt
23
24 23 from IPython.external.decorator import decorator
25 24
26 25 from IPython.parallel import util
27 26 from IPython.parallel.controller.dependency import Dependency, dependent
28 27
29 28 from . import map as Map
30 29 from .asyncresult import AsyncResult, AsyncMapResult
31 30 from .remotefunction import ParallelFunction, parallel, remote
32 31
33 32 #-----------------------------------------------------------------------------
34 33 # Decorators
35 34 #-----------------------------------------------------------------------------
36 35
37 36 @decorator
38 37 def save_ids(f, self, *args, **kwargs):
39 38 """Keep our history and outstanding attributes up to date after a method call."""
40 39 n_previous = len(self.client.history)
41 40 try:
42 41 ret = f(self, *args, **kwargs)
43 42 finally:
44 43 nmsgs = len(self.client.history) - n_previous
45 44 msg_ids = self.client.history[-nmsgs:]
46 45 self.history.extend(msg_ids)
47 46 map(self.outstanding.add, msg_ids)
48 47 return ret
49 48
50 49 @decorator
51 50 def sync_results(f, self, *args, **kwargs):
52 51 """sync relevant results from self.client to our results attribute."""
53 52 ret = f(self, *args, **kwargs)
54 53 delta = self.outstanding.difference(self.client.outstanding)
55 54 completed = self.outstanding.intersection(delta)
56 55 self.outstanding = self.outstanding.difference(completed)
57 56 for msg_id in completed:
58 57 self.results[msg_id] = self.client.results[msg_id]
59 58 return ret
60 59
61 60 @decorator
62 61 def spin_after(f, self, *args, **kwargs):
63 62 """call spin after the method."""
64 63 ret = f(self, *args, **kwargs)
65 64 self.spin()
66 65 return ret
67 66
68 67 #-----------------------------------------------------------------------------
69 68 # Classes
70 69 #-----------------------------------------------------------------------------
71 70
72 @testdec.skip_doctest
71 @skip_doctest
73 72 class View(HasTraits):
74 73 """Base View class for more convenint apply(f,*args,**kwargs) syntax via attributes.
75 74
76 75 Don't use this class, use subclasses.
77 76
78 77 Methods
79 78 -------
80 79
81 80 spin
82 81 flushes incoming results and registration state changes
83 82 control methods spin, and requesting `ids` also ensures up to date
84 83
85 84 wait
86 85 wait on one or more msg_ids
87 86
88 87 execution methods
89 88 apply
90 89 legacy: execute, run
91 90
92 91 data movement
93 92 push, pull, scatter, gather
94 93
95 94 query methods
96 95 get_result, queue_status, purge_results, result_status
97 96
98 97 control methods
99 98 abort, shutdown
100 99
101 100 """
102 101 # flags
103 102 block=Bool(False)
104 103 track=Bool(True)
105 104 targets = Any()
106 105
107 106 history=List()
108 107 outstanding = Set()
109 108 results = Dict()
110 109 client = Instance('IPython.parallel.Client')
111 110
112 111 _socket = Instance('zmq.Socket')
113 112 _flag_names = List(['targets', 'block', 'track'])
114 113 _targets = Any()
115 114 _idents = Any()
116 115
117 116 def __init__(self, client=None, socket=None, **flags):
118 117 super(View, self).__init__(client=client, _socket=socket)
119 118 self.block = client.block
120 119
121 120 self.set_flags(**flags)
122 121
123 122 assert not self.__class__ is View, "Don't use base View objects, use subclasses"
124 123
125 124
126 125 def __repr__(self):
127 126 strtargets = str(self.targets)
128 127 if len(strtargets) > 16:
129 128 strtargets = strtargets[:12]+'...]'
130 129 return "<%s %s>"%(self.__class__.__name__, strtargets)
131 130
132 131 def set_flags(self, **kwargs):
133 132 """set my attribute flags by keyword.
134 133
135 134 Views determine behavior with a few attributes (`block`, `track`, etc.).
136 135 These attributes can be set all at once by name with this method.
137 136
138 137 Parameters
139 138 ----------
140 139
141 140 block : bool
142 141 whether to wait for results
143 142 track : bool
144 143 whether to create a MessageTracker to allow the user to
145 144 safely edit after arrays and buffers during non-copying
146 145 sends.
147 146 """
148 147 for name, value in kwargs.iteritems():
149 148 if name not in self._flag_names:
150 149 raise KeyError("Invalid name: %r"%name)
151 150 else:
152 151 setattr(self, name, value)
153 152
154 153 @contextmanager
155 154 def temp_flags(self, **kwargs):
156 155 """temporarily set flags, for use in `with` statements.
157 156
158 157 See set_flags for permanent setting of flags
159 158
160 159 Examples
161 160 --------
162 161
163 162 >>> view.track=False
164 163 ...
165 164 >>> with view.temp_flags(track=True):
166 165 ... ar = view.apply(dostuff, my_big_array)
167 166 ... ar.tracker.wait() # wait for send to finish
168 167 >>> view.track
169 168 False
170 169
171 170 """
172 171 # preflight: save flags, and set temporaries
173 172 saved_flags = {}
174 173 for f in self._flag_names:
175 174 saved_flags[f] = getattr(self, f)
176 175 self.set_flags(**kwargs)
177 176 # yield to the with-statement block
178 177 try:
179 178 yield
180 179 finally:
181 180 # postflight: restore saved flags
182 181 self.set_flags(**saved_flags)
183 182
184 183
185 184 #----------------------------------------------------------------
186 185 # apply
187 186 #----------------------------------------------------------------
188 187
189 188 @sync_results
190 189 @save_ids
191 190 def _really_apply(self, f, args, kwargs, block=None, **options):
192 191 """wrapper for client.send_apply_message"""
193 192 raise NotImplementedError("Implement in subclasses")
194 193
195 194 def apply(self, f, *args, **kwargs):
196 195 """calls f(*args, **kwargs) on remote engines, returning the result.
197 196
198 197 This method sets all apply flags via this View's attributes.
199 198
200 199 if self.block is False:
201 200 returns AsyncResult
202 201 else:
203 202 returns actual result of f(*args, **kwargs)
204 203 """
205 204 return self._really_apply(f, args, kwargs)
206 205
207 206 def apply_async(self, f, *args, **kwargs):
208 207 """calls f(*args, **kwargs) on remote engines in a nonblocking manner.
209 208
210 209 returns AsyncResult
211 210 """
212 211 return self._really_apply(f, args, kwargs, block=False)
213 212
214 213 @spin_after
215 214 def apply_sync(self, f, *args, **kwargs):
216 215 """calls f(*args, **kwargs) on remote engines in a blocking manner,
217 216 returning the result.
218 217
219 218 returns: actual result of f(*args, **kwargs)
220 219 """
221 220 return self._really_apply(f, args, kwargs, block=True)
222 221
223 222 #----------------------------------------------------------------
224 223 # wrappers for client and control methods
225 224 #----------------------------------------------------------------
226 225 @sync_results
227 226 def spin(self):
228 227 """spin the client, and sync"""
229 228 self.client.spin()
230 229
231 230 @sync_results
232 231 def wait(self, jobs=None, timeout=-1):
233 232 """waits on one or more `jobs`, for up to `timeout` seconds.
234 233
235 234 Parameters
236 235 ----------
237 236
238 237 jobs : int, str, or list of ints and/or strs, or one or more AsyncResult objects
239 238 ints are indices to self.history
240 239 strs are msg_ids
241 240 default: wait on all outstanding messages
242 241 timeout : float
243 242 a time in seconds, after which to give up.
244 243 default is -1, which means no timeout
245 244
246 245 Returns
247 246 -------
248 247
249 248 True : when all msg_ids are done
250 249 False : timeout reached, some msg_ids still outstanding
251 250 """
252 251 if jobs is None:
253 252 jobs = self.history
254 253 return self.client.wait(jobs, timeout)
255 254
256 255 def abort(self, jobs=None, targets=None, block=None):
257 256 """Abort jobs on my engines.
258 257
259 258 Parameters
260 259 ----------
261 260
262 261 jobs : None, str, list of strs, optional
263 262 if None: abort all jobs.
264 263 else: abort specific msg_id(s).
265 264 """
266 265 block = block if block is not None else self.block
267 266 targets = targets if targets is not None else self.targets
268 267 return self.client.abort(jobs=jobs, targets=targets, block=block)
269 268
270 269 def queue_status(self, targets=None, verbose=False):
271 270 """Fetch the Queue status of my engines"""
272 271 targets = targets if targets is not None else self.targets
273 272 return self.client.queue_status(targets=targets, verbose=verbose)
274 273
275 274 def purge_results(self, jobs=[], targets=[]):
276 275 """Instruct the controller to forget specific results."""
277 276 if targets is None or targets == 'all':
278 277 targets = self.targets
279 278 return self.client.purge_results(jobs=jobs, targets=targets)
280 279
281 280 def shutdown(self, targets=None, restart=False, hub=False, block=None):
282 281 """Terminates one or more engine processes, optionally including the hub.
283 282 """
284 283 block = self.block if block is None else block
285 284 if targets is None or targets == 'all':
286 285 targets = self.targets
287 286 return self.client.shutdown(targets=targets, restart=restart, hub=hub, block=block)
288 287
289 288 @spin_after
290 289 def get_result(self, indices_or_msg_ids=None):
291 290 """return one or more results, specified by history index or msg_id.
292 291
293 292 See client.get_result for details.
294 293
295 294 """
296 295
297 296 if indices_or_msg_ids is None:
298 297 indices_or_msg_ids = -1
299 298 if isinstance(indices_or_msg_ids, int):
300 299 indices_or_msg_ids = self.history[indices_or_msg_ids]
301 300 elif isinstance(indices_or_msg_ids, (list,tuple,set)):
302 301 indices_or_msg_ids = list(indices_or_msg_ids)
303 302 for i,index in enumerate(indices_or_msg_ids):
304 303 if isinstance(index, int):
305 304 indices_or_msg_ids[i] = self.history[index]
306 305 return self.client.get_result(indices_or_msg_ids)
307 306
308 307 #-------------------------------------------------------------------
309 308 # Map
310 309 #-------------------------------------------------------------------
311 310
312 311 def map(self, f, *sequences, **kwargs):
313 312 """override in subclasses"""
314 313 raise NotImplementedError
315 314
316 315 def map_async(self, f, *sequences, **kwargs):
317 316 """Parallel version of builtin `map`, using this view's engines.
318 317
319 318 This is equivalent to map(...block=False)
320 319
321 320 See `self.map` for details.
322 321 """
323 322 if 'block' in kwargs:
324 323 raise TypeError("map_async doesn't take a `block` keyword argument.")
325 324 kwargs['block'] = False
326 325 return self.map(f,*sequences,**kwargs)
327 326
328 327 def map_sync(self, f, *sequences, **kwargs):
329 328 """Parallel version of builtin `map`, using this view's engines.
330 329
331 330 This is equivalent to map(...block=True)
332 331
333 332 See `self.map` for details.
334 333 """
335 334 if 'block' in kwargs:
336 335 raise TypeError("map_sync doesn't take a `block` keyword argument.")
337 336 kwargs['block'] = True
338 337 return self.map(f,*sequences,**kwargs)
339 338
340 339 def imap(self, f, *sequences, **kwargs):
341 340 """Parallel version of `itertools.imap`.
342 341
343 342 See `self.map` for details.
344 343
345 344 """
346 345
347 346 return iter(self.map_async(f,*sequences, **kwargs))
348 347
349 348 #-------------------------------------------------------------------
350 349 # Decorators
351 350 #-------------------------------------------------------------------
352 351
353 352 def remote(self, block=True, **flags):
354 353 """Decorator for making a RemoteFunction"""
355 354 block = self.block if block is None else block
356 355 return remote(self, block=block, **flags)
357 356
358 357 def parallel(self, dist='b', block=None, **flags):
359 358 """Decorator for making a ParallelFunction"""
360 359 block = self.block if block is None else block
361 360 return parallel(self, dist=dist, block=block, **flags)
362 361
363 @testdec.skip_doctest
362 @skip_doctest
364 363 class DirectView(View):
365 364 """Direct Multiplexer View of one or more engines.
366 365
367 366 These are created via indexed access to a client:
368 367
369 368 >>> dv_1 = client[1]
370 369 >>> dv_all = client[:]
371 370 >>> dv_even = client[::2]
372 371 >>> dv_some = client[1:3]
373 372
374 373 This object provides dictionary access to engine namespaces:
375 374
376 375 # push a=5:
377 376 >>> dv['a'] = 5
378 377 # pull 'foo':
379 378 >>> db['foo']
380 379
381 380 """
382 381
383 382 def __init__(self, client=None, socket=None, targets=None):
384 383 super(DirectView, self).__init__(client=client, socket=socket, targets=targets)
385 384
386 385 @property
387 386 def importer(self):
388 387 """sync_imports(local=True) as a property.
389 388
390 389 See sync_imports for details.
391 390
392 391 """
393 392 return self.sync_imports(True)
394 393
395 394 @contextmanager
396 395 def sync_imports(self, local=True):
397 396 """Context Manager for performing simultaneous local and remote imports.
398 397
399 398 'import x as y' will *not* work. The 'as y' part will simply be ignored.
400 399
401 400 >>> with view.sync_imports():
402 401 ... from numpy import recarray
403 402 importing recarray from numpy on engine(s)
404 403
405 404 """
406 405 import __builtin__
407 406 local_import = __builtin__.__import__
408 407 modules = set()
409 408 results = []
410 409 @util.interactive
411 410 def remote_import(name, fromlist, level):
412 411 """the function to be passed to apply, that actually performs the import
413 412 on the engine, and loads up the user namespace.
414 413 """
415 414 import sys
416 415 user_ns = globals()
417 416 mod = __import__(name, fromlist=fromlist, level=level)
418 417 if fromlist:
419 418 for key in fromlist:
420 419 user_ns[key] = getattr(mod, key)
421 420 else:
422 421 user_ns[name] = sys.modules[name]
423 422
424 423 def view_import(name, globals={}, locals={}, fromlist=[], level=-1):
425 424 """the drop-in replacement for __import__, that optionally imports
426 425 locally as well.
427 426 """
428 427 # don't override nested imports
429 428 save_import = __builtin__.__import__
430 429 __builtin__.__import__ = local_import
431 430
432 431 if imp.lock_held():
433 432 # this is a side-effect import, don't do it remotely, or even
434 433 # ignore the local effects
435 434 return local_import(name, globals, locals, fromlist, level)
436 435
437 436 imp.acquire_lock()
438 437 if local:
439 438 mod = local_import(name, globals, locals, fromlist, level)
440 439 else:
441 440 raise NotImplementedError("remote-only imports not yet implemented")
442 441 imp.release_lock()
443 442
444 443 key = name+':'+','.join(fromlist or [])
445 444 if level == -1 and key not in modules:
446 445 modules.add(key)
447 446 if fromlist:
448 447 print "importing %s from %s on engine(s)"%(','.join(fromlist), name)
449 448 else:
450 449 print "importing %s on engine(s)"%name
451 450 results.append(self.apply_async(remote_import, name, fromlist, level))
452 451 # restore override
453 452 __builtin__.__import__ = save_import
454 453
455 454 return mod
456 455
457 456 # override __import__
458 457 __builtin__.__import__ = view_import
459 458 try:
460 459 # enter the block
461 460 yield
462 461 except ImportError:
463 462 if not local:
464 463 # ignore import errors if not doing local imports
465 464 pass
466 465 finally:
467 466 # always restore __import__
468 467 __builtin__.__import__ = local_import
469 468
470 469 for r in results:
471 470 # raise possible remote ImportErrors here
472 471 r.get()
473 472
474 473
475 474 @sync_results
476 475 @save_ids
477 476 def _really_apply(self, f, args=None, kwargs=None, targets=None, block=None, track=None):
478 477 """calls f(*args, **kwargs) on remote engines, returning the result.
479 478
480 479 This method sets all of `apply`'s flags via this View's attributes.
481 480
482 481 Parameters
483 482 ----------
484 483
485 484 f : callable
486 485
487 486 args : list [default: empty]
488 487
489 488 kwargs : dict [default: empty]
490 489
491 490 targets : target list [default: self.targets]
492 491 where to run
493 492 block : bool [default: self.block]
494 493 whether to block
495 494 track : bool [default: self.track]
496 495 whether to ask zmq to track the message, for safe non-copying sends
497 496
498 497 Returns
499 498 -------
500 499
501 500 if self.block is False:
502 501 returns AsyncResult
503 502 else:
504 503 returns actual result of f(*args, **kwargs) on the engine(s)
505 504 This will be a list of self.targets is also a list (even length 1), or
506 505 the single result if self.targets is an integer engine id
507 506 """
508 507 args = [] if args is None else args
509 508 kwargs = {} if kwargs is None else kwargs
510 509 block = self.block if block is None else block
511 510 track = self.track if track is None else track
512 511 targets = self.targets if targets is None else targets
513 512
514 513 _idents = self.client._build_targets(targets)[0]
515 514 msg_ids = []
516 515 trackers = []
517 516 for ident in _idents:
518 517 msg = self.client.send_apply_message(self._socket, f, args, kwargs, track=track,
519 518 ident=ident)
520 519 if track:
521 520 trackers.append(msg['tracker'])
522 521 msg_ids.append(msg['msg_id'])
523 522 tracker = None if track is False else zmq.MessageTracker(*trackers)
524 523 ar = AsyncResult(self.client, msg_ids, fname=f.__name__, targets=targets, tracker=tracker)
525 524 if block:
526 525 try:
527 526 return ar.get()
528 527 except KeyboardInterrupt:
529 528 pass
530 529 return ar
531 530
532 531 @spin_after
533 532 def map(self, f, *sequences, **kwargs):
534 533 """view.map(f, *sequences, block=self.block) => list|AsyncMapResult
535 534
536 535 Parallel version of builtin `map`, using this View's `targets`.
537 536
538 537 There will be one task per target, so work will be chunked
539 538 if the sequences are longer than `targets`.
540 539
541 540 Results can be iterated as they are ready, but will become available in chunks.
542 541
543 542 Parameters
544 543 ----------
545 544
546 545 f : callable
547 546 function to be mapped
548 547 *sequences: one or more sequences of matching length
549 548 the sequences to be distributed and passed to `f`
550 549 block : bool
551 550 whether to wait for the result or not [default self.block]
552 551
553 552 Returns
554 553 -------
555 554
556 555 if block=False:
557 556 AsyncMapResult
558 557 An object like AsyncResult, but which reassembles the sequence of results
559 558 into a single list. AsyncMapResults can be iterated through before all
560 559 results are complete.
561 560 else:
562 561 list
563 562 the result of map(f,*sequences)
564 563 """
565 564
566 565 block = kwargs.pop('block', self.block)
567 566 for k in kwargs.keys():
568 567 if k not in ['block', 'track']:
569 568 raise TypeError("invalid keyword arg, %r"%k)
570 569
571 570 assert len(sequences) > 0, "must have some sequences to map onto!"
572 571 pf = ParallelFunction(self, f, block=block, **kwargs)
573 572 return pf.map(*sequences)
574 573
575 574 def execute(self, code, targets=None, block=None):
576 575 """Executes `code` on `targets` in blocking or nonblocking manner.
577 576
578 577 ``execute`` is always `bound` (affects engine namespace)
579 578
580 579 Parameters
581 580 ----------
582 581
583 582 code : str
584 583 the code string to be executed
585 584 block : bool
586 585 whether or not to wait until done to return
587 586 default: self.block
588 587 """
589 588 return self._really_apply(util._execute, args=(code,), block=block, targets=targets)
590 589
591 590 def run(self, filename, targets=None, block=None):
592 591 """Execute contents of `filename` on my engine(s).
593 592
594 593 This simply reads the contents of the file and calls `execute`.
595 594
596 595 Parameters
597 596 ----------
598 597
599 598 filename : str
600 599 The path to the file
601 600 targets : int/str/list of ints/strs
602 601 the engines on which to execute
603 602 default : all
604 603 block : bool
605 604 whether or not to wait until done
606 605 default: self.block
607 606
608 607 """
609 608 with open(filename, 'r') as f:
610 609 # add newline in case of trailing indented whitespace
611 610 # which will cause SyntaxError
612 611 code = f.read()+'\n'
613 612 return self.execute(code, block=block, targets=targets)
614 613
615 614 def update(self, ns):
616 615 """update remote namespace with dict `ns`
617 616
618 617 See `push` for details.
619 618 """
620 619 return self.push(ns, block=self.block, track=self.track)
621 620
622 621 def push(self, ns, targets=None, block=None, track=None):
623 622 """update remote namespace with dict `ns`
624 623
625 624 Parameters
626 625 ----------
627 626
628 627 ns : dict
629 628 dict of keys with which to update engine namespace(s)
630 629 block : bool [default : self.block]
631 630 whether to wait to be notified of engine receipt
632 631
633 632 """
634 633
635 634 block = block if block is not None else self.block
636 635 track = track if track is not None else self.track
637 636 targets = targets if targets is not None else self.targets
638 637 # applier = self.apply_sync if block else self.apply_async
639 638 if not isinstance(ns, dict):
640 639 raise TypeError("Must be a dict, not %s"%type(ns))
641 640 return self._really_apply(util._push, (ns,), block=block, track=track, targets=targets)
642 641
643 642 def get(self, key_s):
644 643 """get object(s) by `key_s` from remote namespace
645 644
646 645 see `pull` for details.
647 646 """
648 647 # block = block if block is not None else self.block
649 648 return self.pull(key_s, block=True)
650 649
651 650 def pull(self, names, targets=None, block=None):
652 651 """get object(s) by `name` from remote namespace
653 652
654 653 will return one object if it is a key.
655 654 can also take a list of keys, in which case it will return a list of objects.
656 655 """
657 656 block = block if block is not None else self.block
658 657 targets = targets if targets is not None else self.targets
659 658 applier = self.apply_sync if block else self.apply_async
660 659 if isinstance(names, basestring):
661 660 pass
662 661 elif isinstance(names, (list,tuple,set)):
663 662 for key in names:
664 663 if not isinstance(key, basestring):
665 664 raise TypeError("keys must be str, not type %r"%type(key))
666 665 else:
667 666 raise TypeError("names must be strs, not %r"%names)
668 667 return self._really_apply(util._pull, (names,), block=block, targets=targets)
669 668
670 669 def scatter(self, key, seq, dist='b', flatten=False, targets=None, block=None, track=None):
671 670 """
672 671 Partition a Python sequence and send the partitions to a set of engines.
673 672 """
674 673 block = block if block is not None else self.block
675 674 track = track if track is not None else self.track
676 675 targets = targets if targets is not None else self.targets
677 676
678 677 mapObject = Map.dists[dist]()
679 678 nparts = len(targets)
680 679 msg_ids = []
681 680 trackers = []
682 681 for index, engineid in enumerate(targets):
683 682 partition = mapObject.getPartition(seq, index, nparts)
684 683 if flatten and len(partition) == 1:
685 684 ns = {key: partition[0]}
686 685 else:
687 686 ns = {key: partition}
688 687 r = self.push(ns, block=False, track=track, targets=engineid)
689 688 msg_ids.extend(r.msg_ids)
690 689 if track:
691 690 trackers.append(r._tracker)
692 691
693 692 if track:
694 693 tracker = zmq.MessageTracker(*trackers)
695 694 else:
696 695 tracker = None
697 696
698 697 r = AsyncResult(self.client, msg_ids, fname='scatter', targets=targets, tracker=tracker)
699 698 if block:
700 699 r.wait()
701 700 else:
702 701 return r
703 702
704 703 @sync_results
705 704 @save_ids
706 705 def gather(self, key, dist='b', targets=None, block=None):
707 706 """
708 707 Gather a partitioned sequence on a set of engines as a single local seq.
709 708 """
710 709 block = block if block is not None else self.block
711 710 targets = targets if targets is not None else self.targets
712 711 mapObject = Map.dists[dist]()
713 712 msg_ids = []
714 713
715 714 for index, engineid in enumerate(targets):
716 715 msg_ids.extend(self.pull(key, block=False, targets=engineid).msg_ids)
717 716
718 717 r = AsyncMapResult(self.client, msg_ids, mapObject, fname='gather')
719 718
720 719 if block:
721 720 try:
722 721 return r.get()
723 722 except KeyboardInterrupt:
724 723 pass
725 724 return r
726 725
727 726 def __getitem__(self, key):
728 727 return self.get(key)
729 728
730 729 def __setitem__(self,key, value):
731 730 self.update({key:value})
732 731
733 732 def clear(self, targets=None, block=False):
734 733 """Clear the remote namespaces on my engines."""
735 734 block = block if block is not None else self.block
736 735 targets = targets if targets is not None else self.targets
737 736 return self.client.clear(targets=targets, block=block)
738 737
739 738 def kill(self, targets=None, block=True):
740 739 """Kill my engines."""
741 740 block = block if block is not None else self.block
742 741 targets = targets if targets is not None else self.targets
743 742 return self.client.kill(targets=targets, block=block)
744 743
745 744 #----------------------------------------
746 745 # activate for %px,%autopx magics
747 746 #----------------------------------------
748 747 def activate(self):
749 748 """Make this `View` active for parallel magic commands.
750 749
751 750 IPython has a magic command syntax to work with `MultiEngineClient` objects.
752 751 In a given IPython session there is a single active one. While
753 752 there can be many `Views` created and used by the user,
754 753 there is only one active one. The active `View` is used whenever
755 754 the magic commands %px and %autopx are used.
756 755
757 756 The activate() method is called on a given `View` to make it
758 757 active. Once this has been done, the magic commands can be used.
759 758 """
760 759
761 760 try:
762 761 # This is injected into __builtins__.
763 762 ip = get_ipython()
764 763 except NameError:
765 764 print "The IPython parallel magics (%result, %px, %autopx) only work within IPython."
766 765 else:
767 766 pmagic = ip.plugin_manager.get_plugin('parallelmagic')
768 767 if pmagic is None:
769 768 ip.magic_load_ext('parallelmagic')
770 769 pmagic = ip.plugin_manager.get_plugin('parallelmagic')
771 770
772 771 pmagic.active_view = self
773 772
774 773
775 @testdec.skip_doctest
774 @skip_doctest
776 775 class LoadBalancedView(View):
777 776 """An load-balancing View that only executes via the Task scheduler.
778 777
779 778 Load-balanced views can be created with the client's `view` method:
780 779
781 780 >>> v = client.load_balanced_view()
782 781
783 782 or targets can be specified, to restrict the potential destinations:
784 783
785 784 >>> v = client.client.load_balanced_view(([1,3])
786 785
787 786 which would restrict loadbalancing to between engines 1 and 3.
788 787
789 788 """
790 789
791 790 follow=Any()
792 791 after=Any()
793 792 timeout=CFloat()
794 793 retries = CInt(0)
795 794
796 795 _task_scheme = Any()
797 796 _flag_names = List(['targets', 'block', 'track', 'follow', 'after', 'timeout', 'retries'])
798 797
799 798 def __init__(self, client=None, socket=None, **flags):
800 799 super(LoadBalancedView, self).__init__(client=client, socket=socket, **flags)
801 800 self._task_scheme=client._task_scheme
802 801
803 802 def _validate_dependency(self, dep):
804 803 """validate a dependency.
805 804
806 805 For use in `set_flags`.
807 806 """
808 807 if dep is None or isinstance(dep, (str, AsyncResult, Dependency)):
809 808 return True
810 809 elif isinstance(dep, (list,set, tuple)):
811 810 for d in dep:
812 811 if not isinstance(d, (str, AsyncResult)):
813 812 return False
814 813 elif isinstance(dep, dict):
815 814 if set(dep.keys()) != set(Dependency().as_dict().keys()):
816 815 return False
817 816 if not isinstance(dep['msg_ids'], list):
818 817 return False
819 818 for d in dep['msg_ids']:
820 819 if not isinstance(d, str):
821 820 return False
822 821 else:
823 822 return False
824 823
825 824 return True
826 825
827 826 def _render_dependency(self, dep):
828 827 """helper for building jsonable dependencies from various input forms."""
829 828 if isinstance(dep, Dependency):
830 829 return dep.as_dict()
831 830 elif isinstance(dep, AsyncResult):
832 831 return dep.msg_ids
833 832 elif dep is None:
834 833 return []
835 834 else:
836 835 # pass to Dependency constructor
837 836 return list(Dependency(dep))
838 837
839 838 def set_flags(self, **kwargs):
840 839 """set my attribute flags by keyword.
841 840
842 841 A View is a wrapper for the Client's apply method, but with attributes
843 842 that specify keyword arguments, those attributes can be set by keyword
844 843 argument with this method.
845 844
846 845 Parameters
847 846 ----------
848 847
849 848 block : bool
850 849 whether to wait for results
851 850 track : bool
852 851 whether to create a MessageTracker to allow the user to
853 852 safely edit after arrays and buffers during non-copying
854 853 sends.
855 854
856 855 after : Dependency or collection of msg_ids
857 856 Only for load-balanced execution (targets=None)
858 857 Specify a list of msg_ids as a time-based dependency.
859 858 This job will only be run *after* the dependencies
860 859 have been met.
861 860
862 861 follow : Dependency or collection of msg_ids
863 862 Only for load-balanced execution (targets=None)
864 863 Specify a list of msg_ids as a location-based dependency.
865 864 This job will only be run on an engine where this dependency
866 865 is met.
867 866
868 867 timeout : float/int or None
869 868 Only for load-balanced execution (targets=None)
870 869 Specify an amount of time (in seconds) for the scheduler to
871 870 wait for dependencies to be met before failing with a
872 871 DependencyTimeout.
873 872
874 873 retries : int
875 874 Number of times a task will be retried on failure.
876 875 """
877 876
878 877 super(LoadBalancedView, self).set_flags(**kwargs)
879 878 for name in ('follow', 'after'):
880 879 if name in kwargs:
881 880 value = kwargs[name]
882 881 if self._validate_dependency(value):
883 882 setattr(self, name, value)
884 883 else:
885 884 raise ValueError("Invalid dependency: %r"%value)
886 885 if 'timeout' in kwargs:
887 886 t = kwargs['timeout']
888 887 if not isinstance(t, (int, long, float, type(None))):
889 888 raise TypeError("Invalid type for timeout: %r"%type(t))
890 889 if t is not None:
891 890 if t < 0:
892 891 raise ValueError("Invalid timeout: %s"%t)
893 892 self.timeout = t
894 893
895 894 @sync_results
896 895 @save_ids
897 896 def _really_apply(self, f, args=None, kwargs=None, block=None, track=None,
898 897 after=None, follow=None, timeout=None,
899 898 targets=None, retries=None):
900 899 """calls f(*args, **kwargs) on a remote engine, returning the result.
901 900
902 901 This method temporarily sets all of `apply`'s flags for a single call.
903 902
904 903 Parameters
905 904 ----------
906 905
907 906 f : callable
908 907
909 908 args : list [default: empty]
910 909
911 910 kwargs : dict [default: empty]
912 911
913 912 block : bool [default: self.block]
914 913 whether to block
915 914 track : bool [default: self.track]
916 915 whether to ask zmq to track the message, for safe non-copying sends
917 916
918 917 !!!!!! TODO: THE REST HERE !!!!
919 918
920 919 Returns
921 920 -------
922 921
923 922 if self.block is False:
924 923 returns AsyncResult
925 924 else:
926 925 returns actual result of f(*args, **kwargs) on the engine(s)
927 926 This will be a list of self.targets is also a list (even length 1), or
928 927 the single result if self.targets is an integer engine id
929 928 """
930 929
931 930 # validate whether we can run
932 931 if self._socket.closed:
933 932 msg = "Task farming is disabled"
934 933 if self._task_scheme == 'pure':
935 934 msg += " because the pure ZMQ scheduler cannot handle"
936 935 msg += " disappearing engines."
937 936 raise RuntimeError(msg)
938 937
939 938 if self._task_scheme == 'pure':
940 939 # pure zmq scheme doesn't support extra features
941 940 msg = "Pure ZMQ scheduler doesn't support the following flags:"
942 941 "follow, after, retries, targets, timeout"
943 942 if (follow or after or retries or targets or timeout):
944 943 # hard fail on Scheduler flags
945 944 raise RuntimeError(msg)
946 945 if isinstance(f, dependent):
947 946 # soft warn on functional dependencies
948 947 warnings.warn(msg, RuntimeWarning)
949 948
950 949 # build args
951 950 args = [] if args is None else args
952 951 kwargs = {} if kwargs is None else kwargs
953 952 block = self.block if block is None else block
954 953 track = self.track if track is None else track
955 954 after = self.after if after is None else after
956 955 retries = self.retries if retries is None else retries
957 956 follow = self.follow if follow is None else follow
958 957 timeout = self.timeout if timeout is None else timeout
959 958 targets = self.targets if targets is None else targets
960 959
961 960 if not isinstance(retries, int):
962 961 raise TypeError('retries must be int, not %r'%type(retries))
963 962
964 963 if targets is None:
965 964 idents = []
966 965 else:
967 966 idents = self.client._build_targets(targets)[0]
968 967
969 968 after = self._render_dependency(after)
970 969 follow = self._render_dependency(follow)
971 970 subheader = dict(after=after, follow=follow, timeout=timeout, targets=idents, retries=retries)
972 971
973 972 msg = self.client.send_apply_message(self._socket, f, args, kwargs, track=track,
974 973 subheader=subheader)
975 974 tracker = None if track is False else msg['tracker']
976 975
977 976 ar = AsyncResult(self.client, msg['msg_id'], fname=f.__name__, targets=None, tracker=tracker)
978 977
979 978 if block:
980 979 try:
981 980 return ar.get()
982 981 except KeyboardInterrupt:
983 982 pass
984 983 return ar
985 984
986 985 @spin_after
987 986 @save_ids
988 987 def map(self, f, *sequences, **kwargs):
989 988 """view.map(f, *sequences, block=self.block, chunksize=1) => list|AsyncMapResult
990 989
991 990 Parallel version of builtin `map`, load-balanced by this View.
992 991
993 992 `block`, and `chunksize` can be specified by keyword only.
994 993
995 994 Each `chunksize` elements will be a separate task, and will be
996 995 load-balanced. This lets individual elements be available for iteration
997 996 as soon as they arrive.
998 997
999 998 Parameters
1000 999 ----------
1001 1000
1002 1001 f : callable
1003 1002 function to be mapped
1004 1003 *sequences: one or more sequences of matching length
1005 1004 the sequences to be distributed and passed to `f`
1006 1005 block : bool
1007 1006 whether to wait for the result or not [default self.block]
1008 1007 track : bool
1009 1008 whether to create a MessageTracker to allow the user to
1010 1009 safely edit after arrays and buffers during non-copying
1011 1010 sends.
1012 1011 chunksize : int
1013 1012 how many elements should be in each task [default 1]
1014 1013
1015 1014 Returns
1016 1015 -------
1017 1016
1018 1017 if block=False:
1019 1018 AsyncMapResult
1020 1019 An object like AsyncResult, but which reassembles the sequence of results
1021 1020 into a single list. AsyncMapResults can be iterated through before all
1022 1021 results are complete.
1023 1022 else:
1024 1023 the result of map(f,*sequences)
1025 1024
1026 1025 """
1027 1026
1028 1027 # default
1029 1028 block = kwargs.get('block', self.block)
1030 1029 chunksize = kwargs.get('chunksize', 1)
1031 1030
1032 1031 keyset = set(kwargs.keys())
1033 1032 extra_keys = keyset.difference_update(set(['block', 'chunksize']))
1034 1033 if extra_keys:
1035 1034 raise TypeError("Invalid kwargs: %s"%list(extra_keys))
1036 1035
1037 1036 assert len(sequences) > 0, "must have some sequences to map onto!"
1038 1037
1039 1038 pf = ParallelFunction(self, f, block=block, chunksize=chunksize)
1040 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 1 """Decorators for labeling test objects.
2 2
3 3 Decorators that merely return a modified version of the original function
4 4 object are straightforward. Decorators that return a new function object need
5 5 to use nose.tools.make_decorator(original_function)(decorator) in returning the
6 6 decorator, in order to preserve metadata such as function name, setup and
7 7 teardown functions and so on - see nose.tools for more information.
8 8
9 9 This module provides a set of useful decorators meant to be ready to use in
10 10 your own tests. See the bottom of the file for the ready-made ones, and if you
11 11 find yourself writing a new one that may be of generic use, add it here.
12 12
13 13 Included decorators:
14 14
15 15
16 16 Lightweight testing that remains unittest-compatible.
17 17
18 18 - @parametric, for parametric test support that is vastly easier to use than
19 19 nose's for debugging. With ours, if a test fails, the stack under inspection
20 20 is that of the test and not that of the test framework.
21 21
22 22 - An @as_unittest decorator can be used to tag any normal parameter-less
23 23 function as a unittest TestCase. Then, both nose and normal unittest will
24 24 recognize it as such. This will make it easier to migrate away from Nose if
25 25 we ever need/want to while maintaining very lightweight tests.
26 26
27 27 NOTE: This file contains IPython-specific decorators. Using the machinery in
28 28 IPython.external.decorators, we import either numpy.testing.decorators if numpy is
29 29 available, OR use equivalent code in IPython.external._decorators, which
30 30 we've copied verbatim from numpy.
31 31
32 32 Authors
33 33 -------
34 34
35 35 - Fernando Perez <Fernando.Perez@berkeley.edu>
36 36 """
37 37
38 38 #-----------------------------------------------------------------------------
39 39 # Copyright (C) 2009-2010 The IPython Development Team
40 40 #
41 41 # Distributed under the terms of the BSD License. The full license is in
42 42 # the file COPYING, distributed as part of this software.
43 43 #-----------------------------------------------------------------------------
44 44
45 45 #-----------------------------------------------------------------------------
46 46 # Imports
47 47 #-----------------------------------------------------------------------------
48 48
49 49 # Stdlib imports
50 50 import inspect
51 51 import sys
52 52 import unittest
53 53
54 54 # Third-party imports
55 55
56 56 # This is Michele Simionato's decorator module, kept verbatim.
57 57 from IPython.external.decorator import decorator, update_wrapper
58 58
59 59 # We already have python3-compliant code for parametric tests
60 60 if sys.version[0]=='2':
61 61 from _paramtestpy2 import parametric, ParametricTestCase
62 62 else:
63 63 from _paramtestpy3 import parametric, ParametricTestCase
64 64
65 65 # Expose the unittest-driven decorators
66 66 from ipunittest import ipdoctest, ipdocstring
67 67
68 68 # Grab the numpy-specific decorators which we keep in a file that we
69 69 # occasionally update from upstream: decorators.py is a copy of
70 70 # numpy.testing.decorators, we expose all of it here.
71 71 from IPython.external.decorators import *
72 72
73 73 #-----------------------------------------------------------------------------
74 74 # Classes and functions
75 75 #-----------------------------------------------------------------------------
76 76
77 77 # Simple example of the basic idea
78 78 def as_unittest(func):
79 79 """Decorator to make a simple function into a normal test via unittest."""
80 80 class Tester(unittest.TestCase):
81 81 def test(self):
82 82 func()
83 83
84 84 Tester.__name__ = func.__name__
85 85
86 86 return Tester
87 87
88 88 # Utility functions
89 89
90 90 def apply_wrapper(wrapper,func):
91 91 """Apply a wrapper to a function for decoration.
92 92
93 93 This mixes Michele Simionato's decorator tool with nose's make_decorator,
94 94 to apply a wrapper in a decorator so that all nose attributes, as well as
95 95 function signature and other properties, survive the decoration cleanly.
96 96 This will ensure that wrapped functions can still be well introspected via
97 97 IPython, for example.
98 98 """
99 99 import nose.tools
100 100
101 101 return decorator(wrapper,nose.tools.make_decorator(func)(wrapper))
102 102
103 103
104 104 def make_label_dec(label,ds=None):
105 105 """Factory function to create a decorator that applies one or more labels.
106 106
107 107 Parameters
108 108 ----------
109 109 label : string or sequence
110 110 One or more labels that will be applied by the decorator to the functions
111 111 it decorates. Labels are attributes of the decorated function with their
112 112 value set to True.
113 113
114 114 ds : string
115 115 An optional docstring for the resulting decorator. If not given, a
116 116 default docstring is auto-generated.
117 117
118 118 Returns
119 119 -------
120 120 A decorator.
121 121
122 122 Examples
123 123 --------
124 124
125 125 A simple labeling decorator:
126 126 >>> slow = make_label_dec('slow')
127 127 >>> print slow.__doc__
128 128 Labels a test as 'slow'.
129 129
130 130 And one that uses multiple labels and a custom docstring:
131 131 >>> rare = make_label_dec(['slow','hard'],
132 132 ... "Mix labels 'slow' and 'hard' for rare tests.")
133 133 >>> print rare.__doc__
134 134 Mix labels 'slow' and 'hard' for rare tests.
135 135
136 136 Now, let's test using this one:
137 137 >>> @rare
138 138 ... def f(): pass
139 139 ...
140 140 >>>
141 141 >>> f.slow
142 142 True
143 143 >>> f.hard
144 144 True
145 145 """
146 146
147 147 if isinstance(label,basestring):
148 148 labels = [label]
149 149 else:
150 150 labels = label
151 151
152 152 # Validate that the given label(s) are OK for use in setattr() by doing a
153 153 # dry run on a dummy function.
154 154 tmp = lambda : None
155 155 for label in labels:
156 156 setattr(tmp,label,True)
157 157
158 158 # This is the actual decorator we'll return
159 159 def decor(f):
160 160 for label in labels:
161 161 setattr(f,label,True)
162 162 return f
163 163
164 164 # Apply the user's docstring, or autogenerate a basic one
165 165 if ds is None:
166 166 ds = "Labels a test as %r." % label
167 167 decor.__doc__ = ds
168 168
169 169 return decor
170 170
171 171
172 172 # Inspired by numpy's skipif, but uses the full apply_wrapper utility to
173 173 # preserve function metadata better and allows the skip condition to be a
174 174 # callable.
175 175 def skipif(skip_condition, msg=None):
176 176 ''' Make function raise SkipTest exception if skip_condition is true
177 177
178 178 Parameters
179 179 ----------
180 180 skip_condition : bool or callable.
181 181 Flag to determine whether to skip test. If the condition is a
182 182 callable, it is used at runtime to dynamically make the decision. This
183 183 is useful for tests that may require costly imports, to delay the cost
184 184 until the test suite is actually executed.
185 185 msg : string
186 186 Message to give on raising a SkipTest exception
187 187
188 188 Returns
189 189 -------
190 190 decorator : function
191 191 Decorator, which, when applied to a function, causes SkipTest
192 192 to be raised when the skip_condition was True, and the function
193 193 to be called normally otherwise.
194 194
195 195 Notes
196 196 -----
197 197 You will see from the code that we had to further decorate the
198 198 decorator with the nose.tools.make_decorator function in order to
199 199 transmit function name, and various other metadata.
200 200 '''
201 201
202 202 def skip_decorator(f):
203 203 # Local import to avoid a hard nose dependency and only incur the
204 204 # import time overhead at actual test-time.
205 205 import nose
206 206
207 207 # Allow for both boolean or callable skip conditions.
208 208 if callable(skip_condition):
209 209 skip_val = skip_condition
210 210 else:
211 211 skip_val = lambda : skip_condition
212 212
213 213 def get_msg(func,msg=None):
214 214 """Skip message with information about function being skipped."""
215 215 if msg is None: out = 'Test skipped due to test condition.'
216 216 else: out = msg
217 217 return "Skipping test: %s. %s" % (func.__name__,out)
218 218
219 219 # We need to define *two* skippers because Python doesn't allow both
220 220 # return with value and yield inside the same function.
221 221 def skipper_func(*args, **kwargs):
222 222 """Skipper for normal test functions."""
223 223 if skip_val():
224 224 raise nose.SkipTest(get_msg(f,msg))
225 225 else:
226 226 return f(*args, **kwargs)
227 227
228 228 def skipper_gen(*args, **kwargs):
229 229 """Skipper for test generators."""
230 230 if skip_val():
231 231 raise nose.SkipTest(get_msg(f,msg))
232 232 else:
233 233 for x in f(*args, **kwargs):
234 234 yield x
235 235
236 236 # Choose the right skipper to use when building the actual generator.
237 237 if nose.util.isgenerator(f):
238 238 skipper = skipper_gen
239 239 else:
240 240 skipper = skipper_func
241 241
242 242 return nose.tools.make_decorator(f)(skipper)
243 243
244 244 return skip_decorator
245 245
246 246 # A version with the condition set to true, common case just to attacha message
247 247 # to a skip decorator
248 248 def skip(msg=None):
249 249 """Decorator factory - mark a test function for skipping from test suite.
250 250
251 251 Parameters
252 252 ----------
253 253 msg : string
254 254 Optional message to be added.
255 255
256 256 Returns
257 257 -------
258 258 decorator : function
259 259 Decorator, which, when applied to a function, causes SkipTest
260 260 to be raised, with the optional message added.
261 261 """
262 262
263 263 return skipif(True,msg)
264 264
265 265
266 266 def onlyif(condition, msg):
267 267 """The reverse from skipif, see skipif for details."""
268 268
269 269 if callable(condition):
270 270 skip_condition = lambda : not condition()
271 271 else:
272 272 skip_condition = lambda : not condition
273 273
274 274 return skipif(skip_condition, msg)
275 275
276 276 #-----------------------------------------------------------------------------
277 277 # Utility functions for decorators
278 278 def module_not_available(module):
279 279 """Can module be imported? Returns true if module does NOT import.
280 280
281 281 This is used to make a decorator to skip tests that require module to be
282 282 available, but delay the 'import numpy' to test execution time.
283 283 """
284 284 try:
285 285 mod = __import__(module)
286 286 mod_not_avail = False
287 287 except ImportError:
288 288 mod_not_avail = True
289 289
290 290 return mod_not_avail
291 291
292 292 #-----------------------------------------------------------------------------
293 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 295 # Decorators to skip certain tests on specific platforms.
303 296 skip_win32 = skipif(sys.platform == 'win32',
304 297 "This test does not run under Windows")
305 298 skip_linux = skipif(sys.platform == 'linux2',
306 299 "This test does not run under Linux")
307 300 skip_osx = skipif(sys.platform == 'darwin',"This test does not run under OS X")
308 301
309 302
310 303 # Decorators to skip tests if not on specific platforms.
311 304 skip_if_not_win32 = skipif(sys.platform != 'win32',
312 305 "This test only runs under Windows")
313 306 skip_if_not_linux = skipif(sys.platform != 'linux2',
314 307 "This test only runs under Linux")
315 308 skip_if_not_osx = skipif(sys.platform != 'darwin',
316 309 "This test only runs under OSX")
317 310
318 311 # Other skip decorators
319 312 skipif_not_numpy = skipif(module_not_available('numpy'),"This test requires numpy")
320 313
321 314 skipif_not_sympy = skipif(module_not_available('sympy'),"This test requires sympy")
322 315
323 316 skip_known_failure = knownfailureif(True,'This test is known to fail')
324 317
325 318 # A null 'decorator', useful to make more readable code that needs to pick
326 319 # between different decorators based on OS or other conditions
327 320 null_deco = lambda f: f
@@ -1,48 +1,46 b''
1 1 """Some simple tests for the plugin while running scripts.
2 2 """
3 3 # Module imports
4 4 # Std lib
5 5 import inspect
6 6
7 7 # Our own
8 from IPython.testing import decorators as dec
9 8
10 9 #-----------------------------------------------------------------------------
11 10 # Testing functions
12 11
13 12 def test_trivial():
14 13 """A trivial passing test."""
15 14 pass
16 15
17 16 def doctest_run():
18 17 """Test running a trivial script.
19 18
20 19 In [13]: run simplevars.py
21 20 x is: 1
22 21 """
23 22
24 23 def doctest_runvars():
25 24 """Test that variables defined in scripts get loaded correcly via %run.
26 25
27 26 In [13]: run simplevars.py
28 27 x is: 1
29 28
30 29 In [14]: x
31 30 Out[14]: 1
32 31 """
33 32
34 33 def doctest_ivars():
35 34 """Test that variables defined interactively are picked up.
36 35 In [5]: zz=1
37 36
38 37 In [6]: zz
39 38 Out[6]: 1
40 39 """
41
42 #@dec.skip_doctest
40
43 41 def doctest_refs():
44 42 """DocTest reference holding issues when running scripts.
45 43
46 44 In [32]: run show_refs.py
47 45 c referrers: [<type 'dict'>]
48 46 """
@@ -1,187 +1,188 b''
1 1 """Tests for the decorators we've created for IPython.
2 2 """
3 3
4 4 # Module imports
5 5 # Std lib
6 6 import inspect
7 7 import sys
8 8 import unittest
9 9
10 10 # Third party
11 11 import nose.tools as nt
12 12
13 13 # Our own
14 14 from IPython.testing import decorators as dec
15 from IPython.testing.skipdoctest import skip_doctest
15 16 from IPython.testing.ipunittest import ParametricTestCase
16 17
17 18 #-----------------------------------------------------------------------------
18 19 # Utilities
19 20
20 21 # Note: copied from OInspect, kept here so the testing stuff doesn't create
21 22 # circular dependencies and is easier to reuse.
22 23 def getargspec(obj):
23 24 """Get the names and default values of a function's arguments.
24 25
25 26 A tuple of four things is returned: (args, varargs, varkw, defaults).
26 27 'args' is a list of the argument names (it may contain nested lists).
27 28 'varargs' and 'varkw' are the names of the * and ** arguments or None.
28 29 'defaults' is an n-tuple of the default values of the last n arguments.
29 30
30 31 Modified version of inspect.getargspec from the Python Standard
31 32 Library."""
32 33
33 34 if inspect.isfunction(obj):
34 35 func_obj = obj
35 36 elif inspect.ismethod(obj):
36 37 func_obj = obj.im_func
37 38 else:
38 39 raise TypeError, 'arg is not a Python function'
39 40 args, varargs, varkw = inspect.getargs(func_obj.func_code)
40 41 return args, varargs, varkw, func_obj.func_defaults
41 42
42 43 #-----------------------------------------------------------------------------
43 44 # Testing functions
44 45
45 46 @dec.as_unittest
46 47 def trivial():
47 48 """A trivial test"""
48 49 pass
49 50
50 51 # Some examples of parametric tests.
51 52
52 53 def is_smaller(i,j):
53 54 assert i<j,"%s !< %s" % (i,j)
54 55
55 56 class Tester(ParametricTestCase):
56 57
57 58 def test_parametric(self):
58 59 yield is_smaller(3, 4)
59 60 x, y = 1, 2
60 61 yield is_smaller(x, y)
61 62
62 63 @dec.parametric
63 64 def test_par_standalone():
64 65 yield is_smaller(3, 4)
65 66 x, y = 1, 2
66 67 yield is_smaller(x, y)
67 68
68 69
69 70 @dec.skip
70 71 def test_deliberately_broken():
71 72 """A deliberately broken test - we want to skip this one."""
72 73 1/0
73 74
74 75 @dec.skip('Testing the skip decorator')
75 76 def test_deliberately_broken2():
76 77 """Another deliberately broken test - we want to skip this one."""
77 78 1/0
78 79
79 80
80 81 # Verify that we can correctly skip the doctest for a function at will, but
81 82 # that the docstring itself is NOT destroyed by the decorator.
82 @dec.skip_doctest
83 @skip_doctest
83 84 def doctest_bad(x,y=1,**k):
84 85 """A function whose doctest we need to skip.
85 86
86 87 >>> 1+1
87 88 3
88 89 """
89 90 print 'x:',x
90 91 print 'y:',y
91 92 print 'k:',k
92 93
93 94
94 95 def call_doctest_bad():
95 96 """Check that we can still call the decorated functions.
96 97
97 98 >>> doctest_bad(3,y=4)
98 99 x: 3
99 100 y: 4
100 101 k: {}
101 102 """
102 103 pass
103 104
104 105
105 106 def test_skip_dt_decorator():
106 107 """Doctest-skipping decorator should preserve the docstring.
107 108 """
108 109 # Careful: 'check' must be a *verbatim* copy of the doctest_bad docstring!
109 110 check = """A function whose doctest we need to skip.
110 111
111 112 >>> 1+1
112 113 3
113 114 """
114 115 # Fetch the docstring from doctest_bad after decoration.
115 116 val = doctest_bad.__doc__
116 117
117 118 nt.assert_equal(check,val,"doctest_bad docstrings don't match")
118 119
119 120
120 121 # Doctest skipping should work for class methods too
121 122 class FooClass(object):
122 123 """FooClass
123 124
124 125 Example:
125 126
126 127 >>> 1+1
127 128 2
128 129 """
129 130
130 @dec.skip_doctest
131 @skip_doctest
131 132 def __init__(self,x):
132 133 """Make a FooClass.
133 134
134 135 Example:
135 136
136 137 >>> f = FooClass(3)
137 138 junk
138 139 """
139 140 print 'Making a FooClass.'
140 141 self.x = x
141 142
142 @dec.skip_doctest
143 @skip_doctest
143 144 def bar(self,y):
144 145 """Example:
145 146
146 147 >>> ff = FooClass(3)
147 148 >>> ff.bar(0)
148 149 boom!
149 150 >>> 1/0
150 151 bam!
151 152 """
152 153 return 1/y
153 154
154 155 def baz(self,y):
155 156 """Example:
156 157
157 158 >>> ff2 = FooClass(3)
158 159 Making a FooClass.
159 160 >>> ff2.baz(3)
160 161 True
161 162 """
162 163 return self.x==y
163 164
164 165
165 166 def test_skip_dt_decorator2():
166 167 """Doctest-skipping decorator should preserve function signature.
167 168 """
168 169 # Hardcoded correct answer
169 170 dtargs = (['x', 'y'], None, 'k', (1,))
170 171 # Introspect out the value
171 172 dtargsr = getargspec(doctest_bad)
172 173 assert dtargsr==dtargs, \
173 174 "Incorrectly reconstructed args for doctest_bad: %s" % (dtargsr,)
174 175
175 176
176 177 @dec.skip_linux
177 178 def test_linux():
178 179 nt.assert_not_equals(sys.platform,'linux2',"This test can't run under linux")
179 180
180 181 @dec.skip_win32
181 182 def test_win32():
182 183 nt.assert_not_equals(sys.platform,'win32',"This test can't run under windows")
183 184
184 185 @dec.skip_osx
185 186 def test_osx():
186 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