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