##// END OF EJS Templates
Fix the issue with %run-ing something with multiprocessing...
Matthias Bussonnier -
Show More
@@ -1,1501 +1,1503 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 if '__mp_main__' in sys.modules:
857 sys.modules['__mp_main__'] = restore_main
856 else:
858 else:
857 # Remove from sys.modules the reference to main_mod we'd
859 # Remove from sys.modules the reference to main_mod we'd
858 # added. Otherwise it will trap references to objects
860 # added. Otherwise it will trap references to objects
859 # contained therein.
861 # contained therein.
860 del sys.modules[main_mod_name]
862 del sys.modules[main_mod_name]
861
863
862 return stats
864 return stats
863
865
864 def _run_with_debugger(self, code, code_ns, filename=None,
866 def _run_with_debugger(self, code, code_ns, filename=None,
865 bp_line=None, bp_file=None):
867 bp_line=None, bp_file=None):
866 """
868 """
867 Run `code` in debugger with a break point.
869 Run `code` in debugger with a break point.
868
870
869 Parameters
871 Parameters
870 ----------
872 ----------
871 code : str
873 code : str
872 Code to execute.
874 Code to execute.
873 code_ns : dict
875 code_ns : dict
874 A namespace in which `code` is executed.
876 A namespace in which `code` is executed.
875 filename : str
877 filename : str
876 `code` is ran as if it is in `filename`.
878 `code` is ran as if it is in `filename`.
877 bp_line : int, optional
879 bp_line : int, optional
878 Line number of the break point.
880 Line number of the break point.
879 bp_file : str, optional
881 bp_file : str, optional
880 Path to the file in which break point is specified.
882 Path to the file in which break point is specified.
881 `filename` is used if not given.
883 `filename` is used if not given.
882
884
883 Raises
885 Raises
884 ------
886 ------
885 UsageError
887 UsageError
886 If the break point given by `bp_line` is not valid.
888 If the break point given by `bp_line` is not valid.
887
889
888 """
890 """
889 deb = self.shell.InteractiveTB.pdb
891 deb = self.shell.InteractiveTB.pdb
890 if not deb:
892 if not deb:
891 self.shell.InteractiveTB.pdb = self.shell.InteractiveTB.debugger_cls()
893 self.shell.InteractiveTB.pdb = self.shell.InteractiveTB.debugger_cls()
892 deb = self.shell.InteractiveTB.pdb
894 deb = self.shell.InteractiveTB.pdb
893
895
894 # deb.checkline() fails if deb.curframe exists but is None; it can
896 # deb.checkline() fails if deb.curframe exists but is None; it can
895 # handle it not existing. https://github.com/ipython/ipython/issues/10028
897 # handle it not existing. https://github.com/ipython/ipython/issues/10028
896 if hasattr(deb, 'curframe'):
898 if hasattr(deb, 'curframe'):
897 del deb.curframe
899 del deb.curframe
898
900
899 # reset Breakpoint state, which is moronically kept
901 # reset Breakpoint state, which is moronically kept
900 # in a class
902 # in a class
901 bdb.Breakpoint.next = 1
903 bdb.Breakpoint.next = 1
902 bdb.Breakpoint.bplist = {}
904 bdb.Breakpoint.bplist = {}
903 bdb.Breakpoint.bpbynumber = [None]
905 bdb.Breakpoint.bpbynumber = [None]
904 deb.clear_all_breaks()
906 deb.clear_all_breaks()
905 if bp_line is not None:
907 if bp_line is not None:
906 # Set an initial breakpoint to stop execution
908 # Set an initial breakpoint to stop execution
907 maxtries = 10
909 maxtries = 10
908 bp_file = bp_file or filename
910 bp_file = bp_file or filename
909 checkline = deb.checkline(bp_file, bp_line)
911 checkline = deb.checkline(bp_file, bp_line)
910 if not checkline:
912 if not checkline:
911 for bp in range(bp_line + 1, bp_line + maxtries + 1):
913 for bp in range(bp_line + 1, bp_line + maxtries + 1):
912 if deb.checkline(bp_file, bp):
914 if deb.checkline(bp_file, bp):
913 break
915 break
914 else:
916 else:
915 msg = ("\nI failed to find a valid line to set "
917 msg = ("\nI failed to find a valid line to set "
916 "a breakpoint\n"
918 "a breakpoint\n"
917 "after trying up to line: %s.\n"
919 "after trying up to line: %s.\n"
918 "Please set a valid breakpoint manually "
920 "Please set a valid breakpoint manually "
919 "with the -b option." % bp)
921 "with the -b option." % bp)
920 raise UsageError(msg)
922 raise UsageError(msg)
921 # if we find a good linenumber, set the breakpoint
923 # if we find a good linenumber, set the breakpoint
922 deb.do_break('%s:%s' % (bp_file, bp_line))
924 deb.do_break('%s:%s' % (bp_file, bp_line))
923
925
924 if filename:
926 if filename:
925 # Mimic Pdb._runscript(...)
927 # Mimic Pdb._runscript(...)
926 deb._wait_for_mainpyfile = True
928 deb._wait_for_mainpyfile = True
927 deb.mainpyfile = deb.canonic(filename)
929 deb.mainpyfile = deb.canonic(filename)
928
930
929 # Start file run
931 # Start file run
930 print("NOTE: Enter 'c' at the %s prompt to continue execution." % deb.prompt)
932 print("NOTE: Enter 'c' at the %s prompt to continue execution." % deb.prompt)
931 try:
933 try:
932 if filename:
934 if filename:
933 # save filename so it can be used by methods on the deb object
935 # save filename so it can be used by methods on the deb object
934 deb._exec_filename = filename
936 deb._exec_filename = filename
935 while True:
937 while True:
936 try:
938 try:
937 trace = sys.gettrace()
939 trace = sys.gettrace()
938 deb.run(code, code_ns)
940 deb.run(code, code_ns)
939 except Restart:
941 except Restart:
940 print("Restarting")
942 print("Restarting")
941 if filename:
943 if filename:
942 deb._wait_for_mainpyfile = True
944 deb._wait_for_mainpyfile = True
943 deb.mainpyfile = deb.canonic(filename)
945 deb.mainpyfile = deb.canonic(filename)
944 continue
946 continue
945 else:
947 else:
946 break
948 break
947 finally:
949 finally:
948 sys.settrace(trace)
950 sys.settrace(trace)
949
951
950
952
951 except:
953 except:
952 etype, value, tb = sys.exc_info()
954 etype, value, tb = sys.exc_info()
953 # Skip three frames in the traceback: the %run one,
955 # Skip three frames in the traceback: the %run one,
954 # one inside bdb.py, and the command-line typed by the
956 # one inside bdb.py, and the command-line typed by the
955 # user (run by exec in pdb itself).
957 # user (run by exec in pdb itself).
956 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
958 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
957
959
958 @staticmethod
960 @staticmethod
959 def _run_with_timing(run, nruns):
961 def _run_with_timing(run, nruns):
960 """
962 """
961 Run function `run` and print timing information.
963 Run function `run` and print timing information.
962
964
963 Parameters
965 Parameters
964 ----------
966 ----------
965 run : callable
967 run : callable
966 Any callable object which takes no argument.
968 Any callable object which takes no argument.
967 nruns : int
969 nruns : int
968 Number of times to execute `run`.
970 Number of times to execute `run`.
969
971
970 """
972 """
971 twall0 = time.perf_counter()
973 twall0 = time.perf_counter()
972 if nruns == 1:
974 if nruns == 1:
973 t0 = clock2()
975 t0 = clock2()
974 run()
976 run()
975 t1 = clock2()
977 t1 = clock2()
976 t_usr = t1[0] - t0[0]
978 t_usr = t1[0] - t0[0]
977 t_sys = t1[1] - t0[1]
979 t_sys = t1[1] - t0[1]
978 print("\nIPython CPU timings (estimated):")
980 print("\nIPython CPU timings (estimated):")
979 print(" User : %10.2f s." % t_usr)
981 print(" User : %10.2f s." % t_usr)
980 print(" System : %10.2f s." % t_sys)
982 print(" System : %10.2f s." % t_sys)
981 else:
983 else:
982 runs = range(nruns)
984 runs = range(nruns)
983 t0 = clock2()
985 t0 = clock2()
984 for nr in runs:
986 for nr in runs:
985 run()
987 run()
986 t1 = clock2()
988 t1 = clock2()
987 t_usr = t1[0] - t0[0]
989 t_usr = t1[0] - t0[0]
988 t_sys = t1[1] - t0[1]
990 t_sys = t1[1] - t0[1]
989 print("\nIPython CPU timings (estimated):")
991 print("\nIPython CPU timings (estimated):")
990 print("Total runs performed:", nruns)
992 print("Total runs performed:", nruns)
991 print(" Times : %10s %10s" % ('Total', 'Per run'))
993 print(" Times : %10s %10s" % ('Total', 'Per run'))
992 print(" User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns))
994 print(" User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns))
993 print(" System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns))
995 print(" System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns))
994 twall1 = time.perf_counter()
996 twall1 = time.perf_counter()
995 print("Wall time: %10.2f s." % (twall1 - twall0))
997 print("Wall time: %10.2f s." % (twall1 - twall0))
996
998
997 @skip_doctest
999 @skip_doctest
998 @no_var_expand
1000 @no_var_expand
999 @line_cell_magic
1001 @line_cell_magic
1000 @needs_local_scope
1002 @needs_local_scope
1001 def timeit(self, line='', cell=None, local_ns=None):
1003 def timeit(self, line='', cell=None, local_ns=None):
1002 """Time execution of a Python statement or expression
1004 """Time execution of a Python statement or expression
1003
1005
1004 Usage, in line mode:
1006 Usage, in line mode:
1005 %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
1007 %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
1006 or in cell mode:
1008 or in cell mode:
1007 %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
1009 %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
1008 code
1010 code
1009 code...
1011 code...
1010
1012
1011 Time execution of a Python statement or expression using the timeit
1013 Time execution of a Python statement or expression using the timeit
1012 module. This function can be used both as a line and cell magic:
1014 module. This function can be used both as a line and cell magic:
1013
1015
1014 - In line mode you can time a single-line statement (though multiple
1016 - In line mode you can time a single-line statement (though multiple
1015 ones can be chained with using semicolons).
1017 ones can be chained with using semicolons).
1016
1018
1017 - In cell mode, the statement in the first line is used as setup code
1019 - In cell mode, the statement in the first line is used as setup code
1018 (executed but not timed) and the body of the cell is timed. The cell
1020 (executed but not timed) and the body of the cell is timed. The cell
1019 body has access to any variables created in the setup code.
1021 body has access to any variables created in the setup code.
1020
1022
1021 Options:
1023 Options:
1022 -n<N>: execute the given statement <N> times in a loop. If <N> is not
1024 -n<N>: execute the given statement <N> times in a loop. If <N> is not
1023 provided, <N> is determined so as to get sufficient accuracy.
1025 provided, <N> is determined so as to get sufficient accuracy.
1024
1026
1025 -r<R>: number of repeats <R>, each consisting of <N> loops, and take the
1027 -r<R>: number of repeats <R>, each consisting of <N> loops, and take the
1026 best result.
1028 best result.
1027 Default: 7
1029 Default: 7
1028
1030
1029 -t: use time.time to measure the time, which is the default on Unix.
1031 -t: use time.time to measure the time, which is the default on Unix.
1030 This function measures wall time.
1032 This function measures wall time.
1031
1033
1032 -c: use time.clock to measure the time, which is the default on
1034 -c: use time.clock to measure the time, which is the default on
1033 Windows and measures wall time. On Unix, resource.getrusage is used
1035 Windows and measures wall time. On Unix, resource.getrusage is used
1034 instead and returns the CPU user time.
1036 instead and returns the CPU user time.
1035
1037
1036 -p<P>: use a precision of <P> digits to display the timing result.
1038 -p<P>: use a precision of <P> digits to display the timing result.
1037 Default: 3
1039 Default: 3
1038
1040
1039 -q: Quiet, do not print result.
1041 -q: Quiet, do not print result.
1040
1042
1041 -o: return a TimeitResult that can be stored in a variable to inspect
1043 -o: return a TimeitResult that can be stored in a variable to inspect
1042 the result in more details.
1044 the result in more details.
1043
1045
1044 .. versionchanged:: 7.3
1046 .. versionchanged:: 7.3
1045 User variables are no longer expanded,
1047 User variables are no longer expanded,
1046 the magic line is always left unmodified.
1048 the magic line is always left unmodified.
1047
1049
1048 Examples
1050 Examples
1049 --------
1051 --------
1050 ::
1052 ::
1051
1053
1052 In [1]: %timeit pass
1054 In [1]: %timeit pass
1053 8.26 ns ± 0.12 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
1055 8.26 ns ± 0.12 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
1054
1056
1055 In [2]: u = None
1057 In [2]: u = None
1056
1058
1057 In [3]: %timeit u is None
1059 In [3]: %timeit u is None
1058 29.9 ns ± 0.643 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
1060 29.9 ns ± 0.643 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
1059
1061
1060 In [4]: %timeit -r 4 u == None
1062 In [4]: %timeit -r 4 u == None
1061
1063
1062 In [5]: import time
1064 In [5]: import time
1063
1065
1064 In [6]: %timeit -n1 time.sleep(2)
1066 In [6]: %timeit -n1 time.sleep(2)
1065
1067
1066
1068
1067 The times reported by %timeit will be slightly higher than those
1069 The times reported by %timeit will be slightly higher than those
1068 reported by the timeit.py script when variables are accessed. This is
1070 reported by the timeit.py script when variables are accessed. This is
1069 due to the fact that %timeit executes the statement in the namespace
1071 due to the fact that %timeit executes the statement in the namespace
1070 of the shell, compared with timeit.py, which uses a single setup
1072 of the shell, compared with timeit.py, which uses a single setup
1071 statement to import function or create variables. Generally, the bias
1073 statement to import function or create variables. Generally, the bias
1072 does not matter as long as results from timeit.py are not mixed with
1074 does not matter as long as results from timeit.py are not mixed with
1073 those from %timeit."""
1075 those from %timeit."""
1074
1076
1075 opts, stmt = self.parse_options(line,'n:r:tcp:qo',
1077 opts, stmt = self.parse_options(line,'n:r:tcp:qo',
1076 posix=False, strict=False)
1078 posix=False, strict=False)
1077 if stmt == "" and cell is None:
1079 if stmt == "" and cell is None:
1078 return
1080 return
1079
1081
1080 timefunc = timeit.default_timer
1082 timefunc = timeit.default_timer
1081 number = int(getattr(opts, "n", 0))
1083 number = int(getattr(opts, "n", 0))
1082 default_repeat = 7 if timeit.default_repeat < 7 else timeit.default_repeat
1084 default_repeat = 7 if timeit.default_repeat < 7 else timeit.default_repeat
1083 repeat = int(getattr(opts, "r", default_repeat))
1085 repeat = int(getattr(opts, "r", default_repeat))
1084 precision = int(getattr(opts, "p", 3))
1086 precision = int(getattr(opts, "p", 3))
1085 quiet = 'q' in opts
1087 quiet = 'q' in opts
1086 return_result = 'o' in opts
1088 return_result = 'o' in opts
1087 if hasattr(opts, "t"):
1089 if hasattr(opts, "t"):
1088 timefunc = time.time
1090 timefunc = time.time
1089 if hasattr(opts, "c"):
1091 if hasattr(opts, "c"):
1090 timefunc = clock
1092 timefunc = clock
1091
1093
1092 timer = Timer(timer=timefunc)
1094 timer = Timer(timer=timefunc)
1093 # this code has tight coupling to the inner workings of timeit.Timer,
1095 # this code has tight coupling to the inner workings of timeit.Timer,
1094 # but is there a better way to achieve that the code stmt has access
1096 # but is there a better way to achieve that the code stmt has access
1095 # to the shell namespace?
1097 # to the shell namespace?
1096 transform = self.shell.transform_cell
1098 transform = self.shell.transform_cell
1097
1099
1098 if cell is None:
1100 if cell is None:
1099 # called as line magic
1101 # called as line magic
1100 ast_setup = self.shell.compile.ast_parse("pass")
1102 ast_setup = self.shell.compile.ast_parse("pass")
1101 ast_stmt = self.shell.compile.ast_parse(transform(stmt))
1103 ast_stmt = self.shell.compile.ast_parse(transform(stmt))
1102 else:
1104 else:
1103 ast_setup = self.shell.compile.ast_parse(transform(stmt))
1105 ast_setup = self.shell.compile.ast_parse(transform(stmt))
1104 ast_stmt = self.shell.compile.ast_parse(transform(cell))
1106 ast_stmt = self.shell.compile.ast_parse(transform(cell))
1105
1107
1106 ast_setup = self.shell.transform_ast(ast_setup)
1108 ast_setup = self.shell.transform_ast(ast_setup)
1107 ast_stmt = self.shell.transform_ast(ast_stmt)
1109 ast_stmt = self.shell.transform_ast(ast_stmt)
1108
1110
1109 # Check that these compile to valid Python code *outside* the timer func
1111 # Check that these compile to valid Python code *outside* the timer func
1110 # Invalid code may become valid when put inside the function & loop,
1112 # Invalid code may become valid when put inside the function & loop,
1111 # which messes up error messages.
1113 # which messes up error messages.
1112 # https://github.com/ipython/ipython/issues/10636
1114 # https://github.com/ipython/ipython/issues/10636
1113 self.shell.compile(ast_setup, "<magic-timeit-setup>", "exec")
1115 self.shell.compile(ast_setup, "<magic-timeit-setup>", "exec")
1114 self.shell.compile(ast_stmt, "<magic-timeit-stmt>", "exec")
1116 self.shell.compile(ast_stmt, "<magic-timeit-stmt>", "exec")
1115
1117
1116 # This codestring is taken from timeit.template - we fill it in as an
1118 # This codestring is taken from timeit.template - we fill it in as an
1117 # AST, so that we can apply our AST transformations to the user code
1119 # AST, so that we can apply our AST transformations to the user code
1118 # without affecting the timing code.
1120 # without affecting the timing code.
1119 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
1121 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
1120 ' setup\n'
1122 ' setup\n'
1121 ' _t0 = _timer()\n'
1123 ' _t0 = _timer()\n'
1122 ' for _i in _it:\n'
1124 ' for _i in _it:\n'
1123 ' stmt\n'
1125 ' stmt\n'
1124 ' _t1 = _timer()\n'
1126 ' _t1 = _timer()\n'
1125 ' return _t1 - _t0\n')
1127 ' return _t1 - _t0\n')
1126
1128
1127 timeit_ast = TimeitTemplateFiller(ast_setup, ast_stmt).visit(timeit_ast_template)
1129 timeit_ast = TimeitTemplateFiller(ast_setup, ast_stmt).visit(timeit_ast_template)
1128 timeit_ast = ast.fix_missing_locations(timeit_ast)
1130 timeit_ast = ast.fix_missing_locations(timeit_ast)
1129
1131
1130 # Track compilation time so it can be reported if too long
1132 # Track compilation time so it can be reported if too long
1131 # Minimum time above which compilation time will be reported
1133 # Minimum time above which compilation time will be reported
1132 tc_min = 0.1
1134 tc_min = 0.1
1133
1135
1134 t0 = clock()
1136 t0 = clock()
1135 code = self.shell.compile(timeit_ast, "<magic-timeit>", "exec")
1137 code = self.shell.compile(timeit_ast, "<magic-timeit>", "exec")
1136 tc = clock()-t0
1138 tc = clock()-t0
1137
1139
1138 ns = {}
1140 ns = {}
1139 glob = self.shell.user_ns
1141 glob = self.shell.user_ns
1140 # handles global vars with same name as local vars. We store them in conflict_globs.
1142 # handles global vars with same name as local vars. We store them in conflict_globs.
1141 conflict_globs = {}
1143 conflict_globs = {}
1142 if local_ns and cell is None:
1144 if local_ns and cell is None:
1143 for var_name, var_val in glob.items():
1145 for var_name, var_val in glob.items():
1144 if var_name in local_ns:
1146 if var_name in local_ns:
1145 conflict_globs[var_name] = var_val
1147 conflict_globs[var_name] = var_val
1146 glob.update(local_ns)
1148 glob.update(local_ns)
1147
1149
1148 exec(code, glob, ns)
1150 exec(code, glob, ns)
1149 timer.inner = ns["inner"]
1151 timer.inner = ns["inner"]
1150
1152
1151 # This is used to check if there is a huge difference between the
1153 # This is used to check if there is a huge difference between the
1152 # best and worst timings.
1154 # best and worst timings.
1153 # Issue: https://github.com/ipython/ipython/issues/6471
1155 # Issue: https://github.com/ipython/ipython/issues/6471
1154 if number == 0:
1156 if number == 0:
1155 # determine number so that 0.2 <= total time < 2.0
1157 # determine number so that 0.2 <= total time < 2.0
1156 for index in range(0, 10):
1158 for index in range(0, 10):
1157 number = 10 ** index
1159 number = 10 ** index
1158 time_number = timer.timeit(number)
1160 time_number = timer.timeit(number)
1159 if time_number >= 0.2:
1161 if time_number >= 0.2:
1160 break
1162 break
1161
1163
1162 all_runs = timer.repeat(repeat, number)
1164 all_runs = timer.repeat(repeat, number)
1163 best = min(all_runs) / number
1165 best = min(all_runs) / number
1164 worst = max(all_runs) / number
1166 worst = max(all_runs) / number
1165 timeit_result = TimeitResult(number, repeat, best, worst, all_runs, tc, precision)
1167 timeit_result = TimeitResult(number, repeat, best, worst, all_runs, tc, precision)
1166
1168
1167 # Restore global vars from conflict_globs
1169 # Restore global vars from conflict_globs
1168 if conflict_globs:
1170 if conflict_globs:
1169 glob.update(conflict_globs)
1171 glob.update(conflict_globs)
1170
1172
1171 if not quiet :
1173 if not quiet :
1172 # Check best timing is greater than zero to avoid a
1174 # Check best timing is greater than zero to avoid a
1173 # ZeroDivisionError.
1175 # ZeroDivisionError.
1174 # In cases where the slowest timing is lesser than a microsecond
1176 # In cases where the slowest timing is lesser than a microsecond
1175 # we assume that it does not really matter if the fastest
1177 # we assume that it does not really matter if the fastest
1176 # timing is 4 times faster than the slowest timing or not.
1178 # timing is 4 times faster than the slowest timing or not.
1177 if worst > 4 * best and best > 0 and worst > 1e-6:
1179 if worst > 4 * best and best > 0 and worst > 1e-6:
1178 print("The slowest run took %0.2f times longer than the "
1180 print("The slowest run took %0.2f times longer than the "
1179 "fastest. This could mean that an intermediate result "
1181 "fastest. This could mean that an intermediate result "
1180 "is being cached." % (worst / best))
1182 "is being cached." % (worst / best))
1181
1183
1182 print( timeit_result )
1184 print( timeit_result )
1183
1185
1184 if tc > tc_min:
1186 if tc > tc_min:
1185 print("Compiler time: %.2f s" % tc)
1187 print("Compiler time: %.2f s" % tc)
1186 if return_result:
1188 if return_result:
1187 return timeit_result
1189 return timeit_result
1188
1190
1189 @skip_doctest
1191 @skip_doctest
1190 @no_var_expand
1192 @no_var_expand
1191 @needs_local_scope
1193 @needs_local_scope
1192 @line_cell_magic
1194 @line_cell_magic
1193 def time(self,line='', cell=None, local_ns=None):
1195 def time(self,line='', cell=None, local_ns=None):
1194 """Time execution of a Python statement or expression.
1196 """Time execution of a Python statement or expression.
1195
1197
1196 The CPU and wall clock times are printed, and the value of the
1198 The CPU and wall clock times are printed, and the value of the
1197 expression (if any) is returned. Note that under Win32, system time
1199 expression (if any) is returned. Note that under Win32, system time
1198 is always reported as 0, since it can not be measured.
1200 is always reported as 0, since it can not be measured.
1199
1201
1200 This function can be used both as a line and cell magic:
1202 This function can be used both as a line and cell magic:
1201
1203
1202 - In line mode you can time a single-line statement (though multiple
1204 - In line mode you can time a single-line statement (though multiple
1203 ones can be chained with using semicolons).
1205 ones can be chained with using semicolons).
1204
1206
1205 - In cell mode, you can time the cell body (a directly
1207 - In cell mode, you can time the cell body (a directly
1206 following statement raises an error).
1208 following statement raises an error).
1207
1209
1208 This function provides very basic timing functionality. Use the timeit
1210 This function provides very basic timing functionality. Use the timeit
1209 magic for more control over the measurement.
1211 magic for more control over the measurement.
1210
1212
1211 .. versionchanged:: 7.3
1213 .. versionchanged:: 7.3
1212 User variables are no longer expanded,
1214 User variables are no longer expanded,
1213 the magic line is always left unmodified.
1215 the magic line is always left unmodified.
1214
1216
1215 Examples
1217 Examples
1216 --------
1218 --------
1217 ::
1219 ::
1218
1220
1219 In [1]: %time 2**128
1221 In [1]: %time 2**128
1220 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1222 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1221 Wall time: 0.00
1223 Wall time: 0.00
1222 Out[1]: 340282366920938463463374607431768211456L
1224 Out[1]: 340282366920938463463374607431768211456L
1223
1225
1224 In [2]: n = 1000000
1226 In [2]: n = 1000000
1225
1227
1226 In [3]: %time sum(range(n))
1228 In [3]: %time sum(range(n))
1227 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1229 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1228 Wall time: 1.37
1230 Wall time: 1.37
1229 Out[3]: 499999500000L
1231 Out[3]: 499999500000L
1230
1232
1231 In [4]: %time print 'hello world'
1233 In [4]: %time print 'hello world'
1232 hello world
1234 hello world
1233 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1235 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1234 Wall time: 0.00
1236 Wall time: 0.00
1235
1237
1236 Note that the time needed by Python to compile the given expression
1238 Note that the time needed by Python to compile the given expression
1237 will be reported if it is more than 0.1s. In this example, the
1239 will be reported if it is more than 0.1s. In this example, the
1238 actual exponentiation is done by Python at compilation time, so while
1240 actual exponentiation is done by Python at compilation time, so while
1239 the expression can take a noticeable amount of time to compute, that
1241 the expression can take a noticeable amount of time to compute, that
1240 time is purely due to the compilation:
1242 time is purely due to the compilation:
1241
1243
1242 In [5]: %time 3**9999;
1244 In [5]: %time 3**9999;
1243 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1245 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1244 Wall time: 0.00 s
1246 Wall time: 0.00 s
1245
1247
1246 In [6]: %time 3**999999;
1248 In [6]: %time 3**999999;
1247 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1249 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1248 Wall time: 0.00 s
1250 Wall time: 0.00 s
1249 Compiler : 0.78 s
1251 Compiler : 0.78 s
1250 """
1252 """
1251
1253
1252 # fail immediately if the given expression can't be compiled
1254 # fail immediately if the given expression can't be compiled
1253
1255
1254 if line and cell:
1256 if line and cell:
1255 raise UsageError("Can't use statement directly after '%%time'!")
1257 raise UsageError("Can't use statement directly after '%%time'!")
1256
1258
1257 if cell:
1259 if cell:
1258 expr = self.shell.transform_cell(cell)
1260 expr = self.shell.transform_cell(cell)
1259 else:
1261 else:
1260 expr = self.shell.transform_cell(line)
1262 expr = self.shell.transform_cell(line)
1261
1263
1262 # Minimum time above which parse time will be reported
1264 # Minimum time above which parse time will be reported
1263 tp_min = 0.1
1265 tp_min = 0.1
1264
1266
1265 t0 = clock()
1267 t0 = clock()
1266 expr_ast = self.shell.compile.ast_parse(expr)
1268 expr_ast = self.shell.compile.ast_parse(expr)
1267 tp = clock()-t0
1269 tp = clock()-t0
1268
1270
1269 # Apply AST transformations
1271 # Apply AST transformations
1270 expr_ast = self.shell.transform_ast(expr_ast)
1272 expr_ast = self.shell.transform_ast(expr_ast)
1271
1273
1272 # Minimum time above which compilation time will be reported
1274 # Minimum time above which compilation time will be reported
1273 tc_min = 0.1
1275 tc_min = 0.1
1274
1276
1275 expr_val=None
1277 expr_val=None
1276 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1278 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1277 mode = 'eval'
1279 mode = 'eval'
1278 source = '<timed eval>'
1280 source = '<timed eval>'
1279 expr_ast = ast.Expression(expr_ast.body[0].value)
1281 expr_ast = ast.Expression(expr_ast.body[0].value)
1280 else:
1282 else:
1281 mode = 'exec'
1283 mode = 'exec'
1282 source = '<timed exec>'
1284 source = '<timed exec>'
1283 # multi-line %%time case
1285 # multi-line %%time case
1284 if len(expr_ast.body) > 1 and isinstance(expr_ast.body[-1], ast.Expr):
1286 if len(expr_ast.body) > 1 and isinstance(expr_ast.body[-1], ast.Expr):
1285 expr_val= expr_ast.body[-1]
1287 expr_val= expr_ast.body[-1]
1286 expr_ast = expr_ast.body[:-1]
1288 expr_ast = expr_ast.body[:-1]
1287 expr_ast = Module(expr_ast, [])
1289 expr_ast = Module(expr_ast, [])
1288 expr_val = ast.Expression(expr_val.value)
1290 expr_val = ast.Expression(expr_val.value)
1289
1291
1290 t0 = clock()
1292 t0 = clock()
1291 code = self.shell.compile(expr_ast, source, mode)
1293 code = self.shell.compile(expr_ast, source, mode)
1292 tc = clock()-t0
1294 tc = clock()-t0
1293
1295
1294 # skew measurement as little as possible
1296 # skew measurement as little as possible
1295 glob = self.shell.user_ns
1297 glob = self.shell.user_ns
1296 wtime = time.time
1298 wtime = time.time
1297 # time execution
1299 # time execution
1298 wall_st = wtime()
1300 wall_st = wtime()
1299 if mode=='eval':
1301 if mode=='eval':
1300 st = clock2()
1302 st = clock2()
1301 try:
1303 try:
1302 out = eval(code, glob, local_ns)
1304 out = eval(code, glob, local_ns)
1303 except:
1305 except:
1304 self.shell.showtraceback()
1306 self.shell.showtraceback()
1305 return
1307 return
1306 end = clock2()
1308 end = clock2()
1307 else:
1309 else:
1308 st = clock2()
1310 st = clock2()
1309 try:
1311 try:
1310 exec(code, glob, local_ns)
1312 exec(code, glob, local_ns)
1311 out=None
1313 out=None
1312 # multi-line %%time case
1314 # multi-line %%time case
1313 if expr_val is not None:
1315 if expr_val is not None:
1314 code_2 = self.shell.compile(expr_val, source, 'eval')
1316 code_2 = self.shell.compile(expr_val, source, 'eval')
1315 out = eval(code_2, glob, local_ns)
1317 out = eval(code_2, glob, local_ns)
1316 except:
1318 except:
1317 self.shell.showtraceback()
1319 self.shell.showtraceback()
1318 return
1320 return
1319 end = clock2()
1321 end = clock2()
1320
1322
1321 wall_end = wtime()
1323 wall_end = wtime()
1322 # Compute actual times and report
1324 # Compute actual times and report
1323 wall_time = wall_end-wall_st
1325 wall_time = wall_end-wall_st
1324 cpu_user = end[0]-st[0]
1326 cpu_user = end[0]-st[0]
1325 cpu_sys = end[1]-st[1]
1327 cpu_sys = end[1]-st[1]
1326 cpu_tot = cpu_user+cpu_sys
1328 cpu_tot = cpu_user+cpu_sys
1327 # On windows cpu_sys is always zero, so no new information to the next print
1329 # On windows cpu_sys is always zero, so no new information to the next print
1328 if sys.platform != 'win32':
1330 if sys.platform != 'win32':
1329 print("CPU times: user %s, sys: %s, total: %s" % \
1331 print("CPU times: user %s, sys: %s, total: %s" % \
1330 (_format_time(cpu_user),_format_time(cpu_sys),_format_time(cpu_tot)))
1332 (_format_time(cpu_user),_format_time(cpu_sys),_format_time(cpu_tot)))
1331 print("Wall time: %s" % _format_time(wall_time))
1333 print("Wall time: %s" % _format_time(wall_time))
1332 if tc > tc_min:
1334 if tc > tc_min:
1333 print("Compiler : %s" % _format_time(tc))
1335 print("Compiler : %s" % _format_time(tc))
1334 if tp > tp_min:
1336 if tp > tp_min:
1335 print("Parser : %s" % _format_time(tp))
1337 print("Parser : %s" % _format_time(tp))
1336 return out
1338 return out
1337
1339
1338 @skip_doctest
1340 @skip_doctest
1339 @line_magic
1341 @line_magic
1340 def macro(self, parameter_s=''):
1342 def macro(self, parameter_s=''):
1341 """Define a macro for future re-execution. It accepts ranges of history,
1343 """Define a macro for future re-execution. It accepts ranges of history,
1342 filenames or string objects.
1344 filenames or string objects.
1343
1345
1344 Usage:\\
1346 Usage:\\
1345 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1347 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1346
1348
1347 Options:
1349 Options:
1348
1350
1349 -r: use 'raw' input. By default, the 'processed' history is used,
1351 -r: use 'raw' input. By default, the 'processed' history is used,
1350 so that magics are loaded in their transformed version to valid
1352 so that magics are loaded in their transformed version to valid
1351 Python. If this option is given, the raw input as typed at the
1353 Python. If this option is given, the raw input as typed at the
1352 command line is used instead.
1354 command line is used instead.
1353
1355
1354 -q: quiet macro definition. By default, a tag line is printed
1356 -q: quiet macro definition. By default, a tag line is printed
1355 to indicate the macro has been created, and then the contents of
1357 to indicate the macro has been created, and then the contents of
1356 the macro are printed. If this option is given, then no printout
1358 the macro are printed. If this option is given, then no printout
1357 is produced once the macro is created.
1359 is produced once the macro is created.
1358
1360
1359 This will define a global variable called `name` which is a string
1361 This will define a global variable called `name` which is a string
1360 made of joining the slices and lines you specify (n1,n2,... numbers
1362 made of joining the slices and lines you specify (n1,n2,... numbers
1361 above) from your input history into a single string. This variable
1363 above) from your input history into a single string. This variable
1362 acts like an automatic function which re-executes those lines as if
1364 acts like an automatic function which re-executes those lines as if
1363 you had typed them. You just type 'name' at the prompt and the code
1365 you had typed them. You just type 'name' at the prompt and the code
1364 executes.
1366 executes.
1365
1367
1366 The syntax for indicating input ranges is described in %history.
1368 The syntax for indicating input ranges is described in %history.
1367
1369
1368 Note: as a 'hidden' feature, you can also use traditional python slice
1370 Note: as a 'hidden' feature, you can also use traditional python slice
1369 notation, where N:M means numbers N through M-1.
1371 notation, where N:M means numbers N through M-1.
1370
1372
1371 For example, if your history contains (print using %hist -n )::
1373 For example, if your history contains (print using %hist -n )::
1372
1374
1373 44: x=1
1375 44: x=1
1374 45: y=3
1376 45: y=3
1375 46: z=x+y
1377 46: z=x+y
1376 47: print x
1378 47: print x
1377 48: a=5
1379 48: a=5
1378 49: print 'x',x,'y',y
1380 49: print 'x',x,'y',y
1379
1381
1380 you can create a macro with lines 44 through 47 (included) and line 49
1382 you can create a macro with lines 44 through 47 (included) and line 49
1381 called my_macro with::
1383 called my_macro with::
1382
1384
1383 In [55]: %macro my_macro 44-47 49
1385 In [55]: %macro my_macro 44-47 49
1384
1386
1385 Now, typing `my_macro` (without quotes) will re-execute all this code
1387 Now, typing `my_macro` (without quotes) will re-execute all this code
1386 in one pass.
1388 in one pass.
1387
1389
1388 You don't need to give the line-numbers in order, and any given line
1390 You don't need to give the line-numbers in order, and any given line
1389 number can appear multiple times. You can assemble macros with any
1391 number can appear multiple times. You can assemble macros with any
1390 lines from your input history in any order.
1392 lines from your input history in any order.
1391
1393
1392 The macro is a simple object which holds its value in an attribute,
1394 The macro is a simple object which holds its value in an attribute,
1393 but IPython's display system checks for macros and executes them as
1395 but IPython's display system checks for macros and executes them as
1394 code instead of printing them when you type their name.
1396 code instead of printing them when you type their name.
1395
1397
1396 You can view a macro's contents by explicitly printing it with::
1398 You can view a macro's contents by explicitly printing it with::
1397
1399
1398 print macro_name
1400 print macro_name
1399
1401
1400 """
1402 """
1401 opts,args = self.parse_options(parameter_s,'rq',mode='list')
1403 opts,args = self.parse_options(parameter_s,'rq',mode='list')
1402 if not args: # List existing macros
1404 if not args: # List existing macros
1403 return sorted(k for k,v in self.shell.user_ns.items() if isinstance(v, Macro))
1405 return sorted(k for k,v in self.shell.user_ns.items() if isinstance(v, Macro))
1404 if len(args) == 1:
1406 if len(args) == 1:
1405 raise UsageError(
1407 raise UsageError(
1406 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1408 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1407 name, codefrom = args[0], " ".join(args[1:])
1409 name, codefrom = args[0], " ".join(args[1:])
1408
1410
1409 #print 'rng',ranges # dbg
1411 #print 'rng',ranges # dbg
1410 try:
1412 try:
1411 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1413 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1412 except (ValueError, TypeError) as e:
1414 except (ValueError, TypeError) as e:
1413 print(e.args[0])
1415 print(e.args[0])
1414 return
1416 return
1415 macro = Macro(lines)
1417 macro = Macro(lines)
1416 self.shell.define_macro(name, macro)
1418 self.shell.define_macro(name, macro)
1417 if not ( 'q' in opts) :
1419 if not ( 'q' in opts) :
1418 print('Macro `%s` created. To execute, type its name (without quotes).' % name)
1420 print('Macro `%s` created. To execute, type its name (without quotes).' % name)
1419 print('=== Macro contents: ===')
1421 print('=== Macro contents: ===')
1420 print(macro, end=' ')
1422 print(macro, end=' ')
1421
1423
1422 @magic_arguments.magic_arguments()
1424 @magic_arguments.magic_arguments()
1423 @magic_arguments.argument('output', type=str, default='', nargs='?',
1425 @magic_arguments.argument('output', type=str, default='', nargs='?',
1424 help="""The name of the variable in which to store output.
1426 help="""The name of the variable in which to store output.
1425 This is a utils.io.CapturedIO object with stdout/err attributes
1427 This is a utils.io.CapturedIO object with stdout/err attributes
1426 for the text of the captured output.
1428 for the text of the captured output.
1427
1429
1428 CapturedOutput also has a show() method for displaying the output,
1430 CapturedOutput also has a show() method for displaying the output,
1429 and __call__ as well, so you can use that to quickly display the
1431 and __call__ as well, so you can use that to quickly display the
1430 output.
1432 output.
1431
1433
1432 If unspecified, captured output is discarded.
1434 If unspecified, captured output is discarded.
1433 """
1435 """
1434 )
1436 )
1435 @magic_arguments.argument('--no-stderr', action="store_true",
1437 @magic_arguments.argument('--no-stderr', action="store_true",
1436 help="""Don't capture stderr."""
1438 help="""Don't capture stderr."""
1437 )
1439 )
1438 @magic_arguments.argument('--no-stdout', action="store_true",
1440 @magic_arguments.argument('--no-stdout', action="store_true",
1439 help="""Don't capture stdout."""
1441 help="""Don't capture stdout."""
1440 )
1442 )
1441 @magic_arguments.argument('--no-display', action="store_true",
1443 @magic_arguments.argument('--no-display', action="store_true",
1442 help="""Don't capture IPython's rich display."""
1444 help="""Don't capture IPython's rich display."""
1443 )
1445 )
1444 @cell_magic
1446 @cell_magic
1445 def capture(self, line, cell):
1447 def capture(self, line, cell):
1446 """run the cell, capturing stdout, stderr, and IPython's rich display() calls."""
1448 """run the cell, capturing stdout, stderr, and IPython's rich display() calls."""
1447 args = magic_arguments.parse_argstring(self.capture, line)
1449 args = magic_arguments.parse_argstring(self.capture, line)
1448 out = not args.no_stdout
1450 out = not args.no_stdout
1449 err = not args.no_stderr
1451 err = not args.no_stderr
1450 disp = not args.no_display
1452 disp = not args.no_display
1451 with capture_output(out, err, disp) as io:
1453 with capture_output(out, err, disp) as io:
1452 self.shell.run_cell(cell)
1454 self.shell.run_cell(cell)
1453 if args.output:
1455 if args.output:
1454 self.shell.user_ns[args.output] = io
1456 self.shell.user_ns[args.output] = io
1455
1457
1456 def parse_breakpoint(text, current_file):
1458 def parse_breakpoint(text, current_file):
1457 '''Returns (file, line) for file:line and (current_file, line) for line'''
1459 '''Returns (file, line) for file:line and (current_file, line) for line'''
1458 colon = text.find(':')
1460 colon = text.find(':')
1459 if colon == -1:
1461 if colon == -1:
1460 return current_file, int(text)
1462 return current_file, int(text)
1461 else:
1463 else:
1462 return text[:colon], int(text[colon+1:])
1464 return text[:colon], int(text[colon+1:])
1463
1465
1464 def _format_time(timespan, precision=3):
1466 def _format_time(timespan, precision=3):
1465 """Formats the timespan in a human readable form"""
1467 """Formats the timespan in a human readable form"""
1466
1468
1467 if timespan >= 60.0:
1469 if timespan >= 60.0:
1468 # we have more than a minute, format that in a human readable form
1470 # we have more than a minute, format that in a human readable form
1469 # Idea from http://snipplr.com/view/5713/
1471 # Idea from http://snipplr.com/view/5713/
1470 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1472 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1471 time = []
1473 time = []
1472 leftover = timespan
1474 leftover = timespan
1473 for suffix, length in parts:
1475 for suffix, length in parts:
1474 value = int(leftover / length)
1476 value = int(leftover / length)
1475 if value > 0:
1477 if value > 0:
1476 leftover = leftover % length
1478 leftover = leftover % length
1477 time.append(u'%s%s' % (str(value), suffix))
1479 time.append(u'%s%s' % (str(value), suffix))
1478 if leftover < 1:
1480 if leftover < 1:
1479 break
1481 break
1480 return " ".join(time)
1482 return " ".join(time)
1481
1483
1482
1484
1483 # Unfortunately the unicode 'micro' symbol can cause problems in
1485 # Unfortunately the unicode 'micro' symbol can cause problems in
1484 # certain terminals.
1486 # certain terminals.
1485 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1487 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1486 # Try to prevent crashes by being more secure than it needs to
1488 # Try to prevent crashes by being more secure than it needs to
1487 # E.g. eclipse is able to print a µ, but has no sys.stdout.encoding set.
1489 # E.g. eclipse is able to print a µ, but has no sys.stdout.encoding set.
1488 units = [u"s", u"ms",u'us',"ns"] # the save value
1490 units = [u"s", u"ms",u'us',"ns"] # the save value
1489 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1491 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1490 try:
1492 try:
1491 u'\xb5'.encode(sys.stdout.encoding)
1493 u'\xb5'.encode(sys.stdout.encoding)
1492 units = [u"s", u"ms",u'\xb5s',"ns"]
1494 units = [u"s", u"ms",u'\xb5s',"ns"]
1493 except:
1495 except:
1494 pass
1496 pass
1495 scaling = [1, 1e3, 1e6, 1e9]
1497 scaling = [1, 1e3, 1e6, 1e9]
1496
1498
1497 if timespan > 0.0:
1499 if timespan > 0.0:
1498 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1500 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1499 else:
1501 else:
1500 order = 3
1502 order = 3
1501 return u"%.*g %s" % (precision, timespan * scaling[order], units[order])
1503 return u"%.*g %s" % (precision, timespan * scaling[order], units[order])
General Comments 0
You need to be logged in to leave comments. Login now