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