##// END OF EJS Templates
For timeit magic, no s at "loops" if only one loop...
Lilian Besson -
Show More
@@ -1,1354 +1,1362 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Implementation of execution-related magic functions."""
3 3
4 4 # Copyright (c) IPython Development Team.
5 5 # Distributed under the terms of the Modified BSD License.
6 6
7 7 from __future__ import print_function
8 8
9 9 import ast
10 10 import bdb
11 11 import gc
12 12 import itertools
13 13 import os
14 14 import sys
15 15 import time
16 16 import timeit
17 17 from pdb import Restart
18 18
19 19 # cProfile was added in Python2.5
20 20 try:
21 21 import cProfile as profile
22 22 import pstats
23 23 except ImportError:
24 24 # profile isn't bundled by default in Debian for license reasons
25 25 try:
26 26 import profile, pstats
27 27 except ImportError:
28 28 profile = pstats = None
29 29
30 30 from IPython.core import debugger, oinspect
31 31 from IPython.core import magic_arguments
32 32 from IPython.core import page
33 33 from IPython.core.error import UsageError
34 34 from IPython.core.macro import Macro
35 35 from IPython.core.magic import (Magics, magics_class, line_magic, cell_magic,
36 36 line_cell_magic, on_off, needs_local_scope)
37 37 from IPython.testing.skipdoctest import skip_doctest
38 38 from IPython.utils import py3compat
39 39 from IPython.utils.py3compat import builtin_mod, iteritems, PY3
40 40 from IPython.utils.contexts import preserve_keys
41 41 from IPython.utils.capture import capture_output
42 42 from IPython.utils.ipstruct import Struct
43 43 from IPython.utils.module_paths import find_mod
44 44 from IPython.utils.path import get_py_filename, unquote_filename, shellglob
45 45 from IPython.utils.timing import clock, clock2
46 46 from IPython.utils.warn import warn, error
47 47
48 48 if PY3:
49 49 from io import StringIO
50 50 else:
51 51 from StringIO import StringIO
52 52
53 53 #-----------------------------------------------------------------------------
54 54 # Magic implementation classes
55 55 #-----------------------------------------------------------------------------
56 56
57 57
58 58 class TimeitResult(object):
59 59 """
60 60 Object returned by the timeit magic with info about the run.
61 61
62 62 Contain the following attributes :
63 63
64 64 loops: (int) number of loop done per measurement
65 65 repeat: (int) number of time the mesurement has been repeated
66 66 best: (float) best execusion time / number
67 67 all_runs: (list of float) execusion time of each run (in s)
68 68 compile_time: (float) time of statement compilation (s)
69 69
70 70 """
71 71
72 72 def __init__(self, loops, repeat, best, worst, all_runs, compile_time, precision):
73 73 self.loops = loops
74 74 self.repeat = repeat
75 75 self.best = best
76 76 self.worst = worst
77 77 self.all_runs = all_runs
78 78 self.compile_time = compile_time
79 79 self._precision = precision
80 80
81 81 def _repr_pretty_(self, p , cycle):
82 if self.loops == 1: # No s at "loops" if only one loop
83 unic = u"%d loop, best of %d: %s per loop" % (self.loops, self.repeat,
84 _format_time(self.best, self._precision))
85 else:
82 86 unic = u"%d loops, best of %d: %s per loop" % (self.loops, self.repeat,
83 87 _format_time(self.best, self._precision))
84 88 p.text(u'<TimeitResult : '+unic+u'>')
85 89
86 90
87 91 class TimeitTemplateFiller(ast.NodeTransformer):
88 92 """Fill in the AST template for timing execution.
89 93
90 94 This is quite closely tied to the template definition, which is in
91 95 :meth:`ExecutionMagics.timeit`.
92 96 """
93 97 def __init__(self, ast_setup, ast_stmt):
94 98 self.ast_setup = ast_setup
95 99 self.ast_stmt = ast_stmt
96 100
97 101 def visit_FunctionDef(self, node):
98 102 "Fill in the setup statement"
99 103 self.generic_visit(node)
100 104 if node.name == "inner":
101 105 node.body[:1] = self.ast_setup.body
102 106
103 107 return node
104 108
105 109 def visit_For(self, node):
106 110 "Fill in the statement to be timed"
107 111 if getattr(getattr(node.body[0], 'value', None), 'id', None) == 'stmt':
108 112 node.body = self.ast_stmt.body
109 113 return node
110 114
111 115
112 116 class Timer(timeit.Timer):
113 117 """Timer class that explicitly uses self.inner
114 118
115 119 which is an undocumented implementation detail of CPython,
116 120 not shared by PyPy.
117 121 """
118 122 # Timer.timeit copied from CPython 3.4.2
119 123 def timeit(self, number=timeit.default_number):
120 124 """Time 'number' executions of the main statement.
121 125
122 126 To be precise, this executes the setup statement once, and
123 127 then returns the time it takes to execute the main statement
124 128 a number of times, as a float measured in seconds. The
125 129 argument is the number of times through the loop, defaulting
126 130 to one million. The main statement, the setup statement and
127 131 the timer function to be used are passed to the constructor.
128 132 """
129 133 it = itertools.repeat(None, number)
130 134 gcold = gc.isenabled()
131 135 gc.disable()
132 136 try:
133 137 timing = self.inner(it, self.timer)
134 138 finally:
135 139 if gcold:
136 140 gc.enable()
137 141 return timing
138 142
139 143
140 144 @magics_class
141 145 class ExecutionMagics(Magics):
142 146 """Magics related to code execution, debugging, profiling, etc.
143 147
144 148 """
145 149
146 150 def __init__(self, shell):
147 151 super(ExecutionMagics, self).__init__(shell)
148 152 if profile is None:
149 153 self.prun = self.profile_missing_notice
150 154 # Default execution function used to actually run user code.
151 155 self.default_runner = None
152 156
153 157 def profile_missing_notice(self, *args, **kwargs):
154 158 error("""\
155 159 The profile module could not be found. It has been removed from the standard
156 160 python packages because of its non-free license. To use profiling, install the
157 161 python-profiler package from non-free.""")
158 162
159 163 @skip_doctest
160 164 @line_cell_magic
161 165 def prun(self, parameter_s='', cell=None):
162 166
163 167 """Run a statement through the python code profiler.
164 168
165 169 Usage, in line mode:
166 170 %prun [options] statement
167 171
168 172 Usage, in cell mode:
169 173 %%prun [options] [statement]
170 174 code...
171 175 code...
172 176
173 177 In cell mode, the additional code lines are appended to the (possibly
174 178 empty) statement in the first line. Cell mode allows you to easily
175 179 profile multiline blocks without having to put them in a separate
176 180 function.
177 181
178 182 The given statement (which doesn't require quote marks) is run via the
179 183 python profiler in a manner similar to the profile.run() function.
180 184 Namespaces are internally managed to work correctly; profile.run
181 185 cannot be used in IPython because it makes certain assumptions about
182 186 namespaces which do not hold under IPython.
183 187
184 188 Options:
185 189
186 190 -l <limit>
187 191 you can place restrictions on what or how much of the
188 192 profile gets printed. The limit value can be:
189 193
190 194 * A string: only information for function names containing this string
191 195 is printed.
192 196
193 197 * An integer: only these many lines are printed.
194 198
195 199 * A float (between 0 and 1): this fraction of the report is printed
196 200 (for example, use a limit of 0.4 to see the topmost 40% only).
197 201
198 202 You can combine several limits with repeated use of the option. For
199 203 example, ``-l __init__ -l 5`` will print only the topmost 5 lines of
200 204 information about class constructors.
201 205
202 206 -r
203 207 return the pstats.Stats object generated by the profiling. This
204 208 object has all the information about the profile in it, and you can
205 209 later use it for further analysis or in other functions.
206 210
207 211 -s <key>
208 212 sort profile by given key. You can provide more than one key
209 213 by using the option several times: '-s key1 -s key2 -s key3...'. The
210 214 default sorting key is 'time'.
211 215
212 216 The following is copied verbatim from the profile documentation
213 217 referenced below:
214 218
215 219 When more than one key is provided, additional keys are used as
216 220 secondary criteria when the there is equality in all keys selected
217 221 before them.
218 222
219 223 Abbreviations can be used for any key names, as long as the
220 224 abbreviation is unambiguous. The following are the keys currently
221 225 defined:
222 226
223 227 ============ =====================
224 228 Valid Arg Meaning
225 229 ============ =====================
226 230 "calls" call count
227 231 "cumulative" cumulative time
228 232 "file" file name
229 233 "module" file name
230 234 "pcalls" primitive call count
231 235 "line" line number
232 236 "name" function name
233 237 "nfl" name/file/line
234 238 "stdname" standard name
235 239 "time" internal time
236 240 ============ =====================
237 241
238 242 Note that all sorts on statistics are in descending order (placing
239 243 most time consuming items first), where as name, file, and line number
240 244 searches are in ascending order (i.e., alphabetical). The subtle
241 245 distinction between "nfl" and "stdname" is that the standard name is a
242 246 sort of the name as printed, which means that the embedded line
243 247 numbers get compared in an odd way. For example, lines 3, 20, and 40
244 248 would (if the file names were the same) appear in the string order
245 249 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
246 250 line numbers. In fact, sort_stats("nfl") is the same as
247 251 sort_stats("name", "file", "line").
248 252
249 253 -T <filename>
250 254 save profile results as shown on screen to a text
251 255 file. The profile is still shown on screen.
252 256
253 257 -D <filename>
254 258 save (via dump_stats) profile statistics to given
255 259 filename. This data is in a format understood by the pstats module, and
256 260 is generated by a call to the dump_stats() method of profile
257 261 objects. The profile is still shown on screen.
258 262
259 263 -q
260 264 suppress output to the pager. Best used with -T and/or -D above.
261 265
262 266 If you want to run complete programs under the profiler's control, use
263 267 ``%run -p [prof_opts] filename.py [args to program]`` where prof_opts
264 268 contains profiler specific options as described here.
265 269
266 270 You can read the complete documentation for the profile module with::
267 271
268 272 In [1]: import profile; profile.help()
269 273 """
270 274 opts, arg_str = self.parse_options(parameter_s, 'D:l:rs:T:q',
271 275 list_all=True, posix=False)
272 276 if cell is not None:
273 277 arg_str += '\n' + cell
274 278 arg_str = self.shell.input_splitter.transform_cell(arg_str)
275 279 return self._run_with_profiler(arg_str, opts, self.shell.user_ns)
276 280
277 281 def _run_with_profiler(self, code, opts, namespace):
278 282 """
279 283 Run `code` with profiler. Used by ``%prun`` and ``%run -p``.
280 284
281 285 Parameters
282 286 ----------
283 287 code : str
284 288 Code to be executed.
285 289 opts : Struct
286 290 Options parsed by `self.parse_options`.
287 291 namespace : dict
288 292 A dictionary for Python namespace (e.g., `self.shell.user_ns`).
289 293
290 294 """
291 295
292 296 # Fill default values for unspecified options:
293 297 opts.merge(Struct(D=[''], l=[], s=['time'], T=['']))
294 298
295 299 prof = profile.Profile()
296 300 try:
297 301 prof = prof.runctx(code, namespace, namespace)
298 302 sys_exit = ''
299 303 except SystemExit:
300 304 sys_exit = """*** SystemExit exception caught in code being profiled."""
301 305
302 306 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
303 307
304 308 lims = opts.l
305 309 if lims:
306 310 lims = [] # rebuild lims with ints/floats/strings
307 311 for lim in opts.l:
308 312 try:
309 313 lims.append(int(lim))
310 314 except ValueError:
311 315 try:
312 316 lims.append(float(lim))
313 317 except ValueError:
314 318 lims.append(lim)
315 319
316 320 # Trap output.
317 321 stdout_trap = StringIO()
318 322 stats_stream = stats.stream
319 323 try:
320 324 stats.stream = stdout_trap
321 325 stats.print_stats(*lims)
322 326 finally:
323 327 stats.stream = stats_stream
324 328
325 329 output = stdout_trap.getvalue()
326 330 output = output.rstrip()
327 331
328 332 if 'q' not in opts:
329 333 page.page(output)
330 334 print(sys_exit, end=' ')
331 335
332 336 dump_file = opts.D[0]
333 337 text_file = opts.T[0]
334 338 if dump_file:
335 339 dump_file = unquote_filename(dump_file)
336 340 prof.dump_stats(dump_file)
337 341 print('\n*** Profile stats marshalled to file',\
338 342 repr(dump_file)+'.',sys_exit)
339 343 if text_file:
340 344 text_file = unquote_filename(text_file)
341 345 pfile = open(text_file,'w')
342 346 pfile.write(output)
343 347 pfile.close()
344 348 print('\n*** Profile printout saved to text file',\
345 349 repr(text_file)+'.',sys_exit)
346 350
347 351 if 'r' in opts:
348 352 return stats
349 353 else:
350 354 return None
351 355
352 356 @line_magic
353 357 def pdb(self, parameter_s=''):
354 358 """Control the automatic calling of the pdb interactive debugger.
355 359
356 360 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
357 361 argument it works as a toggle.
358 362
359 363 When an exception is triggered, IPython can optionally call the
360 364 interactive pdb debugger after the traceback printout. %pdb toggles
361 365 this feature on and off.
362 366
363 367 The initial state of this feature is set in your configuration
364 368 file (the option is ``InteractiveShell.pdb``).
365 369
366 370 If you want to just activate the debugger AFTER an exception has fired,
367 371 without having to type '%pdb on' and rerunning your code, you can use
368 372 the %debug magic."""
369 373
370 374 par = parameter_s.strip().lower()
371 375
372 376 if par:
373 377 try:
374 378 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
375 379 except KeyError:
376 380 print ('Incorrect argument. Use on/1, off/0, '
377 381 'or nothing for a toggle.')
378 382 return
379 383 else:
380 384 # toggle
381 385 new_pdb = not self.shell.call_pdb
382 386
383 387 # set on the shell
384 388 self.shell.call_pdb = new_pdb
385 389 print('Automatic pdb calling has been turned',on_off(new_pdb))
386 390
387 391 @skip_doctest
388 392 @magic_arguments.magic_arguments()
389 393 @magic_arguments.argument('--breakpoint', '-b', metavar='FILE:LINE',
390 394 help="""
391 395 Set break point at LINE in FILE.
392 396 """
393 397 )
394 398 @magic_arguments.argument('statement', nargs='*',
395 399 help="""
396 400 Code to run in debugger.
397 401 You can omit this in cell magic mode.
398 402 """
399 403 )
400 404 @line_cell_magic
401 405 def debug(self, line='', cell=None):
402 406 """Activate the interactive debugger.
403 407
404 408 This magic command support two ways of activating debugger.
405 409 One is to activate debugger before executing code. This way, you
406 410 can set a break point, to step through the code from the point.
407 411 You can use this mode by giving statements to execute and optionally
408 412 a breakpoint.
409 413
410 414 The other one is to activate debugger in post-mortem mode. You can
411 415 activate this mode simply running %debug without any argument.
412 416 If an exception has just occurred, this lets you inspect its stack
413 417 frames interactively. Note that this will always work only on the last
414 418 traceback that occurred, so you must call this quickly after an
415 419 exception that you wish to inspect has fired, because if another one
416 420 occurs, it clobbers the previous one.
417 421
418 422 If you want IPython to automatically do this on every exception, see
419 423 the %pdb magic for more details.
420 424 """
421 425 args = magic_arguments.parse_argstring(self.debug, line)
422 426
423 427 if not (args.breakpoint or args.statement or cell):
424 428 self._debug_post_mortem()
425 429 else:
426 430 code = "\n".join(args.statement)
427 431 if cell:
428 432 code += "\n" + cell
429 433 self._debug_exec(code, args.breakpoint)
430 434
431 435 def _debug_post_mortem(self):
432 436 self.shell.debugger(force=True)
433 437
434 438 def _debug_exec(self, code, breakpoint):
435 439 if breakpoint:
436 440 (filename, bp_line) = breakpoint.split(':', 1)
437 441 bp_line = int(bp_line)
438 442 else:
439 443 (filename, bp_line) = (None, None)
440 444 self._run_with_debugger(code, self.shell.user_ns, filename, bp_line)
441 445
442 446 @line_magic
443 447 def tb(self, s):
444 448 """Print the last traceback with the currently active exception mode.
445 449
446 450 See %xmode for changing exception reporting modes."""
447 451 self.shell.showtraceback()
448 452
449 453 @skip_doctest
450 454 @line_magic
451 455 def run(self, parameter_s='', runner=None,
452 456 file_finder=get_py_filename):
453 457 """Run the named file inside IPython as a program.
454 458
455 459 Usage::
456 460
457 461 %run [-n -i -e -G]
458 462 [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )]
459 463 ( -m mod | file ) [args]
460 464
461 465 Parameters after the filename are passed as command-line arguments to
462 466 the program (put in sys.argv). Then, control returns to IPython's
463 467 prompt.
464 468
465 469 This is similar to running at a system prompt ``python file args``,
466 470 but with the advantage of giving you IPython's tracebacks, and of
467 471 loading all variables into your interactive namespace for further use
468 472 (unless -p is used, see below).
469 473
470 474 The file is executed in a namespace initially consisting only of
471 475 ``__name__=='__main__'`` and sys.argv constructed as indicated. It thus
472 476 sees its environment as if it were being run as a stand-alone program
473 477 (except for sharing global objects such as previously imported
474 478 modules). But after execution, the IPython interactive namespace gets
475 479 updated with all variables defined in the program (except for __name__
476 480 and sys.argv). This allows for very convenient loading of code for
477 481 interactive work, while giving each program a 'clean sheet' to run in.
478 482
479 483 Arguments are expanded using shell-like glob match. Patterns
480 484 '*', '?', '[seq]' and '[!seq]' can be used. Additionally,
481 485 tilde '~' will be expanded into user's home directory. Unlike
482 486 real shells, quotation does not suppress expansions. Use
483 487 *two* back slashes (e.g. ``\\\\*``) to suppress expansions.
484 488 To completely disable these expansions, you can use -G flag.
485 489
486 490 Options:
487 491
488 492 -n
489 493 __name__ is NOT set to '__main__', but to the running file's name
490 494 without extension (as python does under import). This allows running
491 495 scripts and reloading the definitions in them without calling code
492 496 protected by an ``if __name__ == "__main__"`` clause.
493 497
494 498 -i
495 499 run the file in IPython's namespace instead of an empty one. This
496 500 is useful if you are experimenting with code written in a text editor
497 501 which depends on variables defined interactively.
498 502
499 503 -e
500 504 ignore sys.exit() calls or SystemExit exceptions in the script
501 505 being run. This is particularly useful if IPython is being used to
502 506 run unittests, which always exit with a sys.exit() call. In such
503 507 cases you are interested in the output of the test results, not in
504 508 seeing a traceback of the unittest module.
505 509
506 510 -t
507 511 print timing information at the end of the run. IPython will give
508 512 you an estimated CPU time consumption for your script, which under
509 513 Unix uses the resource module to avoid the wraparound problems of
510 514 time.clock(). Under Unix, an estimate of time spent on system tasks
511 515 is also given (for Windows platforms this is reported as 0.0).
512 516
513 517 If -t is given, an additional ``-N<N>`` option can be given, where <N>
514 518 must be an integer indicating how many times you want the script to
515 519 run. The final timing report will include total and per run results.
516 520
517 521 For example (testing the script uniq_stable.py)::
518 522
519 523 In [1]: run -t uniq_stable
520 524
521 525 IPython CPU timings (estimated):
522 526 User : 0.19597 s.
523 527 System: 0.0 s.
524 528
525 529 In [2]: run -t -N5 uniq_stable
526 530
527 531 IPython CPU timings (estimated):
528 532 Total runs performed: 5
529 533 Times : Total Per run
530 534 User : 0.910862 s, 0.1821724 s.
531 535 System: 0.0 s, 0.0 s.
532 536
533 537 -d
534 538 run your program under the control of pdb, the Python debugger.
535 539 This allows you to execute your program step by step, watch variables,
536 540 etc. Internally, what IPython does is similar to calling::
537 541
538 542 pdb.run('execfile("YOURFILENAME")')
539 543
540 544 with a breakpoint set on line 1 of your file. You can change the line
541 545 number for this automatic breakpoint to be <N> by using the -bN option
542 546 (where N must be an integer). For example::
543 547
544 548 %run -d -b40 myscript
545 549
546 550 will set the first breakpoint at line 40 in myscript.py. Note that
547 551 the first breakpoint must be set on a line which actually does
548 552 something (not a comment or docstring) for it to stop execution.
549 553
550 554 Or you can specify a breakpoint in a different file::
551 555
552 556 %run -d -b myotherfile.py:20 myscript
553 557
554 558 When the pdb debugger starts, you will see a (Pdb) prompt. You must
555 559 first enter 'c' (without quotes) to start execution up to the first
556 560 breakpoint.
557 561
558 562 Entering 'help' gives information about the use of the debugger. You
559 563 can easily see pdb's full documentation with "import pdb;pdb.help()"
560 564 at a prompt.
561 565
562 566 -p
563 567 run program under the control of the Python profiler module (which
564 568 prints a detailed report of execution times, function calls, etc).
565 569
566 570 You can pass other options after -p which affect the behavior of the
567 571 profiler itself. See the docs for %prun for details.
568 572
569 573 In this mode, the program's variables do NOT propagate back to the
570 574 IPython interactive namespace (because they remain in the namespace
571 575 where the profiler executes them).
572 576
573 577 Internally this triggers a call to %prun, see its documentation for
574 578 details on the options available specifically for profiling.
575 579
576 580 There is one special usage for which the text above doesn't apply:
577 581 if the filename ends with .ipy[nb], the file is run as ipython script,
578 582 just as if the commands were written on IPython prompt.
579 583
580 584 -m
581 585 specify module name to load instead of script path. Similar to
582 586 the -m option for the python interpreter. Use this option last if you
583 587 want to combine with other %run options. Unlike the python interpreter
584 588 only source modules are allowed no .pyc or .pyo files.
585 589 For example::
586 590
587 591 %run -m example
588 592
589 593 will run the example module.
590 594
591 595 -G
592 596 disable shell-like glob expansion of arguments.
593 597
594 598 """
595 599
596 600 # get arguments and set sys.argv for program to be run.
597 601 opts, arg_lst = self.parse_options(parameter_s,
598 602 'nidtN:b:pD:l:rs:T:em:G',
599 603 mode='list', list_all=1)
600 604 if "m" in opts:
601 605 modulename = opts["m"][0]
602 606 modpath = find_mod(modulename)
603 607 if modpath is None:
604 608 warn('%r is not a valid modulename on sys.path'%modulename)
605 609 return
606 610 arg_lst = [modpath] + arg_lst
607 611 try:
608 612 filename = file_finder(arg_lst[0])
609 613 except IndexError:
610 614 warn('you must provide at least a filename.')
611 615 print('\n%run:\n', oinspect.getdoc(self.run))
612 616 return
613 617 except IOError as e:
614 618 try:
615 619 msg = str(e)
616 620 except UnicodeError:
617 621 msg = e.message
618 622 error(msg)
619 623 return
620 624
621 625 if filename.lower().endswith(('.ipy', '.ipynb')):
622 626 with preserve_keys(self.shell.user_ns, '__file__'):
623 627 self.shell.user_ns['__file__'] = filename
624 628 self.shell.safe_execfile_ipy(filename)
625 629 return
626 630
627 631 # Control the response to exit() calls made by the script being run
628 632 exit_ignore = 'e' in opts
629 633
630 634 # Make sure that the running script gets a proper sys.argv as if it
631 635 # were run from a system shell.
632 636 save_argv = sys.argv # save it for later restoring
633 637
634 638 if 'G' in opts:
635 639 args = arg_lst[1:]
636 640 else:
637 641 # tilde and glob expansion
638 642 args = shellglob(map(os.path.expanduser, arg_lst[1:]))
639 643
640 644 sys.argv = [filename] + args # put in the proper filename
641 645 # protect sys.argv from potential unicode strings on Python 2:
642 646 if not py3compat.PY3:
643 647 sys.argv = [ py3compat.cast_bytes(a) for a in sys.argv ]
644 648
645 649 if 'i' in opts:
646 650 # Run in user's interactive namespace
647 651 prog_ns = self.shell.user_ns
648 652 __name__save = self.shell.user_ns['__name__']
649 653 prog_ns['__name__'] = '__main__'
650 654 main_mod = self.shell.user_module
651 655
652 656 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
653 657 # set the __file__ global in the script's namespace
654 658 # TK: Is this necessary in interactive mode?
655 659 prog_ns['__file__'] = filename
656 660 else:
657 661 # Run in a fresh, empty namespace
658 662 if 'n' in opts:
659 663 name = os.path.splitext(os.path.basename(filename))[0]
660 664 else:
661 665 name = '__main__'
662 666
663 667 # The shell MUST hold a reference to prog_ns so after %run
664 668 # exits, the python deletion mechanism doesn't zero it out
665 669 # (leaving dangling references). See interactiveshell for details
666 670 main_mod = self.shell.new_main_mod(filename, name)
667 671 prog_ns = main_mod.__dict__
668 672
669 673 # pickle fix. See interactiveshell for an explanation. But we need to
670 674 # make sure that, if we overwrite __main__, we replace it at the end
671 675 main_mod_name = prog_ns['__name__']
672 676
673 677 if main_mod_name == '__main__':
674 678 restore_main = sys.modules['__main__']
675 679 else:
676 680 restore_main = False
677 681
678 682 # This needs to be undone at the end to prevent holding references to
679 683 # every single object ever created.
680 684 sys.modules[main_mod_name] = main_mod
681 685
682 686 if 'p' in opts or 'd' in opts:
683 687 if 'm' in opts:
684 688 code = 'run_module(modulename, prog_ns)'
685 689 code_ns = {
686 690 'run_module': self.shell.safe_run_module,
687 691 'prog_ns': prog_ns,
688 692 'modulename': modulename,
689 693 }
690 694 else:
691 695 if 'd' in opts:
692 696 # allow exceptions to raise in debug mode
693 697 code = 'execfile(filename, prog_ns, raise_exceptions=True)'
694 698 else:
695 699 code = 'execfile(filename, prog_ns)'
696 700 code_ns = {
697 701 'execfile': self.shell.safe_execfile,
698 702 'prog_ns': prog_ns,
699 703 'filename': get_py_filename(filename),
700 704 }
701 705
702 706 try:
703 707 stats = None
704 708 with self.shell.readline_no_record:
705 709 if 'p' in opts:
706 710 stats = self._run_with_profiler(code, opts, code_ns)
707 711 else:
708 712 if 'd' in opts:
709 713 bp_file, bp_line = parse_breakpoint(
710 714 opts.get('b', ['1'])[0], filename)
711 715 self._run_with_debugger(
712 716 code, code_ns, filename, bp_line, bp_file)
713 717 else:
714 718 if 'm' in opts:
715 719 def run():
716 720 self.shell.safe_run_module(modulename, prog_ns)
717 721 else:
718 722 if runner is None:
719 723 runner = self.default_runner
720 724 if runner is None:
721 725 runner = self.shell.safe_execfile
722 726
723 727 def run():
724 728 runner(filename, prog_ns, prog_ns,
725 729 exit_ignore=exit_ignore)
726 730
727 731 if 't' in opts:
728 732 # timed execution
729 733 try:
730 734 nruns = int(opts['N'][0])
731 735 if nruns < 1:
732 736 error('Number of runs must be >=1')
733 737 return
734 738 except (KeyError):
735 739 nruns = 1
736 740 self._run_with_timing(run, nruns)
737 741 else:
738 742 # regular execution
739 743 run()
740 744
741 745 if 'i' in opts:
742 746 self.shell.user_ns['__name__'] = __name__save
743 747 else:
744 748 # update IPython interactive namespace
745 749
746 750 # Some forms of read errors on the file may mean the
747 751 # __name__ key was never set; using pop we don't have to
748 752 # worry about a possible KeyError.
749 753 prog_ns.pop('__name__', None)
750 754
751 755 with preserve_keys(self.shell.user_ns, '__file__'):
752 756 self.shell.user_ns.update(prog_ns)
753 757 finally:
754 758 # It's a bit of a mystery why, but __builtins__ can change from
755 759 # being a module to becoming a dict missing some key data after
756 760 # %run. As best I can see, this is NOT something IPython is doing
757 761 # at all, and similar problems have been reported before:
758 762 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
759 763 # Since this seems to be done by the interpreter itself, the best
760 764 # we can do is to at least restore __builtins__ for the user on
761 765 # exit.
762 766 self.shell.user_ns['__builtins__'] = builtin_mod
763 767
764 768 # Ensure key global structures are restored
765 769 sys.argv = save_argv
766 770 if restore_main:
767 771 sys.modules['__main__'] = restore_main
768 772 else:
769 773 # Remove from sys.modules the reference to main_mod we'd
770 774 # added. Otherwise it will trap references to objects
771 775 # contained therein.
772 776 del sys.modules[main_mod_name]
773 777
774 778 return stats
775 779
776 780 def _run_with_debugger(self, code, code_ns, filename=None,
777 781 bp_line=None, bp_file=None):
778 782 """
779 783 Run `code` in debugger with a break point.
780 784
781 785 Parameters
782 786 ----------
783 787 code : str
784 788 Code to execute.
785 789 code_ns : dict
786 790 A namespace in which `code` is executed.
787 791 filename : str
788 792 `code` is ran as if it is in `filename`.
789 793 bp_line : int, optional
790 794 Line number of the break point.
791 795 bp_file : str, optional
792 796 Path to the file in which break point is specified.
793 797 `filename` is used if not given.
794 798
795 799 Raises
796 800 ------
797 801 UsageError
798 802 If the break point given by `bp_line` is not valid.
799 803
800 804 """
801 805 deb = debugger.Pdb(self.shell.colors)
802 806 # reset Breakpoint state, which is moronically kept
803 807 # in a class
804 808 bdb.Breakpoint.next = 1
805 809 bdb.Breakpoint.bplist = {}
806 810 bdb.Breakpoint.bpbynumber = [None]
807 811 if bp_line is not None:
808 812 # Set an initial breakpoint to stop execution
809 813 maxtries = 10
810 814 bp_file = bp_file or filename
811 815 checkline = deb.checkline(bp_file, bp_line)
812 816 if not checkline:
813 817 for bp in range(bp_line + 1, bp_line + maxtries + 1):
814 818 if deb.checkline(bp_file, bp):
815 819 break
816 820 else:
817 821 msg = ("\nI failed to find a valid line to set "
818 822 "a breakpoint\n"
819 823 "after trying up to line: %s.\n"
820 824 "Please set a valid breakpoint manually "
821 825 "with the -b option." % bp)
822 826 raise UsageError(msg)
823 827 # if we find a good linenumber, set the breakpoint
824 828 deb.do_break('%s:%s' % (bp_file, bp_line))
825 829
826 830 if filename:
827 831 # Mimic Pdb._runscript(...)
828 832 deb._wait_for_mainpyfile = True
829 833 deb.mainpyfile = deb.canonic(filename)
830 834
831 835 # Start file run
832 836 print("NOTE: Enter 'c' at the %s prompt to continue execution." % deb.prompt)
833 837 try:
834 838 if filename:
835 839 # save filename so it can be used by methods on the deb object
836 840 deb._exec_filename = filename
837 841 while True:
838 842 try:
839 843 deb.run(code, code_ns)
840 844 except Restart:
841 845 print("Restarting")
842 846 if filename:
843 847 deb._wait_for_mainpyfile = True
844 848 deb.mainpyfile = deb.canonic(filename)
845 849 continue
846 850 else:
847 851 break
848 852
849 853
850 854 except:
851 855 etype, value, tb = sys.exc_info()
852 856 # Skip three frames in the traceback: the %run one,
853 857 # one inside bdb.py, and the command-line typed by the
854 858 # user (run by exec in pdb itself).
855 859 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
856 860
857 861 @staticmethod
858 862 def _run_with_timing(run, nruns):
859 863 """
860 864 Run function `run` and print timing information.
861 865
862 866 Parameters
863 867 ----------
864 868 run : callable
865 869 Any callable object which takes no argument.
866 870 nruns : int
867 871 Number of times to execute `run`.
868 872
869 873 """
870 874 twall0 = time.time()
871 875 if nruns == 1:
872 876 t0 = clock2()
873 877 run()
874 878 t1 = clock2()
875 879 t_usr = t1[0] - t0[0]
876 880 t_sys = t1[1] - t0[1]
877 881 print("\nIPython CPU timings (estimated):")
878 882 print(" User : %10.2f s." % t_usr)
879 883 print(" System : %10.2f s." % t_sys)
880 884 else:
881 885 runs = range(nruns)
882 886 t0 = clock2()
883 887 for nr in runs:
884 888 run()
885 889 t1 = clock2()
886 890 t_usr = t1[0] - t0[0]
887 891 t_sys = t1[1] - t0[1]
888 892 print("\nIPython CPU timings (estimated):")
889 893 print("Total runs performed:", nruns)
890 894 print(" Times : %10s %10s" % ('Total', 'Per run'))
891 895 print(" User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns))
892 896 print(" System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns))
893 897 twall1 = time.time()
894 898 print("Wall time: %10.2f s." % (twall1 - twall0))
895 899
896 900 @skip_doctest
897 901 @line_cell_magic
898 902 def timeit(self, line='', cell=None):
899 903 """Time execution of a Python statement or expression
900 904
901 905 Usage, in line mode:
902 906 %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
903 907 or in cell mode:
904 908 %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
905 909 code
906 910 code...
907 911
908 912 Time execution of a Python statement or expression using the timeit
909 913 module. This function can be used both as a line and cell magic:
910 914
911 915 - In line mode you can time a single-line statement (though multiple
912 916 ones can be chained with using semicolons).
913 917
914 918 - In cell mode, the statement in the first line is used as setup code
915 919 (executed but not timed) and the body of the cell is timed. The cell
916 920 body has access to any variables created in the setup code.
917 921
918 922 Options:
919 923 -n<N>: execute the given statement <N> times in a loop. If this value
920 924 is not given, a fitting value is chosen.
921 925
922 926 -r<R>: repeat the loop iteration <R> times and take the best result.
923 927 Default: 3
924 928
925 929 -t: use time.time to measure the time, which is the default on Unix.
926 930 This function measures wall time.
927 931
928 932 -c: use time.clock to measure the time, which is the default on
929 933 Windows and measures wall time. On Unix, resource.getrusage is used
930 934 instead and returns the CPU user time.
931 935
932 936 -p<P>: use a precision of <P> digits to display the timing result.
933 937 Default: 3
934 938
935 939 -q: Quiet, do not print result.
936 940
937 941 -o: return a TimeitResult that can be stored in a variable to inspect
938 942 the result in more details.
939 943
940 944
941 945 Examples
942 946 --------
943 947 ::
944 948
945 949 In [1]: %timeit pass
946 950 10000000 loops, best of 3: 53.3 ns per loop
947 951
948 952 In [2]: u = None
949 953
950 954 In [3]: %timeit u is None
951 955 10000000 loops, best of 3: 184 ns per loop
952 956
953 957 In [4]: %timeit -r 4 u == None
954 958 1000000 loops, best of 4: 242 ns per loop
955 959
956 960 In [5]: import time
957 961
958 962 In [6]: %timeit -n1 time.sleep(2)
959 1 loops, best of 3: 2 s per loop
963 1 loop, best of 3: 2 s per loop
960 964
961 965
962 966 The times reported by %timeit will be slightly higher than those
963 967 reported by the timeit.py script when variables are accessed. This is
964 968 due to the fact that %timeit executes the statement in the namespace
965 969 of the shell, compared with timeit.py, which uses a single setup
966 970 statement to import function or create variables. Generally, the bias
967 971 does not matter as long as results from timeit.py are not mixed with
968 972 those from %timeit."""
969 973
970 974 opts, stmt = self.parse_options(line,'n:r:tcp:qo',
971 975 posix=False, strict=False)
972 976 if stmt == "" and cell is None:
973 977 return
974 978
975 979 timefunc = timeit.default_timer
976 980 number = int(getattr(opts, "n", 0))
977 981 repeat = int(getattr(opts, "r", timeit.default_repeat))
978 982 precision = int(getattr(opts, "p", 3))
979 983 quiet = 'q' in opts
980 984 return_result = 'o' in opts
981 985 if hasattr(opts, "t"):
982 986 timefunc = time.time
983 987 if hasattr(opts, "c"):
984 988 timefunc = clock
985 989
986 990 timer = Timer(timer=timefunc)
987 991 # this code has tight coupling to the inner workings of timeit.Timer,
988 992 # but is there a better way to achieve that the code stmt has access
989 993 # to the shell namespace?
990 994 transform = self.shell.input_splitter.transform_cell
991 995
992 996 if cell is None:
993 997 # called as line magic
994 998 ast_setup = self.shell.compile.ast_parse("pass")
995 999 ast_stmt = self.shell.compile.ast_parse(transform(stmt))
996 1000 else:
997 1001 ast_setup = self.shell.compile.ast_parse(transform(stmt))
998 1002 ast_stmt = self.shell.compile.ast_parse(transform(cell))
999 1003
1000 1004 ast_setup = self.shell.transform_ast(ast_setup)
1001 1005 ast_stmt = self.shell.transform_ast(ast_stmt)
1002 1006
1003 1007 # This codestring is taken from timeit.template - we fill it in as an
1004 1008 # AST, so that we can apply our AST transformations to the user code
1005 1009 # without affecting the timing code.
1006 1010 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
1007 1011 ' setup\n'
1008 1012 ' _t0 = _timer()\n'
1009 1013 ' for _i in _it:\n'
1010 1014 ' stmt\n'
1011 1015 ' _t1 = _timer()\n'
1012 1016 ' return _t1 - _t0\n')
1013 1017
1014 1018 timeit_ast = TimeitTemplateFiller(ast_setup, ast_stmt).visit(timeit_ast_template)
1015 1019 timeit_ast = ast.fix_missing_locations(timeit_ast)
1016 1020
1017 1021 # Track compilation time so it can be reported if too long
1018 1022 # Minimum time above which compilation time will be reported
1019 1023 tc_min = 0.1
1020 1024
1021 1025 t0 = clock()
1022 1026 code = self.shell.compile(timeit_ast, "<magic-timeit>", "exec")
1023 1027 tc = clock()-t0
1024 1028
1025 1029 ns = {}
1026 1030 exec(code, self.shell.user_ns, ns)
1027 1031 timer.inner = ns["inner"]
1028 1032
1029 1033 # This is used to check if there is a huge difference between the
1030 1034 # best and worst timings.
1031 1035 # Issue: https://github.com/ipython/ipython/issues/6471
1032 1036 worst_tuning = 0
1033 1037 if number == 0:
1034 1038 # determine number so that 0.2 <= total time < 2.0
1035 1039 number = 1
1036 1040 for _ in range(1, 10):
1037 1041 time_number = timer.timeit(number)
1038 1042 worst_tuning = max(worst_tuning, time_number / number)
1039 1043 if time_number >= 0.2:
1040 1044 break
1041 1045 number *= 10
1042 1046 all_runs = timer.repeat(repeat, number)
1043 1047 best = min(all_runs) / number
1044 1048
1045 1049 worst = max(all_runs) / number
1046 1050 if worst_tuning:
1047 1051 worst = max(worst, worst_tuning)
1048 1052
1049 1053 if not quiet :
1050 1054 # Check best timing is greater than zero to avoid a
1051 1055 # ZeroDivisionError.
1052 1056 # In cases where the slowest timing is lesser than a micosecond
1053 1057 # we assume that it does not really matter if the fastest
1054 1058 # timing is 4 times faster than the slowest timing or not.
1055 1059 if worst > 4 * best and best > 0 and worst > 1e-6:
1056 1060 print("The slowest run took %0.2f times longer than the "
1057 1061 "fastest. This could mean that an intermediate result "
1058 "is being cached " % (worst / best))
1062 "is being cached." % (worst / best))
1063 if number == 1: # No s at "loops" if only one loop
1064 print(u"%d loop, best of %d: %s per loop" % (number, repeat,
1065 _format_time(best, precision)))
1066 else:
1059 1067 print(u"%d loops, best of %d: %s per loop" % (number, repeat,
1060 1068 _format_time(best, precision)))
1061 1069 if tc > tc_min:
1062 1070 print("Compiler time: %.2f s" % tc)
1063 1071 if return_result:
1064 1072 return TimeitResult(number, repeat, best, worst, all_runs, tc, precision)
1065 1073
1066 1074 @skip_doctest
1067 1075 @needs_local_scope
1068 1076 @line_cell_magic
1069 1077 def time(self,line='', cell=None, local_ns=None):
1070 1078 """Time execution of a Python statement or expression.
1071 1079
1072 1080 The CPU and wall clock times are printed, and the value of the
1073 1081 expression (if any) is returned. Note that under Win32, system time
1074 1082 is always reported as 0, since it can not be measured.
1075 1083
1076 1084 This function can be used both as a line and cell magic:
1077 1085
1078 1086 - In line mode you can time a single-line statement (though multiple
1079 1087 ones can be chained with using semicolons).
1080 1088
1081 1089 - In cell mode, you can time the cell body (a directly
1082 1090 following statement raises an error).
1083 1091
1084 1092 This function provides very basic timing functionality. Use the timeit
1085 1093 magic for more control over the measurement.
1086 1094
1087 1095 Examples
1088 1096 --------
1089 1097 ::
1090 1098
1091 1099 In [1]: %time 2**128
1092 1100 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1093 1101 Wall time: 0.00
1094 1102 Out[1]: 340282366920938463463374607431768211456L
1095 1103
1096 1104 In [2]: n = 1000000
1097 1105
1098 1106 In [3]: %time sum(range(n))
1099 1107 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1100 1108 Wall time: 1.37
1101 1109 Out[3]: 499999500000L
1102 1110
1103 1111 In [4]: %time print 'hello world'
1104 1112 hello world
1105 1113 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1106 1114 Wall time: 0.00
1107 1115
1108 1116 Note that the time needed by Python to compile the given expression
1109 1117 will be reported if it is more than 0.1s. In this example, the
1110 1118 actual exponentiation is done by Python at compilation time, so while
1111 1119 the expression can take a noticeable amount of time to compute, that
1112 1120 time is purely due to the compilation:
1113 1121
1114 1122 In [5]: %time 3**9999;
1115 1123 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1116 1124 Wall time: 0.00 s
1117 1125
1118 1126 In [6]: %time 3**999999;
1119 1127 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1120 1128 Wall time: 0.00 s
1121 1129 Compiler : 0.78 s
1122 1130 """
1123 1131
1124 1132 # fail immediately if the given expression can't be compiled
1125 1133
1126 1134 if line and cell:
1127 1135 raise UsageError("Can't use statement directly after '%%time'!")
1128 1136
1129 1137 if cell:
1130 1138 expr = self.shell.input_transformer_manager.transform_cell(cell)
1131 1139 else:
1132 1140 expr = self.shell.input_transformer_manager.transform_cell(line)
1133 1141
1134 1142 # Minimum time above which parse time will be reported
1135 1143 tp_min = 0.1
1136 1144
1137 1145 t0 = clock()
1138 1146 expr_ast = self.shell.compile.ast_parse(expr)
1139 1147 tp = clock()-t0
1140 1148
1141 1149 # Apply AST transformations
1142 1150 expr_ast = self.shell.transform_ast(expr_ast)
1143 1151
1144 1152 # Minimum time above which compilation time will be reported
1145 1153 tc_min = 0.1
1146 1154
1147 1155 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1148 1156 mode = 'eval'
1149 1157 source = '<timed eval>'
1150 1158 expr_ast = ast.Expression(expr_ast.body[0].value)
1151 1159 else:
1152 1160 mode = 'exec'
1153 1161 source = '<timed exec>'
1154 1162 t0 = clock()
1155 1163 code = self.shell.compile(expr_ast, source, mode)
1156 1164 tc = clock()-t0
1157 1165
1158 1166 # skew measurement as little as possible
1159 1167 glob = self.shell.user_ns
1160 1168 wtime = time.time
1161 1169 # time execution
1162 1170 wall_st = wtime()
1163 1171 if mode=='eval':
1164 1172 st = clock2()
1165 1173 out = eval(code, glob, local_ns)
1166 1174 end = clock2()
1167 1175 else:
1168 1176 st = clock2()
1169 1177 exec(code, glob, local_ns)
1170 1178 end = clock2()
1171 1179 out = None
1172 1180 wall_end = wtime()
1173 1181 # Compute actual times and report
1174 1182 wall_time = wall_end-wall_st
1175 1183 cpu_user = end[0]-st[0]
1176 1184 cpu_sys = end[1]-st[1]
1177 1185 cpu_tot = cpu_user+cpu_sys
1178 1186 # On windows cpu_sys is always zero, so no new information to the next print
1179 1187 if sys.platform != 'win32':
1180 1188 print("CPU times: user %s, sys: %s, total: %s" % \
1181 1189 (_format_time(cpu_user),_format_time(cpu_sys),_format_time(cpu_tot)))
1182 1190 print("Wall time: %s" % _format_time(wall_time))
1183 1191 if tc > tc_min:
1184 1192 print("Compiler : %s" % _format_time(tc))
1185 1193 if tp > tp_min:
1186 1194 print("Parser : %s" % _format_time(tp))
1187 1195 return out
1188 1196
1189 1197 @skip_doctest
1190 1198 @line_magic
1191 1199 def macro(self, parameter_s=''):
1192 1200 """Define a macro for future re-execution. It accepts ranges of history,
1193 1201 filenames or string objects.
1194 1202
1195 1203 Usage:\\
1196 1204 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1197 1205
1198 1206 Options:
1199 1207
1200 1208 -r: use 'raw' input. By default, the 'processed' history is used,
1201 1209 so that magics are loaded in their transformed version to valid
1202 1210 Python. If this option is given, the raw input as typed at the
1203 1211 command line is used instead.
1204 1212
1205 1213 -q: quiet macro definition. By default, a tag line is printed
1206 1214 to indicate the macro has been created, and then the contents of
1207 1215 the macro are printed. If this option is given, then no printout
1208 1216 is produced once the macro is created.
1209 1217
1210 1218 This will define a global variable called `name` which is a string
1211 1219 made of joining the slices and lines you specify (n1,n2,... numbers
1212 1220 above) from your input history into a single string. This variable
1213 1221 acts like an automatic function which re-executes those lines as if
1214 1222 you had typed them. You just type 'name' at the prompt and the code
1215 1223 executes.
1216 1224
1217 1225 The syntax for indicating input ranges is described in %history.
1218 1226
1219 1227 Note: as a 'hidden' feature, you can also use traditional python slice
1220 1228 notation, where N:M means numbers N through M-1.
1221 1229
1222 1230 For example, if your history contains (print using %hist -n )::
1223 1231
1224 1232 44: x=1
1225 1233 45: y=3
1226 1234 46: z=x+y
1227 1235 47: print x
1228 1236 48: a=5
1229 1237 49: print 'x',x,'y',y
1230 1238
1231 1239 you can create a macro with lines 44 through 47 (included) and line 49
1232 1240 called my_macro with::
1233 1241
1234 1242 In [55]: %macro my_macro 44-47 49
1235 1243
1236 1244 Now, typing `my_macro` (without quotes) will re-execute all this code
1237 1245 in one pass.
1238 1246
1239 1247 You don't need to give the line-numbers in order, and any given line
1240 1248 number can appear multiple times. You can assemble macros with any
1241 1249 lines from your input history in any order.
1242 1250
1243 1251 The macro is a simple object which holds its value in an attribute,
1244 1252 but IPython's display system checks for macros and executes them as
1245 1253 code instead of printing them when you type their name.
1246 1254
1247 1255 You can view a macro's contents by explicitly printing it with::
1248 1256
1249 1257 print macro_name
1250 1258
1251 1259 """
1252 1260 opts,args = self.parse_options(parameter_s,'rq',mode='list')
1253 1261 if not args: # List existing macros
1254 1262 return sorted(k for k,v in iteritems(self.shell.user_ns) if\
1255 1263 isinstance(v, Macro))
1256 1264 if len(args) == 1:
1257 1265 raise UsageError(
1258 1266 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1259 1267 name, codefrom = args[0], " ".join(args[1:])
1260 1268
1261 1269 #print 'rng',ranges # dbg
1262 1270 try:
1263 1271 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1264 1272 except (ValueError, TypeError) as e:
1265 1273 print(e.args[0])
1266 1274 return
1267 1275 macro = Macro(lines)
1268 1276 self.shell.define_macro(name, macro)
1269 1277 if not ( 'q' in opts) :
1270 1278 print('Macro `%s` created. To execute, type its name (without quotes).' % name)
1271 1279 print('=== Macro contents: ===')
1272 1280 print(macro, end=' ')
1273 1281
1274 1282 @magic_arguments.magic_arguments()
1275 1283 @magic_arguments.argument('output', type=str, default='', nargs='?',
1276 1284 help="""The name of the variable in which to store output.
1277 1285 This is a utils.io.CapturedIO object with stdout/err attributes
1278 1286 for the text of the captured output.
1279 1287
1280 1288 CapturedOutput also has a show() method for displaying the output,
1281 1289 and __call__ as well, so you can use that to quickly display the
1282 1290 output.
1283 1291
1284 1292 If unspecified, captured output is discarded.
1285 1293 """
1286 1294 )
1287 1295 @magic_arguments.argument('--no-stderr', action="store_true",
1288 1296 help="""Don't capture stderr."""
1289 1297 )
1290 1298 @magic_arguments.argument('--no-stdout', action="store_true",
1291 1299 help="""Don't capture stdout."""
1292 1300 )
1293 1301 @magic_arguments.argument('--no-display', action="store_true",
1294 1302 help="""Don't capture IPython's rich display."""
1295 1303 )
1296 1304 @cell_magic
1297 1305 def capture(self, line, cell):
1298 1306 """run the cell, capturing stdout, stderr, and IPython's rich display() calls."""
1299 1307 args = magic_arguments.parse_argstring(self.capture, line)
1300 1308 out = not args.no_stdout
1301 1309 err = not args.no_stderr
1302 1310 disp = not args.no_display
1303 1311 with capture_output(out, err, disp) as io:
1304 1312 self.shell.run_cell(cell)
1305 1313 if args.output:
1306 1314 self.shell.user_ns[args.output] = io
1307 1315
1308 1316 def parse_breakpoint(text, current_file):
1309 1317 '''Returns (file, line) for file:line and (current_file, line) for line'''
1310 1318 colon = text.find(':')
1311 1319 if colon == -1:
1312 1320 return current_file, int(text)
1313 1321 else:
1314 1322 return text[:colon], int(text[colon+1:])
1315 1323
1316 1324 def _format_time(timespan, precision=3):
1317 1325 """Formats the timespan in a human readable form"""
1318 1326 import math
1319 1327
1320 1328 if timespan >= 60.0:
1321 1329 # we have more than a minute, format that in a human readable form
1322 1330 # Idea from http://snipplr.com/view/5713/
1323 1331 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1324 1332 time = []
1325 1333 leftover = timespan
1326 1334 for suffix, length in parts:
1327 1335 value = int(leftover / length)
1328 1336 if value > 0:
1329 1337 leftover = leftover % length
1330 1338 time.append(u'%s%s' % (str(value), suffix))
1331 1339 if leftover < 1:
1332 1340 break
1333 1341 return " ".join(time)
1334 1342
1335 1343
1336 1344 # Unfortunately the unicode 'micro' symbol can cause problems in
1337 1345 # certain terminals.
1338 1346 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1339 1347 # Try to prevent crashes by being more secure than it needs to
1340 1348 # E.g. eclipse is able to print a µ, but has no sys.stdout.encoding set.
1341 1349 units = [u"s", u"ms",u'us',"ns"] # the save value
1342 1350 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1343 1351 try:
1344 1352 u'\xb5'.encode(sys.stdout.encoding)
1345 1353 units = [u"s", u"ms",u'\xb5s',"ns"]
1346 1354 except:
1347 1355 pass
1348 1356 scaling = [1, 1e3, 1e6, 1e9]
1349 1357
1350 1358 if timespan > 0.0:
1351 1359 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1352 1360 else:
1353 1361 order = 3
1354 1362 return u"%.*g %s" % (precision, timespan * scaling[order], units[order])
General Comments 0
You need to be logged in to leave comments. Login now