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