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