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