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