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