##// END OF EJS Templates
Restore trace function after exiting debugger....
Matthias Bussonnier -
Show More
@@ -1,1499 +1,1502 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 else:
470 else:
471 code = "\n".join(args.statement)
471 code = "\n".join(args.statement)
472 if cell:
472 if cell:
473 code += "\n" + cell
473 code += "\n" + cell
474 self._debug_exec(code, args.breakpoint)
474 self._debug_exec(code, args.breakpoint)
475
475
476 def _debug_post_mortem(self):
476 def _debug_post_mortem(self):
477 self.shell.debugger(force=True)
477 self.shell.debugger(force=True)
478
478
479 def _debug_exec(self, code, breakpoint):
479 def _debug_exec(self, code, breakpoint):
480 if breakpoint:
480 if breakpoint:
481 (filename, bp_line) = breakpoint.rsplit(':', 1)
481 (filename, bp_line) = breakpoint.rsplit(':', 1)
482 bp_line = int(bp_line)
482 bp_line = int(bp_line)
483 else:
483 else:
484 (filename, bp_line) = (None, None)
484 (filename, bp_line) = (None, None)
485 self._run_with_debugger(code, self.shell.user_ns, filename, bp_line)
485 self._run_with_debugger(code, self.shell.user_ns, filename, bp_line)
486
486
487 @line_magic
487 @line_magic
488 def tb(self, s):
488 def tb(self, s):
489 """Print the last traceback.
489 """Print the last traceback.
490
490
491 Optionally, specify an exception reporting mode, tuning the
491 Optionally, specify an exception reporting mode, tuning the
492 verbosity of the traceback. By default the currently-active exception
492 verbosity of the traceback. By default the currently-active exception
493 mode is used. See %xmode for changing exception reporting modes.
493 mode is used. See %xmode for changing exception reporting modes.
494
494
495 Valid modes: Plain, Context, Verbose, and Minimal.
495 Valid modes: Plain, Context, Verbose, and Minimal.
496 """
496 """
497 interactive_tb = self.shell.InteractiveTB
497 interactive_tb = self.shell.InteractiveTB
498 if s:
498 if s:
499 # Switch exception reporting mode for this one call.
499 # Switch exception reporting mode for this one call.
500 # Ensure it is switched back.
500 # Ensure it is switched back.
501 def xmode_switch_err(name):
501 def xmode_switch_err(name):
502 warn('Error changing %s exception modes.\n%s' %
502 warn('Error changing %s exception modes.\n%s' %
503 (name,sys.exc_info()[1]))
503 (name,sys.exc_info()[1]))
504
504
505 new_mode = s.strip().capitalize()
505 new_mode = s.strip().capitalize()
506 original_mode = interactive_tb.mode
506 original_mode = interactive_tb.mode
507 try:
507 try:
508 try:
508 try:
509 interactive_tb.set_mode(mode=new_mode)
509 interactive_tb.set_mode(mode=new_mode)
510 except Exception:
510 except Exception:
511 xmode_switch_err('user')
511 xmode_switch_err('user')
512 else:
512 else:
513 self.shell.showtraceback()
513 self.shell.showtraceback()
514 finally:
514 finally:
515 interactive_tb.set_mode(mode=original_mode)
515 interactive_tb.set_mode(mode=original_mode)
516 else:
516 else:
517 self.shell.showtraceback()
517 self.shell.showtraceback()
518
518
519 @skip_doctest
519 @skip_doctest
520 @line_magic
520 @line_magic
521 def run(self, parameter_s='', runner=None,
521 def run(self, parameter_s='', runner=None,
522 file_finder=get_py_filename):
522 file_finder=get_py_filename):
523 """Run the named file inside IPython as a program.
523 """Run the named file inside IPython as a program.
524
524
525 Usage::
525 Usage::
526
526
527 %run [-n -i -e -G]
527 %run [-n -i -e -G]
528 [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )]
528 [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )]
529 ( -m mod | file ) [args]
529 ( -m mod | file ) [args]
530
530
531 Parameters after the filename are passed as command-line arguments to
531 Parameters after the filename are passed as command-line arguments to
532 the program (put in sys.argv). Then, control returns to IPython's
532 the program (put in sys.argv). Then, control returns to IPython's
533 prompt.
533 prompt.
534
534
535 This is similar to running at a system prompt ``python file args``,
535 This is similar to running at a system prompt ``python file args``,
536 but with the advantage of giving you IPython's tracebacks, and of
536 but with the advantage of giving you IPython's tracebacks, and of
537 loading all variables into your interactive namespace for further use
537 loading all variables into your interactive namespace for further use
538 (unless -p is used, see below).
538 (unless -p is used, see below).
539
539
540 The file is executed in a namespace initially consisting only of
540 The file is executed in a namespace initially consisting only of
541 ``__name__=='__main__'`` and sys.argv constructed as indicated. It thus
541 ``__name__=='__main__'`` and sys.argv constructed as indicated. It thus
542 sees its environment as if it were being run as a stand-alone program
542 sees its environment as if it were being run as a stand-alone program
543 (except for sharing global objects such as previously imported
543 (except for sharing global objects such as previously imported
544 modules). But after execution, the IPython interactive namespace gets
544 modules). But after execution, the IPython interactive namespace gets
545 updated with all variables defined in the program (except for __name__
545 updated with all variables defined in the program (except for __name__
546 and sys.argv). This allows for very convenient loading of code for
546 and sys.argv). This allows for very convenient loading of code for
547 interactive work, while giving each program a 'clean sheet' to run in.
547 interactive work, while giving each program a 'clean sheet' to run in.
548
548
549 Arguments are expanded using shell-like glob match. Patterns
549 Arguments are expanded using shell-like glob match. Patterns
550 '*', '?', '[seq]' and '[!seq]' can be used. Additionally,
550 '*', '?', '[seq]' and '[!seq]' can be used. Additionally,
551 tilde '~' will be expanded into user's home directory. Unlike
551 tilde '~' will be expanded into user's home directory. Unlike
552 real shells, quotation does not suppress expansions. Use
552 real shells, quotation does not suppress expansions. Use
553 *two* back slashes (e.g. ``\\\\*``) to suppress expansions.
553 *two* back slashes (e.g. ``\\\\*``) to suppress expansions.
554 To completely disable these expansions, you can use -G flag.
554 To completely disable these expansions, you can use -G flag.
555
555
556 On Windows systems, the use of single quotes `'` when specifying
556 On Windows systems, the use of single quotes `'` when specifying
557 a file is not supported. Use double quotes `"`.
557 a file is not supported. Use double quotes `"`.
558
558
559 Options:
559 Options:
560
560
561 -n
561 -n
562 __name__ is NOT set to '__main__', but to the running file's name
562 __name__ is NOT set to '__main__', but to the running file's name
563 without extension (as python does under import). This allows running
563 without extension (as python does under import). This allows running
564 scripts and reloading the definitions in them without calling code
564 scripts and reloading the definitions in them without calling code
565 protected by an ``if __name__ == "__main__"`` clause.
565 protected by an ``if __name__ == "__main__"`` clause.
566
566
567 -i
567 -i
568 run the file in IPython's namespace instead of an empty one. This
568 run the file in IPython's namespace instead of an empty one. This
569 is useful if you are experimenting with code written in a text editor
569 is useful if you are experimenting with code written in a text editor
570 which depends on variables defined interactively.
570 which depends on variables defined interactively.
571
571
572 -e
572 -e
573 ignore sys.exit() calls or SystemExit exceptions in the script
573 ignore sys.exit() calls or SystemExit exceptions in the script
574 being run. This is particularly useful if IPython is being used to
574 being run. This is particularly useful if IPython is being used to
575 run unittests, which always exit with a sys.exit() call. In such
575 run unittests, which always exit with a sys.exit() call. In such
576 cases you are interested in the output of the test results, not in
576 cases you are interested in the output of the test results, not in
577 seeing a traceback of the unittest module.
577 seeing a traceback of the unittest module.
578
578
579 -t
579 -t
580 print timing information at the end of the run. IPython will give
580 print timing information at the end of the run. IPython will give
581 you an estimated CPU time consumption for your script, which under
581 you an estimated CPU time consumption for your script, which under
582 Unix uses the resource module to avoid the wraparound problems of
582 Unix uses the resource module to avoid the wraparound problems of
583 time.clock(). Under Unix, an estimate of time spent on system tasks
583 time.clock(). Under Unix, an estimate of time spent on system tasks
584 is also given (for Windows platforms this is reported as 0.0).
584 is also given (for Windows platforms this is reported as 0.0).
585
585
586 If -t is given, an additional ``-N<N>`` option can be given, where <N>
586 If -t is given, an additional ``-N<N>`` option can be given, where <N>
587 must be an integer indicating how many times you want the script to
587 must be an integer indicating how many times you want the script to
588 run. The final timing report will include total and per run results.
588 run. The final timing report will include total and per run results.
589
589
590 For example (testing the script uniq_stable.py)::
590 For example (testing the script uniq_stable.py)::
591
591
592 In [1]: run -t uniq_stable
592 In [1]: run -t uniq_stable
593
593
594 IPython CPU timings (estimated):
594 IPython CPU timings (estimated):
595 User : 0.19597 s.
595 User : 0.19597 s.
596 System: 0.0 s.
596 System: 0.0 s.
597
597
598 In [2]: run -t -N5 uniq_stable
598 In [2]: run -t -N5 uniq_stable
599
599
600 IPython CPU timings (estimated):
600 IPython CPU timings (estimated):
601 Total runs performed: 5
601 Total runs performed: 5
602 Times : Total Per run
602 Times : Total Per run
603 User : 0.910862 s, 0.1821724 s.
603 User : 0.910862 s, 0.1821724 s.
604 System: 0.0 s, 0.0 s.
604 System: 0.0 s, 0.0 s.
605
605
606 -d
606 -d
607 run your program under the control of pdb, the Python debugger.
607 run your program under the control of pdb, the Python debugger.
608 This allows you to execute your program step by step, watch variables,
608 This allows you to execute your program step by step, watch variables,
609 etc. Internally, what IPython does is similar to calling::
609 etc. Internally, what IPython does is similar to calling::
610
610
611 pdb.run('execfile("YOURFILENAME")')
611 pdb.run('execfile("YOURFILENAME")')
612
612
613 with a breakpoint set on line 1 of your file. You can change the line
613 with a breakpoint set on line 1 of your file. You can change the line
614 number for this automatic breakpoint to be <N> by using the -bN option
614 number for this automatic breakpoint to be <N> by using the -bN option
615 (where N must be an integer). For example::
615 (where N must be an integer). For example::
616
616
617 %run -d -b40 myscript
617 %run -d -b40 myscript
618
618
619 will set the first breakpoint at line 40 in myscript.py. Note that
619 will set the first breakpoint at line 40 in myscript.py. Note that
620 the first breakpoint must be set on a line which actually does
620 the first breakpoint must be set on a line which actually does
621 something (not a comment or docstring) for it to stop execution.
621 something (not a comment or docstring) for it to stop execution.
622
622
623 Or you can specify a breakpoint in a different file::
623 Or you can specify a breakpoint in a different file::
624
624
625 %run -d -b myotherfile.py:20 myscript
625 %run -d -b myotherfile.py:20 myscript
626
626
627 When the pdb debugger starts, you will see a (Pdb) prompt. You must
627 When the pdb debugger starts, you will see a (Pdb) prompt. You must
628 first enter 'c' (without quotes) to start execution up to the first
628 first enter 'c' (without quotes) to start execution up to the first
629 breakpoint.
629 breakpoint.
630
630
631 Entering 'help' gives information about the use of the debugger. You
631 Entering 'help' gives information about the use of the debugger. You
632 can easily see pdb's full documentation with "import pdb;pdb.help()"
632 can easily see pdb's full documentation with "import pdb;pdb.help()"
633 at a prompt.
633 at a prompt.
634
634
635 -p
635 -p
636 run program under the control of the Python profiler module (which
636 run program under the control of the Python profiler module (which
637 prints a detailed report of execution times, function calls, etc).
637 prints a detailed report of execution times, function calls, etc).
638
638
639 You can pass other options after -p which affect the behavior of the
639 You can pass other options after -p which affect the behavior of the
640 profiler itself. See the docs for %prun for details.
640 profiler itself. See the docs for %prun for details.
641
641
642 In this mode, the program's variables do NOT propagate back to the
642 In this mode, the program's variables do NOT propagate back to the
643 IPython interactive namespace (because they remain in the namespace
643 IPython interactive namespace (because they remain in the namespace
644 where the profiler executes them).
644 where the profiler executes them).
645
645
646 Internally this triggers a call to %prun, see its documentation for
646 Internally this triggers a call to %prun, see its documentation for
647 details on the options available specifically for profiling.
647 details on the options available specifically for profiling.
648
648
649 There is one special usage for which the text above doesn't apply:
649 There is one special usage for which the text above doesn't apply:
650 if the filename ends with .ipy[nb], the file is run as ipython script,
650 if the filename ends with .ipy[nb], the file is run as ipython script,
651 just as if the commands were written on IPython prompt.
651 just as if the commands were written on IPython prompt.
652
652
653 -m
653 -m
654 specify module name to load instead of script path. Similar to
654 specify module name to load instead of script path. Similar to
655 the -m option for the python interpreter. Use this option last if you
655 the -m option for the python interpreter. Use this option last if you
656 want to combine with other %run options. Unlike the python interpreter
656 want to combine with other %run options. Unlike the python interpreter
657 only source modules are allowed no .pyc or .pyo files.
657 only source modules are allowed no .pyc or .pyo files.
658 For example::
658 For example::
659
659
660 %run -m example
660 %run -m example
661
661
662 will run the example module.
662 will run the example module.
663
663
664 -G
664 -G
665 disable shell-like glob expansion of arguments.
665 disable shell-like glob expansion of arguments.
666
666
667 """
667 """
668
668
669 # Logic to handle issue #3664
669 # Logic to handle issue #3664
670 # Add '--' after '-m <module_name>' to ignore additional args passed to a module.
670 # Add '--' after '-m <module_name>' to ignore additional args passed to a module.
671 if '-m' in parameter_s and '--' not in parameter_s:
671 if '-m' in parameter_s and '--' not in parameter_s:
672 argv = shlex.split(parameter_s, posix=(os.name == 'posix'))
672 argv = shlex.split(parameter_s, posix=(os.name == 'posix'))
673 for idx, arg in enumerate(argv):
673 for idx, arg in enumerate(argv):
674 if arg and arg.startswith('-') and arg != '-':
674 if arg and arg.startswith('-') and arg != '-':
675 if arg == '-m':
675 if arg == '-m':
676 argv.insert(idx + 2, '--')
676 argv.insert(idx + 2, '--')
677 break
677 break
678 else:
678 else:
679 # Positional arg, break
679 # Positional arg, break
680 break
680 break
681 parameter_s = ' '.join(shlex.quote(arg) for arg in argv)
681 parameter_s = ' '.join(shlex.quote(arg) for arg in argv)
682
682
683 # get arguments and set sys.argv for program to be run.
683 # get arguments and set sys.argv for program to be run.
684 opts, arg_lst = self.parse_options(parameter_s,
684 opts, arg_lst = self.parse_options(parameter_s,
685 'nidtN:b:pD:l:rs:T:em:G',
685 'nidtN:b:pD:l:rs:T:em:G',
686 mode='list', list_all=1)
686 mode='list', list_all=1)
687 if "m" in opts:
687 if "m" in opts:
688 modulename = opts["m"][0]
688 modulename = opts["m"][0]
689 modpath = find_mod(modulename)
689 modpath = find_mod(modulename)
690 if modpath is None:
690 if modpath is None:
691 warn('%r is not a valid modulename on sys.path'%modulename)
691 warn('%r is not a valid modulename on sys.path'%modulename)
692 return
692 return
693 arg_lst = [modpath] + arg_lst
693 arg_lst = [modpath] + arg_lst
694 try:
694 try:
695 fpath = None # initialize to make sure fpath is in scope later
695 fpath = None # initialize to make sure fpath is in scope later
696 fpath = arg_lst[0]
696 fpath = arg_lst[0]
697 filename = file_finder(fpath)
697 filename = file_finder(fpath)
698 except IndexError:
698 except IndexError:
699 warn('you must provide at least a filename.')
699 warn('you must provide at least a filename.')
700 print('\n%run:\n', oinspect.getdoc(self.run))
700 print('\n%run:\n', oinspect.getdoc(self.run))
701 return
701 return
702 except IOError as e:
702 except IOError as e:
703 try:
703 try:
704 msg = str(e)
704 msg = str(e)
705 except UnicodeError:
705 except UnicodeError:
706 msg = e.message
706 msg = e.message
707 if os.name == 'nt' and re.match(r"^'.*'$",fpath):
707 if os.name == 'nt' and re.match(r"^'.*'$",fpath):
708 warn('For Windows, use double quotes to wrap a filename: %run "mypath\\myfile.py"')
708 warn('For Windows, use double quotes to wrap a filename: %run "mypath\\myfile.py"')
709 error(msg)
709 error(msg)
710 return
710 return
711
711
712 if filename.lower().endswith(('.ipy', '.ipynb')):
712 if filename.lower().endswith(('.ipy', '.ipynb')):
713 with preserve_keys(self.shell.user_ns, '__file__'):
713 with preserve_keys(self.shell.user_ns, '__file__'):
714 self.shell.user_ns['__file__'] = filename
714 self.shell.user_ns['__file__'] = filename
715 self.shell.safe_execfile_ipy(filename)
715 self.shell.safe_execfile_ipy(filename)
716 return
716 return
717
717
718 # Control the response to exit() calls made by the script being run
718 # Control the response to exit() calls made by the script being run
719 exit_ignore = 'e' in opts
719 exit_ignore = 'e' in opts
720
720
721 # Make sure that the running script gets a proper sys.argv as if it
721 # Make sure that the running script gets a proper sys.argv as if it
722 # were run from a system shell.
722 # were run from a system shell.
723 save_argv = sys.argv # save it for later restoring
723 save_argv = sys.argv # save it for later restoring
724
724
725 if 'G' in opts:
725 if 'G' in opts:
726 args = arg_lst[1:]
726 args = arg_lst[1:]
727 else:
727 else:
728 # tilde and glob expansion
728 # tilde and glob expansion
729 args = shellglob(map(os.path.expanduser, arg_lst[1:]))
729 args = shellglob(map(os.path.expanduser, arg_lst[1:]))
730
730
731 sys.argv = [filename] + args # put in the proper filename
731 sys.argv = [filename] + args # put in the proper filename
732
732
733 if 'n' in opts:
733 if 'n' in opts:
734 name = os.path.splitext(os.path.basename(filename))[0]
734 name = os.path.splitext(os.path.basename(filename))[0]
735 else:
735 else:
736 name = '__main__'
736 name = '__main__'
737
737
738 if 'i' in opts:
738 if 'i' in opts:
739 # Run in user's interactive namespace
739 # Run in user's interactive namespace
740 prog_ns = self.shell.user_ns
740 prog_ns = self.shell.user_ns
741 __name__save = self.shell.user_ns['__name__']
741 __name__save = self.shell.user_ns['__name__']
742 prog_ns['__name__'] = name
742 prog_ns['__name__'] = name
743 main_mod = self.shell.user_module
743 main_mod = self.shell.user_module
744
744
745 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
745 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
746 # set the __file__ global in the script's namespace
746 # set the __file__ global in the script's namespace
747 # TK: Is this necessary in interactive mode?
747 # TK: Is this necessary in interactive mode?
748 prog_ns['__file__'] = filename
748 prog_ns['__file__'] = filename
749 else:
749 else:
750 # Run in a fresh, empty namespace
750 # Run in a fresh, empty namespace
751
751
752 # The shell MUST hold a reference to prog_ns so after %run
752 # The shell MUST hold a reference to prog_ns so after %run
753 # exits, the python deletion mechanism doesn't zero it out
753 # exits, the python deletion mechanism doesn't zero it out
754 # (leaving dangling references). See interactiveshell for details
754 # (leaving dangling references). See interactiveshell for details
755 main_mod = self.shell.new_main_mod(filename, name)
755 main_mod = self.shell.new_main_mod(filename, name)
756 prog_ns = main_mod.__dict__
756 prog_ns = main_mod.__dict__
757
757
758 # pickle fix. See interactiveshell for an explanation. But we need to
758 # pickle fix. See interactiveshell for an explanation. But we need to
759 # make sure that, if we overwrite __main__, we replace it at the end
759 # make sure that, if we overwrite __main__, we replace it at the end
760 main_mod_name = prog_ns['__name__']
760 main_mod_name = prog_ns['__name__']
761
761
762 if main_mod_name == '__main__':
762 if main_mod_name == '__main__':
763 restore_main = sys.modules['__main__']
763 restore_main = sys.modules['__main__']
764 else:
764 else:
765 restore_main = False
765 restore_main = False
766
766
767 # This needs to be undone at the end to prevent holding references to
767 # This needs to be undone at the end to prevent holding references to
768 # every single object ever created.
768 # every single object ever created.
769 sys.modules[main_mod_name] = main_mod
769 sys.modules[main_mod_name] = main_mod
770
770
771 if 'p' in opts or 'd' in opts:
771 if 'p' in opts or 'd' in opts:
772 if 'm' in opts:
772 if 'm' in opts:
773 code = 'run_module(modulename, prog_ns)'
773 code = 'run_module(modulename, prog_ns)'
774 code_ns = {
774 code_ns = {
775 'run_module': self.shell.safe_run_module,
775 'run_module': self.shell.safe_run_module,
776 'prog_ns': prog_ns,
776 'prog_ns': prog_ns,
777 'modulename': modulename,
777 'modulename': modulename,
778 }
778 }
779 else:
779 else:
780 if 'd' in opts:
780 if 'd' in opts:
781 # allow exceptions to raise in debug mode
781 # allow exceptions to raise in debug mode
782 code = 'execfile(filename, prog_ns, raise_exceptions=True)'
782 code = 'execfile(filename, prog_ns, raise_exceptions=True)'
783 else:
783 else:
784 code = 'execfile(filename, prog_ns)'
784 code = 'execfile(filename, prog_ns)'
785 code_ns = {
785 code_ns = {
786 'execfile': self.shell.safe_execfile,
786 'execfile': self.shell.safe_execfile,
787 'prog_ns': prog_ns,
787 'prog_ns': prog_ns,
788 'filename': get_py_filename(filename),
788 'filename': get_py_filename(filename),
789 }
789 }
790
790
791 try:
791 try:
792 stats = None
792 stats = None
793 if 'p' in opts:
793 if 'p' in opts:
794 stats = self._run_with_profiler(code, opts, code_ns)
794 stats = self._run_with_profiler(code, opts, code_ns)
795 else:
795 else:
796 if 'd' in opts:
796 if 'd' in opts:
797 bp_file, bp_line = parse_breakpoint(
797 bp_file, bp_line = parse_breakpoint(
798 opts.get('b', ['1'])[0], filename)
798 opts.get('b', ['1'])[0], filename)
799 self._run_with_debugger(
799 self._run_with_debugger(
800 code, code_ns, filename, bp_line, bp_file)
800 code, code_ns, filename, bp_line, bp_file)
801 else:
801 else:
802 if 'm' in opts:
802 if 'm' in opts:
803 def run():
803 def run():
804 self.shell.safe_run_module(modulename, prog_ns)
804 self.shell.safe_run_module(modulename, prog_ns)
805 else:
805 else:
806 if runner is None:
806 if runner is None:
807 runner = self.default_runner
807 runner = self.default_runner
808 if runner is None:
808 if runner is None:
809 runner = self.shell.safe_execfile
809 runner = self.shell.safe_execfile
810
810
811 def run():
811 def run():
812 runner(filename, prog_ns, prog_ns,
812 runner(filename, prog_ns, prog_ns,
813 exit_ignore=exit_ignore)
813 exit_ignore=exit_ignore)
814
814
815 if 't' in opts:
815 if 't' in opts:
816 # timed execution
816 # timed execution
817 try:
817 try:
818 nruns = int(opts['N'][0])
818 nruns = int(opts['N'][0])
819 if nruns < 1:
819 if nruns < 1:
820 error('Number of runs must be >=1')
820 error('Number of runs must be >=1')
821 return
821 return
822 except (KeyError):
822 except (KeyError):
823 nruns = 1
823 nruns = 1
824 self._run_with_timing(run, nruns)
824 self._run_with_timing(run, nruns)
825 else:
825 else:
826 # regular execution
826 # regular execution
827 run()
827 run()
828
828
829 if 'i' in opts:
829 if 'i' in opts:
830 self.shell.user_ns['__name__'] = __name__save
830 self.shell.user_ns['__name__'] = __name__save
831 else:
831 else:
832 # update IPython interactive namespace
832 # update IPython interactive namespace
833
833
834 # Some forms of read errors on the file may mean the
834 # Some forms of read errors on the file may mean the
835 # __name__ key was never set; using pop we don't have to
835 # __name__ key was never set; using pop we don't have to
836 # worry about a possible KeyError.
836 # worry about a possible KeyError.
837 prog_ns.pop('__name__', None)
837 prog_ns.pop('__name__', None)
838
838
839 with preserve_keys(self.shell.user_ns, '__file__'):
839 with preserve_keys(self.shell.user_ns, '__file__'):
840 self.shell.user_ns.update(prog_ns)
840 self.shell.user_ns.update(prog_ns)
841 finally:
841 finally:
842 # It's a bit of a mystery why, but __builtins__ can change from
842 # It's a bit of a mystery why, but __builtins__ can change from
843 # being a module to becoming a dict missing some key data after
843 # being a module to becoming a dict missing some key data after
844 # %run. As best I can see, this is NOT something IPython is doing
844 # %run. As best I can see, this is NOT something IPython is doing
845 # at all, and similar problems have been reported before:
845 # at all, and similar problems have been reported before:
846 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
846 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
847 # Since this seems to be done by the interpreter itself, the best
847 # Since this seems to be done by the interpreter itself, the best
848 # we can do is to at least restore __builtins__ for the user on
848 # we can do is to at least restore __builtins__ for the user on
849 # exit.
849 # exit.
850 self.shell.user_ns['__builtins__'] = builtin_mod
850 self.shell.user_ns['__builtins__'] = builtin_mod
851
851
852 # Ensure key global structures are restored
852 # Ensure key global structures are restored
853 sys.argv = save_argv
853 sys.argv = save_argv
854 if restore_main:
854 if restore_main:
855 sys.modules['__main__'] = restore_main
855 sys.modules['__main__'] = restore_main
856 else:
856 else:
857 # Remove from sys.modules the reference to main_mod we'd
857 # Remove from sys.modules the reference to main_mod we'd
858 # added. Otherwise it will trap references to objects
858 # added. Otherwise it will trap references to objects
859 # contained therein.
859 # contained therein.
860 del sys.modules[main_mod_name]
860 del sys.modules[main_mod_name]
861
861
862 return stats
862 return stats
863
863
864 def _run_with_debugger(self, code, code_ns, filename=None,
864 def _run_with_debugger(self, code, code_ns, filename=None,
865 bp_line=None, bp_file=None):
865 bp_line=None, bp_file=None):
866 """
866 """
867 Run `code` in debugger with a break point.
867 Run `code` in debugger with a break point.
868
868
869 Parameters
869 Parameters
870 ----------
870 ----------
871 code : str
871 code : str
872 Code to execute.
872 Code to execute.
873 code_ns : dict
873 code_ns : dict
874 A namespace in which `code` is executed.
874 A namespace in which `code` is executed.
875 filename : str
875 filename : str
876 `code` is ran as if it is in `filename`.
876 `code` is ran as if it is in `filename`.
877 bp_line : int, optional
877 bp_line : int, optional
878 Line number of the break point.
878 Line number of the break point.
879 bp_file : str, optional
879 bp_file : str, optional
880 Path to the file in which break point is specified.
880 Path to the file in which break point is specified.
881 `filename` is used if not given.
881 `filename` is used if not given.
882
882
883 Raises
883 Raises
884 ------
884 ------
885 UsageError
885 UsageError
886 If the break point given by `bp_line` is not valid.
886 If the break point given by `bp_line` is not valid.
887
887
888 """
888 """
889 deb = self.shell.InteractiveTB.pdb
889 deb = self.shell.InteractiveTB.pdb
890 if not deb:
890 if not deb:
891 self.shell.InteractiveTB.pdb = self.shell.InteractiveTB.debugger_cls()
891 self.shell.InteractiveTB.pdb = self.shell.InteractiveTB.debugger_cls()
892 deb = self.shell.InteractiveTB.pdb
892 deb = self.shell.InteractiveTB.pdb
893
893
894 # deb.checkline() fails if deb.curframe exists but is None; it can
894 # deb.checkline() fails if deb.curframe exists but is None; it can
895 # handle it not existing. https://github.com/ipython/ipython/issues/10028
895 # handle it not existing. https://github.com/ipython/ipython/issues/10028
896 if hasattr(deb, 'curframe'):
896 if hasattr(deb, 'curframe'):
897 del deb.curframe
897 del deb.curframe
898
898
899 # reset Breakpoint state, which is moronically kept
899 # reset Breakpoint state, which is moronically kept
900 # in a class
900 # in a class
901 bdb.Breakpoint.next = 1
901 bdb.Breakpoint.next = 1
902 bdb.Breakpoint.bplist = {}
902 bdb.Breakpoint.bplist = {}
903 bdb.Breakpoint.bpbynumber = [None]
903 bdb.Breakpoint.bpbynumber = [None]
904 deb.clear_all_breaks()
904 deb.clear_all_breaks()
905 if bp_line is not None:
905 if bp_line is not None:
906 # Set an initial breakpoint to stop execution
906 # Set an initial breakpoint to stop execution
907 maxtries = 10
907 maxtries = 10
908 bp_file = bp_file or filename
908 bp_file = bp_file or filename
909 checkline = deb.checkline(bp_file, bp_line)
909 checkline = deb.checkline(bp_file, bp_line)
910 if not checkline:
910 if not checkline:
911 for bp in range(bp_line + 1, bp_line + maxtries + 1):
911 for bp in range(bp_line + 1, bp_line + maxtries + 1):
912 if deb.checkline(bp_file, bp):
912 if deb.checkline(bp_file, bp):
913 break
913 break
914 else:
914 else:
915 msg = ("\nI failed to find a valid line to set "
915 msg = ("\nI failed to find a valid line to set "
916 "a breakpoint\n"
916 "a breakpoint\n"
917 "after trying up to line: %s.\n"
917 "after trying up to line: %s.\n"
918 "Please set a valid breakpoint manually "
918 "Please set a valid breakpoint manually "
919 "with the -b option." % bp)
919 "with the -b option." % bp)
920 raise UsageError(msg)
920 raise UsageError(msg)
921 # if we find a good linenumber, set the breakpoint
921 # if we find a good linenumber, set the breakpoint
922 deb.do_break('%s:%s' % (bp_file, bp_line))
922 deb.do_break('%s:%s' % (bp_file, bp_line))
923
923
924 if filename:
924 if filename:
925 # Mimic Pdb._runscript(...)
925 # Mimic Pdb._runscript(...)
926 deb._wait_for_mainpyfile = True
926 deb._wait_for_mainpyfile = True
927 deb.mainpyfile = deb.canonic(filename)
927 deb.mainpyfile = deb.canonic(filename)
928
928
929 # Start file run
929 # Start file run
930 print("NOTE: Enter 'c' at the %s prompt to continue execution." % deb.prompt)
930 print("NOTE: Enter 'c' at the %s prompt to continue execution." % deb.prompt)
931 try:
931 try:
932 if filename:
932 if filename:
933 # save filename so it can be used by methods on the deb object
933 # save filename so it can be used by methods on the deb object
934 deb._exec_filename = filename
934 deb._exec_filename = filename
935 while True:
935 while True:
936 try:
936 try:
937 trace = sys.gettrace()
937 deb.run(code, code_ns)
938 deb.run(code, code_ns)
938 except Restart:
939 except Restart:
939 print("Restarting")
940 print("Restarting")
940 if filename:
941 if filename:
941 deb._wait_for_mainpyfile = True
942 deb._wait_for_mainpyfile = True
942 deb.mainpyfile = deb.canonic(filename)
943 deb.mainpyfile = deb.canonic(filename)
943 continue
944 continue
944 else:
945 else:
945 break
946 break
947 finally:
948 sys.settrace(trace)
946
949
947
950
948 except:
951 except:
949 etype, value, tb = sys.exc_info()
952 etype, value, tb = sys.exc_info()
950 # Skip three frames in the traceback: the %run one,
953 # Skip three frames in the traceback: the %run one,
951 # one inside bdb.py, and the command-line typed by the
954 # one inside bdb.py, and the command-line typed by the
952 # user (run by exec in pdb itself).
955 # user (run by exec in pdb itself).
953 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
956 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
954
957
955 @staticmethod
958 @staticmethod
956 def _run_with_timing(run, nruns):
959 def _run_with_timing(run, nruns):
957 """
960 """
958 Run function `run` and print timing information.
961 Run function `run` and print timing information.
959
962
960 Parameters
963 Parameters
961 ----------
964 ----------
962 run : callable
965 run : callable
963 Any callable object which takes no argument.
966 Any callable object which takes no argument.
964 nruns : int
967 nruns : int
965 Number of times to execute `run`.
968 Number of times to execute `run`.
966
969
967 """
970 """
968 twall0 = time.perf_counter()
971 twall0 = time.perf_counter()
969 if nruns == 1:
972 if nruns == 1:
970 t0 = clock2()
973 t0 = clock2()
971 run()
974 run()
972 t1 = clock2()
975 t1 = clock2()
973 t_usr = t1[0] - t0[0]
976 t_usr = t1[0] - t0[0]
974 t_sys = t1[1] - t0[1]
977 t_sys = t1[1] - t0[1]
975 print("\nIPython CPU timings (estimated):")
978 print("\nIPython CPU timings (estimated):")
976 print(" User : %10.2f s." % t_usr)
979 print(" User : %10.2f s." % t_usr)
977 print(" System : %10.2f s." % t_sys)
980 print(" System : %10.2f s." % t_sys)
978 else:
981 else:
979 runs = range(nruns)
982 runs = range(nruns)
980 t0 = clock2()
983 t0 = clock2()
981 for nr in runs:
984 for nr in runs:
982 run()
985 run()
983 t1 = clock2()
986 t1 = clock2()
984 t_usr = t1[0] - t0[0]
987 t_usr = t1[0] - t0[0]
985 t_sys = t1[1] - t0[1]
988 t_sys = t1[1] - t0[1]
986 print("\nIPython CPU timings (estimated):")
989 print("\nIPython CPU timings (estimated):")
987 print("Total runs performed:", nruns)
990 print("Total runs performed:", nruns)
988 print(" Times : %10s %10s" % ('Total', 'Per run'))
991 print(" Times : %10s %10s" % ('Total', 'Per run'))
989 print(" User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns))
992 print(" User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns))
990 print(" System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns))
993 print(" System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns))
991 twall1 = time.perf_counter()
994 twall1 = time.perf_counter()
992 print("Wall time: %10.2f s." % (twall1 - twall0))
995 print("Wall time: %10.2f s." % (twall1 - twall0))
993
996
994 @skip_doctest
997 @skip_doctest
995 @no_var_expand
998 @no_var_expand
996 @line_cell_magic
999 @line_cell_magic
997 @needs_local_scope
1000 @needs_local_scope
998 def timeit(self, line='', cell=None, local_ns=None):
1001 def timeit(self, line='', cell=None, local_ns=None):
999 """Time execution of a Python statement or expression
1002 """Time execution of a Python statement or expression
1000
1003
1001 Usage, in line mode:
1004 Usage, in line mode:
1002 %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
1005 %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
1003 or in cell mode:
1006 or in cell mode:
1004 %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
1007 %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
1005 code
1008 code
1006 code...
1009 code...
1007
1010
1008 Time execution of a Python statement or expression using the timeit
1011 Time execution of a Python statement or expression using the timeit
1009 module. This function can be used both as a line and cell magic:
1012 module. This function can be used both as a line and cell magic:
1010
1013
1011 - In line mode you can time a single-line statement (though multiple
1014 - In line mode you can time a single-line statement (though multiple
1012 ones can be chained with using semicolons).
1015 ones can be chained with using semicolons).
1013
1016
1014 - In cell mode, the statement in the first line is used as setup code
1017 - In cell mode, the statement in the first line is used as setup code
1015 (executed but not timed) and the body of the cell is timed. The cell
1018 (executed but not timed) and the body of the cell is timed. The cell
1016 body has access to any variables created in the setup code.
1019 body has access to any variables created in the setup code.
1017
1020
1018 Options:
1021 Options:
1019 -n<N>: execute the given statement <N> times in a loop. If <N> is not
1022 -n<N>: execute the given statement <N> times in a loop. If <N> is not
1020 provided, <N> is determined so as to get sufficient accuracy.
1023 provided, <N> is determined so as to get sufficient accuracy.
1021
1024
1022 -r<R>: number of repeats <R>, each consisting of <N> loops, and take the
1025 -r<R>: number of repeats <R>, each consisting of <N> loops, and take the
1023 best result.
1026 best result.
1024 Default: 7
1027 Default: 7
1025
1028
1026 -t: use time.time to measure the time, which is the default on Unix.
1029 -t: use time.time to measure the time, which is the default on Unix.
1027 This function measures wall time.
1030 This function measures wall time.
1028
1031
1029 -c: use time.clock to measure the time, which is the default on
1032 -c: use time.clock to measure the time, which is the default on
1030 Windows and measures wall time. On Unix, resource.getrusage is used
1033 Windows and measures wall time. On Unix, resource.getrusage is used
1031 instead and returns the CPU user time.
1034 instead and returns the CPU user time.
1032
1035
1033 -p<P>: use a precision of <P> digits to display the timing result.
1036 -p<P>: use a precision of <P> digits to display the timing result.
1034 Default: 3
1037 Default: 3
1035
1038
1036 -q: Quiet, do not print result.
1039 -q: Quiet, do not print result.
1037
1040
1038 -o: return a TimeitResult that can be stored in a variable to inspect
1041 -o: return a TimeitResult that can be stored in a variable to inspect
1039 the result in more details.
1042 the result in more details.
1040
1043
1041 .. versionchanged:: 7.3
1044 .. versionchanged:: 7.3
1042 User variables are no longer expanded,
1045 User variables are no longer expanded,
1043 the magic line is always left unmodified.
1046 the magic line is always left unmodified.
1044
1047
1045 Examples
1048 Examples
1046 --------
1049 --------
1047 ::
1050 ::
1048
1051
1049 In [1]: %timeit pass
1052 In [1]: %timeit pass
1050 8.26 ns ± 0.12 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
1053 8.26 ns ± 0.12 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
1051
1054
1052 In [2]: u = None
1055 In [2]: u = None
1053
1056
1054 In [3]: %timeit u is None
1057 In [3]: %timeit u is None
1055 29.9 ns ± 0.643 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
1058 29.9 ns ± 0.643 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
1056
1059
1057 In [4]: %timeit -r 4 u == None
1060 In [4]: %timeit -r 4 u == None
1058
1061
1059 In [5]: import time
1062 In [5]: import time
1060
1063
1061 In [6]: %timeit -n1 time.sleep(2)
1064 In [6]: %timeit -n1 time.sleep(2)
1062
1065
1063
1066
1064 The times reported by %timeit will be slightly higher than those
1067 The times reported by %timeit will be slightly higher than those
1065 reported by the timeit.py script when variables are accessed. This is
1068 reported by the timeit.py script when variables are accessed. This is
1066 due to the fact that %timeit executes the statement in the namespace
1069 due to the fact that %timeit executes the statement in the namespace
1067 of the shell, compared with timeit.py, which uses a single setup
1070 of the shell, compared with timeit.py, which uses a single setup
1068 statement to import function or create variables. Generally, the bias
1071 statement to import function or create variables. Generally, the bias
1069 does not matter as long as results from timeit.py are not mixed with
1072 does not matter as long as results from timeit.py are not mixed with
1070 those from %timeit."""
1073 those from %timeit."""
1071
1074
1072 opts, stmt = self.parse_options(line,'n:r:tcp:qo',
1075 opts, stmt = self.parse_options(line,'n:r:tcp:qo',
1073 posix=False, strict=False)
1076 posix=False, strict=False)
1074 if stmt == "" and cell is None:
1077 if stmt == "" and cell is None:
1075 return
1078 return
1076
1079
1077 timefunc = timeit.default_timer
1080 timefunc = timeit.default_timer
1078 number = int(getattr(opts, "n", 0))
1081 number = int(getattr(opts, "n", 0))
1079 default_repeat = 7 if timeit.default_repeat < 7 else timeit.default_repeat
1082 default_repeat = 7 if timeit.default_repeat < 7 else timeit.default_repeat
1080 repeat = int(getattr(opts, "r", default_repeat))
1083 repeat = int(getattr(opts, "r", default_repeat))
1081 precision = int(getattr(opts, "p", 3))
1084 precision = int(getattr(opts, "p", 3))
1082 quiet = 'q' in opts
1085 quiet = 'q' in opts
1083 return_result = 'o' in opts
1086 return_result = 'o' in opts
1084 if hasattr(opts, "t"):
1087 if hasattr(opts, "t"):
1085 timefunc = time.time
1088 timefunc = time.time
1086 if hasattr(opts, "c"):
1089 if hasattr(opts, "c"):
1087 timefunc = clock
1090 timefunc = clock
1088
1091
1089 timer = Timer(timer=timefunc)
1092 timer = Timer(timer=timefunc)
1090 # this code has tight coupling to the inner workings of timeit.Timer,
1093 # this code has tight coupling to the inner workings of timeit.Timer,
1091 # but is there a better way to achieve that the code stmt has access
1094 # but is there a better way to achieve that the code stmt has access
1092 # to the shell namespace?
1095 # to the shell namespace?
1093 transform = self.shell.transform_cell
1096 transform = self.shell.transform_cell
1094
1097
1095 if cell is None:
1098 if cell is None:
1096 # called as line magic
1099 # called as line magic
1097 ast_setup = self.shell.compile.ast_parse("pass")
1100 ast_setup = self.shell.compile.ast_parse("pass")
1098 ast_stmt = self.shell.compile.ast_parse(transform(stmt))
1101 ast_stmt = self.shell.compile.ast_parse(transform(stmt))
1099 else:
1102 else:
1100 ast_setup = self.shell.compile.ast_parse(transform(stmt))
1103 ast_setup = self.shell.compile.ast_parse(transform(stmt))
1101 ast_stmt = self.shell.compile.ast_parse(transform(cell))
1104 ast_stmt = self.shell.compile.ast_parse(transform(cell))
1102
1105
1103 ast_setup = self.shell.transform_ast(ast_setup)
1106 ast_setup = self.shell.transform_ast(ast_setup)
1104 ast_stmt = self.shell.transform_ast(ast_stmt)
1107 ast_stmt = self.shell.transform_ast(ast_stmt)
1105
1108
1106 # Check that these compile to valid Python code *outside* the timer func
1109 # Check that these compile to valid Python code *outside* the timer func
1107 # Invalid code may become valid when put inside the function & loop,
1110 # Invalid code may become valid when put inside the function & loop,
1108 # which messes up error messages.
1111 # which messes up error messages.
1109 # https://github.com/ipython/ipython/issues/10636
1112 # https://github.com/ipython/ipython/issues/10636
1110 self.shell.compile(ast_setup, "<magic-timeit-setup>", "exec")
1113 self.shell.compile(ast_setup, "<magic-timeit-setup>", "exec")
1111 self.shell.compile(ast_stmt, "<magic-timeit-stmt>", "exec")
1114 self.shell.compile(ast_stmt, "<magic-timeit-stmt>", "exec")
1112
1115
1113 # This codestring is taken from timeit.template - we fill it in as an
1116 # This codestring is taken from timeit.template - we fill it in as an
1114 # AST, so that we can apply our AST transformations to the user code
1117 # AST, so that we can apply our AST transformations to the user code
1115 # without affecting the timing code.
1118 # without affecting the timing code.
1116 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
1119 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
1117 ' setup\n'
1120 ' setup\n'
1118 ' _t0 = _timer()\n'
1121 ' _t0 = _timer()\n'
1119 ' for _i in _it:\n'
1122 ' for _i in _it:\n'
1120 ' stmt\n'
1123 ' stmt\n'
1121 ' _t1 = _timer()\n'
1124 ' _t1 = _timer()\n'
1122 ' return _t1 - _t0\n')
1125 ' return _t1 - _t0\n')
1123
1126
1124 timeit_ast = TimeitTemplateFiller(ast_setup, ast_stmt).visit(timeit_ast_template)
1127 timeit_ast = TimeitTemplateFiller(ast_setup, ast_stmt).visit(timeit_ast_template)
1125 timeit_ast = ast.fix_missing_locations(timeit_ast)
1128 timeit_ast = ast.fix_missing_locations(timeit_ast)
1126
1129
1127 # Track compilation time so it can be reported if too long
1130 # Track compilation time so it can be reported if too long
1128 # Minimum time above which compilation time will be reported
1131 # Minimum time above which compilation time will be reported
1129 tc_min = 0.1
1132 tc_min = 0.1
1130
1133
1131 t0 = clock()
1134 t0 = clock()
1132 code = self.shell.compile(timeit_ast, "<magic-timeit>", "exec")
1135 code = self.shell.compile(timeit_ast, "<magic-timeit>", "exec")
1133 tc = clock()-t0
1136 tc = clock()-t0
1134
1137
1135 ns = {}
1138 ns = {}
1136 glob = self.shell.user_ns
1139 glob = self.shell.user_ns
1137 # handles global vars with same name as local vars. We store them in conflict_globs.
1140 # handles global vars with same name as local vars. We store them in conflict_globs.
1138 conflict_globs = {}
1141 conflict_globs = {}
1139 if local_ns and cell is None:
1142 if local_ns and cell is None:
1140 for var_name, var_val in glob.items():
1143 for var_name, var_val in glob.items():
1141 if var_name in local_ns:
1144 if var_name in local_ns:
1142 conflict_globs[var_name] = var_val
1145 conflict_globs[var_name] = var_val
1143 glob.update(local_ns)
1146 glob.update(local_ns)
1144
1147
1145 exec(code, glob, ns)
1148 exec(code, glob, ns)
1146 timer.inner = ns["inner"]
1149 timer.inner = ns["inner"]
1147
1150
1148 # This is used to check if there is a huge difference between the
1151 # This is used to check if there is a huge difference between the
1149 # best and worst timings.
1152 # best and worst timings.
1150 # Issue: https://github.com/ipython/ipython/issues/6471
1153 # Issue: https://github.com/ipython/ipython/issues/6471
1151 if number == 0:
1154 if number == 0:
1152 # determine number so that 0.2 <= total time < 2.0
1155 # determine number so that 0.2 <= total time < 2.0
1153 for index in range(0, 10):
1156 for index in range(0, 10):
1154 number = 10 ** index
1157 number = 10 ** index
1155 time_number = timer.timeit(number)
1158 time_number = timer.timeit(number)
1156 if time_number >= 0.2:
1159 if time_number >= 0.2:
1157 break
1160 break
1158
1161
1159 all_runs = timer.repeat(repeat, number)
1162 all_runs = timer.repeat(repeat, number)
1160 best = min(all_runs) / number
1163 best = min(all_runs) / number
1161 worst = max(all_runs) / number
1164 worst = max(all_runs) / number
1162 timeit_result = TimeitResult(number, repeat, best, worst, all_runs, tc, precision)
1165 timeit_result = TimeitResult(number, repeat, best, worst, all_runs, tc, precision)
1163
1166
1164 # Restore global vars from conflict_globs
1167 # Restore global vars from conflict_globs
1165 if conflict_globs:
1168 if conflict_globs:
1166 glob.update(conflict_globs)
1169 glob.update(conflict_globs)
1167
1170
1168 if not quiet :
1171 if not quiet :
1169 # Check best timing is greater than zero to avoid a
1172 # Check best timing is greater than zero to avoid a
1170 # ZeroDivisionError.
1173 # ZeroDivisionError.
1171 # In cases where the slowest timing is lesser than a micosecond
1174 # In cases where the slowest timing is lesser than a micosecond
1172 # we assume that it does not really matter if the fastest
1175 # we assume that it does not really matter if the fastest
1173 # timing is 4 times faster than the slowest timing or not.
1176 # timing is 4 times faster than the slowest timing or not.
1174 if worst > 4 * best and best > 0 and worst > 1e-6:
1177 if worst > 4 * best and best > 0 and worst > 1e-6:
1175 print("The slowest run took %0.2f times longer than the "
1178 print("The slowest run took %0.2f times longer than the "
1176 "fastest. This could mean that an intermediate result "
1179 "fastest. This could mean that an intermediate result "
1177 "is being cached." % (worst / best))
1180 "is being cached." % (worst / best))
1178
1181
1179 print( timeit_result )
1182 print( timeit_result )
1180
1183
1181 if tc > tc_min:
1184 if tc > tc_min:
1182 print("Compiler time: %.2f s" % tc)
1185 print("Compiler time: %.2f s" % tc)
1183 if return_result:
1186 if return_result:
1184 return timeit_result
1187 return timeit_result
1185
1188
1186 @skip_doctest
1189 @skip_doctest
1187 @no_var_expand
1190 @no_var_expand
1188 @needs_local_scope
1191 @needs_local_scope
1189 @line_cell_magic
1192 @line_cell_magic
1190 def time(self,line='', cell=None, local_ns=None):
1193 def time(self,line='', cell=None, local_ns=None):
1191 """Time execution of a Python statement or expression.
1194 """Time execution of a Python statement or expression.
1192
1195
1193 The CPU and wall clock times are printed, and the value of the
1196 The CPU and wall clock times are printed, and the value of the
1194 expression (if any) is returned. Note that under Win32, system time
1197 expression (if any) is returned. Note that under Win32, system time
1195 is always reported as 0, since it can not be measured.
1198 is always reported as 0, since it can not be measured.
1196
1199
1197 This function can be used both as a line and cell magic:
1200 This function can be used both as a line and cell magic:
1198
1201
1199 - In line mode you can time a single-line statement (though multiple
1202 - In line mode you can time a single-line statement (though multiple
1200 ones can be chained with using semicolons).
1203 ones can be chained with using semicolons).
1201
1204
1202 - In cell mode, you can time the cell body (a directly
1205 - In cell mode, you can time the cell body (a directly
1203 following statement raises an error).
1206 following statement raises an error).
1204
1207
1205 This function provides very basic timing functionality. Use the timeit
1208 This function provides very basic timing functionality. Use the timeit
1206 magic for more control over the measurement.
1209 magic for more control over the measurement.
1207
1210
1208 .. versionchanged:: 7.3
1211 .. versionchanged:: 7.3
1209 User variables are no longer expanded,
1212 User variables are no longer expanded,
1210 the magic line is always left unmodified.
1213 the magic line is always left unmodified.
1211
1214
1212 Examples
1215 Examples
1213 --------
1216 --------
1214 ::
1217 ::
1215
1218
1216 In [1]: %time 2**128
1219 In [1]: %time 2**128
1217 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1220 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1218 Wall time: 0.00
1221 Wall time: 0.00
1219 Out[1]: 340282366920938463463374607431768211456L
1222 Out[1]: 340282366920938463463374607431768211456L
1220
1223
1221 In [2]: n = 1000000
1224 In [2]: n = 1000000
1222
1225
1223 In [3]: %time sum(range(n))
1226 In [3]: %time sum(range(n))
1224 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1227 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1225 Wall time: 1.37
1228 Wall time: 1.37
1226 Out[3]: 499999500000L
1229 Out[3]: 499999500000L
1227
1230
1228 In [4]: %time print 'hello world'
1231 In [4]: %time print 'hello world'
1229 hello world
1232 hello world
1230 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1233 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1231 Wall time: 0.00
1234 Wall time: 0.00
1232
1235
1233 Note that the time needed by Python to compile the given expression
1236 Note that the time needed by Python to compile the given expression
1234 will be reported if it is more than 0.1s. In this example, the
1237 will be reported if it is more than 0.1s. In this example, the
1235 actual exponentiation is done by Python at compilation time, so while
1238 actual exponentiation is done by Python at compilation time, so while
1236 the expression can take a noticeable amount of time to compute, that
1239 the expression can take a noticeable amount of time to compute, that
1237 time is purely due to the compilation:
1240 time is purely due to the compilation:
1238
1241
1239 In [5]: %time 3**9999;
1242 In [5]: %time 3**9999;
1240 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1243 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1241 Wall time: 0.00 s
1244 Wall time: 0.00 s
1242
1245
1243 In [6]: %time 3**999999;
1246 In [6]: %time 3**999999;
1244 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1247 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1245 Wall time: 0.00 s
1248 Wall time: 0.00 s
1246 Compiler : 0.78 s
1249 Compiler : 0.78 s
1247 """
1250 """
1248
1251
1249 # fail immediately if the given expression can't be compiled
1252 # fail immediately if the given expression can't be compiled
1250
1253
1251 if line and cell:
1254 if line and cell:
1252 raise UsageError("Can't use statement directly after '%%time'!")
1255 raise UsageError("Can't use statement directly after '%%time'!")
1253
1256
1254 if cell:
1257 if cell:
1255 expr = self.shell.transform_cell(cell)
1258 expr = self.shell.transform_cell(cell)
1256 else:
1259 else:
1257 expr = self.shell.transform_cell(line)
1260 expr = self.shell.transform_cell(line)
1258
1261
1259 # Minimum time above which parse time will be reported
1262 # Minimum time above which parse time will be reported
1260 tp_min = 0.1
1263 tp_min = 0.1
1261
1264
1262 t0 = clock()
1265 t0 = clock()
1263 expr_ast = self.shell.compile.ast_parse(expr)
1266 expr_ast = self.shell.compile.ast_parse(expr)
1264 tp = clock()-t0
1267 tp = clock()-t0
1265
1268
1266 # Apply AST transformations
1269 # Apply AST transformations
1267 expr_ast = self.shell.transform_ast(expr_ast)
1270 expr_ast = self.shell.transform_ast(expr_ast)
1268
1271
1269 # Minimum time above which compilation time will be reported
1272 # Minimum time above which compilation time will be reported
1270 tc_min = 0.1
1273 tc_min = 0.1
1271
1274
1272 expr_val=None
1275 expr_val=None
1273 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1276 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1274 mode = 'eval'
1277 mode = 'eval'
1275 source = '<timed eval>'
1278 source = '<timed eval>'
1276 expr_ast = ast.Expression(expr_ast.body[0].value)
1279 expr_ast = ast.Expression(expr_ast.body[0].value)
1277 else:
1280 else:
1278 mode = 'exec'
1281 mode = 'exec'
1279 source = '<timed exec>'
1282 source = '<timed exec>'
1280 # multi-line %%time case
1283 # multi-line %%time case
1281 if len(expr_ast.body) > 1 :
1284 if len(expr_ast.body) > 1 :
1282 expr_val=expr_ast.body[-1]
1285 expr_val=expr_ast.body[-1]
1283 code_val = self.shell.compile(ast.Expression(expr_val.value)
1286 code_val = self.shell.compile(ast.Expression(expr_val.value)
1284 , '<timed eval>'
1287 , '<timed eval>'
1285 , 'eval')
1288 , 'eval')
1286 expr_ast=expr_ast.body[:-1]
1289 expr_ast=expr_ast.body[:-1]
1287 expr_ast = Module(expr_ast, [])
1290 expr_ast = Module(expr_ast, [])
1288
1291
1289 t0 = clock()
1292 t0 = clock()
1290 code = self.shell.compile(expr_ast, source, mode)
1293 code = self.shell.compile(expr_ast, source, mode)
1291 tc = clock()-t0
1294 tc = clock()-t0
1292
1295
1293 # skew measurement as little as possible
1296 # skew measurement as little as possible
1294 glob = self.shell.user_ns
1297 glob = self.shell.user_ns
1295 wtime = time.time
1298 wtime = time.time
1296 # time execution
1299 # time execution
1297 wall_st = wtime()
1300 wall_st = wtime()
1298 if mode=='eval':
1301 if mode=='eval':
1299 st = clock2()
1302 st = clock2()
1300 try:
1303 try:
1301 out = eval(code, glob, local_ns)
1304 out = eval(code, glob, local_ns)
1302 except:
1305 except:
1303 self.shell.showtraceback()
1306 self.shell.showtraceback()
1304 return
1307 return
1305 end = clock2()
1308 end = clock2()
1306 else:
1309 else:
1307 st = clock2()
1310 st = clock2()
1308 try:
1311 try:
1309 exec(code, glob, local_ns)
1312 exec(code, glob, local_ns)
1310 out=None
1313 out=None
1311 # multi-line %%time case
1314 # multi-line %%time case
1312 if expr_val and isinstance(expr_val, ast.Expr):
1315 if expr_val and isinstance(expr_val, ast.Expr):
1313 out = eval(code_val, glob, local_ns)
1316 out = eval(code_val, glob, local_ns)
1314 except:
1317 except:
1315 self.shell.showtraceback()
1318 self.shell.showtraceback()
1316 return
1319 return
1317 end = clock2()
1320 end = clock2()
1318
1321
1319 wall_end = wtime()
1322 wall_end = wtime()
1320 # Compute actual times and report
1323 # Compute actual times and report
1321 wall_time = wall_end-wall_st
1324 wall_time = wall_end-wall_st
1322 cpu_user = end[0]-st[0]
1325 cpu_user = end[0]-st[0]
1323 cpu_sys = end[1]-st[1]
1326 cpu_sys = end[1]-st[1]
1324 cpu_tot = cpu_user+cpu_sys
1327 cpu_tot = cpu_user+cpu_sys
1325 # On windows cpu_sys is always zero, so no new information to the next print
1328 # On windows cpu_sys is always zero, so no new information to the next print
1326 if sys.platform != 'win32':
1329 if sys.platform != 'win32':
1327 print("CPU times: user %s, sys: %s, total: %s" % \
1330 print("CPU times: user %s, sys: %s, total: %s" % \
1328 (_format_time(cpu_user),_format_time(cpu_sys),_format_time(cpu_tot)))
1331 (_format_time(cpu_user),_format_time(cpu_sys),_format_time(cpu_tot)))
1329 print("Wall time: %s" % _format_time(wall_time))
1332 print("Wall time: %s" % _format_time(wall_time))
1330 if tc > tc_min:
1333 if tc > tc_min:
1331 print("Compiler : %s" % _format_time(tc))
1334 print("Compiler : %s" % _format_time(tc))
1332 if tp > tp_min:
1335 if tp > tp_min:
1333 print("Parser : %s" % _format_time(tp))
1336 print("Parser : %s" % _format_time(tp))
1334 return out
1337 return out
1335
1338
1336 @skip_doctest
1339 @skip_doctest
1337 @line_magic
1340 @line_magic
1338 def macro(self, parameter_s=''):
1341 def macro(self, parameter_s=''):
1339 """Define a macro for future re-execution. It accepts ranges of history,
1342 """Define a macro for future re-execution. It accepts ranges of history,
1340 filenames or string objects.
1343 filenames or string objects.
1341
1344
1342 Usage:\\
1345 Usage:\\
1343 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1346 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1344
1347
1345 Options:
1348 Options:
1346
1349
1347 -r: use 'raw' input. By default, the 'processed' history is used,
1350 -r: use 'raw' input. By default, the 'processed' history is used,
1348 so that magics are loaded in their transformed version to valid
1351 so that magics are loaded in their transformed version to valid
1349 Python. If this option is given, the raw input as typed at the
1352 Python. If this option is given, the raw input as typed at the
1350 command line is used instead.
1353 command line is used instead.
1351
1354
1352 -q: quiet macro definition. By default, a tag line is printed
1355 -q: quiet macro definition. By default, a tag line is printed
1353 to indicate the macro has been created, and then the contents of
1356 to indicate the macro has been created, and then the contents of
1354 the macro are printed. If this option is given, then no printout
1357 the macro are printed. If this option is given, then no printout
1355 is produced once the macro is created.
1358 is produced once the macro is created.
1356
1359
1357 This will define a global variable called `name` which is a string
1360 This will define a global variable called `name` which is a string
1358 made of joining the slices and lines you specify (n1,n2,... numbers
1361 made of joining the slices and lines you specify (n1,n2,... numbers
1359 above) from your input history into a single string. This variable
1362 above) from your input history into a single string. This variable
1360 acts like an automatic function which re-executes those lines as if
1363 acts like an automatic function which re-executes those lines as if
1361 you had typed them. You just type 'name' at the prompt and the code
1364 you had typed them. You just type 'name' at the prompt and the code
1362 executes.
1365 executes.
1363
1366
1364 The syntax for indicating input ranges is described in %history.
1367 The syntax for indicating input ranges is described in %history.
1365
1368
1366 Note: as a 'hidden' feature, you can also use traditional python slice
1369 Note: as a 'hidden' feature, you can also use traditional python slice
1367 notation, where N:M means numbers N through M-1.
1370 notation, where N:M means numbers N through M-1.
1368
1371
1369 For example, if your history contains (print using %hist -n )::
1372 For example, if your history contains (print using %hist -n )::
1370
1373
1371 44: x=1
1374 44: x=1
1372 45: y=3
1375 45: y=3
1373 46: z=x+y
1376 46: z=x+y
1374 47: print x
1377 47: print x
1375 48: a=5
1378 48: a=5
1376 49: print 'x',x,'y',y
1379 49: print 'x',x,'y',y
1377
1380
1378 you can create a macro with lines 44 through 47 (included) and line 49
1381 you can create a macro with lines 44 through 47 (included) and line 49
1379 called my_macro with::
1382 called my_macro with::
1380
1383
1381 In [55]: %macro my_macro 44-47 49
1384 In [55]: %macro my_macro 44-47 49
1382
1385
1383 Now, typing `my_macro` (without quotes) will re-execute all this code
1386 Now, typing `my_macro` (without quotes) will re-execute all this code
1384 in one pass.
1387 in one pass.
1385
1388
1386 You don't need to give the line-numbers in order, and any given line
1389 You don't need to give the line-numbers in order, and any given line
1387 number can appear multiple times. You can assemble macros with any
1390 number can appear multiple times. You can assemble macros with any
1388 lines from your input history in any order.
1391 lines from your input history in any order.
1389
1392
1390 The macro is a simple object which holds its value in an attribute,
1393 The macro is a simple object which holds its value in an attribute,
1391 but IPython's display system checks for macros and executes them as
1394 but IPython's display system checks for macros and executes them as
1392 code instead of printing them when you type their name.
1395 code instead of printing them when you type their name.
1393
1396
1394 You can view a macro's contents by explicitly printing it with::
1397 You can view a macro's contents by explicitly printing it with::
1395
1398
1396 print macro_name
1399 print macro_name
1397
1400
1398 """
1401 """
1399 opts,args = self.parse_options(parameter_s,'rq',mode='list')
1402 opts,args = self.parse_options(parameter_s,'rq',mode='list')
1400 if not args: # List existing macros
1403 if not args: # List existing macros
1401 return sorted(k for k,v in self.shell.user_ns.items() if isinstance(v, Macro))
1404 return sorted(k for k,v in self.shell.user_ns.items() if isinstance(v, Macro))
1402 if len(args) == 1:
1405 if len(args) == 1:
1403 raise UsageError(
1406 raise UsageError(
1404 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1407 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1405 name, codefrom = args[0], " ".join(args[1:])
1408 name, codefrom = args[0], " ".join(args[1:])
1406
1409
1407 #print 'rng',ranges # dbg
1410 #print 'rng',ranges # dbg
1408 try:
1411 try:
1409 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1412 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1410 except (ValueError, TypeError) as e:
1413 except (ValueError, TypeError) as e:
1411 print(e.args[0])
1414 print(e.args[0])
1412 return
1415 return
1413 macro = Macro(lines)
1416 macro = Macro(lines)
1414 self.shell.define_macro(name, macro)
1417 self.shell.define_macro(name, macro)
1415 if not ( 'q' in opts) :
1418 if not ( 'q' in opts) :
1416 print('Macro `%s` created. To execute, type its name (without quotes).' % name)
1419 print('Macro `%s` created. To execute, type its name (without quotes).' % name)
1417 print('=== Macro contents: ===')
1420 print('=== Macro contents: ===')
1418 print(macro, end=' ')
1421 print(macro, end=' ')
1419
1422
1420 @magic_arguments.magic_arguments()
1423 @magic_arguments.magic_arguments()
1421 @magic_arguments.argument('output', type=str, default='', nargs='?',
1424 @magic_arguments.argument('output', type=str, default='', nargs='?',
1422 help="""The name of the variable in which to store output.
1425 help="""The name of the variable in which to store output.
1423 This is a utils.io.CapturedIO object with stdout/err attributes
1426 This is a utils.io.CapturedIO object with stdout/err attributes
1424 for the text of the captured output.
1427 for the text of the captured output.
1425
1428
1426 CapturedOutput also has a show() method for displaying the output,
1429 CapturedOutput also has a show() method for displaying the output,
1427 and __call__ as well, so you can use that to quickly display the
1430 and __call__ as well, so you can use that to quickly display the
1428 output.
1431 output.
1429
1432
1430 If unspecified, captured output is discarded.
1433 If unspecified, captured output is discarded.
1431 """
1434 """
1432 )
1435 )
1433 @magic_arguments.argument('--no-stderr', action="store_true",
1436 @magic_arguments.argument('--no-stderr', action="store_true",
1434 help="""Don't capture stderr."""
1437 help="""Don't capture stderr."""
1435 )
1438 )
1436 @magic_arguments.argument('--no-stdout', action="store_true",
1439 @magic_arguments.argument('--no-stdout', action="store_true",
1437 help="""Don't capture stdout."""
1440 help="""Don't capture stdout."""
1438 )
1441 )
1439 @magic_arguments.argument('--no-display', action="store_true",
1442 @magic_arguments.argument('--no-display', action="store_true",
1440 help="""Don't capture IPython's rich display."""
1443 help="""Don't capture IPython's rich display."""
1441 )
1444 )
1442 @cell_magic
1445 @cell_magic
1443 def capture(self, line, cell):
1446 def capture(self, line, cell):
1444 """run the cell, capturing stdout, stderr, and IPython's rich display() calls."""
1447 """run the cell, capturing stdout, stderr, and IPython's rich display() calls."""
1445 args = magic_arguments.parse_argstring(self.capture, line)
1448 args = magic_arguments.parse_argstring(self.capture, line)
1446 out = not args.no_stdout
1449 out = not args.no_stdout
1447 err = not args.no_stderr
1450 err = not args.no_stderr
1448 disp = not args.no_display
1451 disp = not args.no_display
1449 with capture_output(out, err, disp) as io:
1452 with capture_output(out, err, disp) as io:
1450 self.shell.run_cell(cell)
1453 self.shell.run_cell(cell)
1451 if args.output:
1454 if args.output:
1452 self.shell.user_ns[args.output] = io
1455 self.shell.user_ns[args.output] = io
1453
1456
1454 def parse_breakpoint(text, current_file):
1457 def parse_breakpoint(text, current_file):
1455 '''Returns (file, line) for file:line and (current_file, line) for line'''
1458 '''Returns (file, line) for file:line and (current_file, line) for line'''
1456 colon = text.find(':')
1459 colon = text.find(':')
1457 if colon == -1:
1460 if colon == -1:
1458 return current_file, int(text)
1461 return current_file, int(text)
1459 else:
1462 else:
1460 return text[:colon], int(text[colon+1:])
1463 return text[:colon], int(text[colon+1:])
1461
1464
1462 def _format_time(timespan, precision=3):
1465 def _format_time(timespan, precision=3):
1463 """Formats the timespan in a human readable form"""
1466 """Formats the timespan in a human readable form"""
1464
1467
1465 if timespan >= 60.0:
1468 if timespan >= 60.0:
1466 # we have more than a minute, format that in a human readable form
1469 # we have more than a minute, format that in a human readable form
1467 # Idea from http://snipplr.com/view/5713/
1470 # Idea from http://snipplr.com/view/5713/
1468 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1471 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1469 time = []
1472 time = []
1470 leftover = timespan
1473 leftover = timespan
1471 for suffix, length in parts:
1474 for suffix, length in parts:
1472 value = int(leftover / length)
1475 value = int(leftover / length)
1473 if value > 0:
1476 if value > 0:
1474 leftover = leftover % length
1477 leftover = leftover % length
1475 time.append(u'%s%s' % (str(value), suffix))
1478 time.append(u'%s%s' % (str(value), suffix))
1476 if leftover < 1:
1479 if leftover < 1:
1477 break
1480 break
1478 return " ".join(time)
1481 return " ".join(time)
1479
1482
1480
1483
1481 # Unfortunately the unicode 'micro' symbol can cause problems in
1484 # Unfortunately the unicode 'micro' symbol can cause problems in
1482 # certain terminals.
1485 # certain terminals.
1483 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1486 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1484 # Try to prevent crashes by being more secure than it needs to
1487 # Try to prevent crashes by being more secure than it needs to
1485 # E.g. eclipse is able to print a µ, but has no sys.stdout.encoding set.
1488 # E.g. eclipse is able to print a µ, but has no sys.stdout.encoding set.
1486 units = [u"s", u"ms",u'us',"ns"] # the save value
1489 units = [u"s", u"ms",u'us',"ns"] # the save value
1487 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1490 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1488 try:
1491 try:
1489 u'\xb5'.encode(sys.stdout.encoding)
1492 u'\xb5'.encode(sys.stdout.encoding)
1490 units = [u"s", u"ms",u'\xb5s',"ns"]
1493 units = [u"s", u"ms",u'\xb5s',"ns"]
1491 except:
1494 except:
1492 pass
1495 pass
1493 scaling = [1, 1e3, 1e6, 1e9]
1496 scaling = [1, 1e3, 1e6, 1e9]
1494
1497
1495 if timespan > 0.0:
1498 if timespan > 0.0:
1496 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1499 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1497 else:
1500 else:
1498 order = 3
1501 order = 3
1499 return u"%.*g %s" % (precision, timespan * scaling[order], units[order])
1502 return u"%.*g %s" % (precision, timespan * scaling[order], units[order])
General Comments 0
You need to be logged in to leave comments. Login now