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