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