##// END OF EJS Templates
Terminology: output is silenced, not disabled.
nfgf -
Show More

The requested changes are too big and content was truncated. Show full diff

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