##// END OF EJS Templates
Remove usage of prompt_manager
Thomas Kluyver -
Show More
@@ -1,3228 +1,3225 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Main IPython class."""
2 """Main IPython class."""
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 # Copyright (C) 2008-2011 The IPython Development Team
7 # Copyright (C) 2008-2011 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 from __future__ import absolute_import, print_function
13 from __future__ import absolute_import, print_function
14
14
15 import __future__
15 import __future__
16 import abc
16 import abc
17 import ast
17 import ast
18 import atexit
18 import atexit
19 import functools
19 import functools
20 import os
20 import os
21 import re
21 import re
22 import runpy
22 import runpy
23 import sys
23 import sys
24 import tempfile
24 import tempfile
25 import traceback
25 import traceback
26 import types
26 import types
27 import subprocess
27 import subprocess
28 import warnings
28 import warnings
29 from io import open as io_open
29 from io import open as io_open
30
30
31 from pickleshare import PickleShareDB
31 from pickleshare import PickleShareDB
32
32
33 from traitlets.config.configurable import SingletonConfigurable
33 from traitlets.config.configurable import SingletonConfigurable
34 from IPython.core import oinspect
34 from IPython.core import oinspect
35 from IPython.core import magic
35 from IPython.core import magic
36 from IPython.core import page
36 from IPython.core import page
37 from IPython.core import prefilter
37 from IPython.core import prefilter
38 from IPython.core import shadowns
38 from IPython.core import shadowns
39 from IPython.core import ultratb
39 from IPython.core import ultratb
40 from IPython.core.alias import Alias, AliasManager
40 from IPython.core.alias import Alias, AliasManager
41 from IPython.core.autocall import ExitAutocall
41 from IPython.core.autocall import ExitAutocall
42 from IPython.core.builtin_trap import BuiltinTrap
42 from IPython.core.builtin_trap import BuiltinTrap
43 from IPython.core.events import EventManager, available_events
43 from IPython.core.events import EventManager, available_events
44 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
44 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
45 from IPython.core.debugger import Pdb
45 from IPython.core.debugger import Pdb
46 from IPython.core.display_trap import DisplayTrap
46 from IPython.core.display_trap import DisplayTrap
47 from IPython.core.displayhook import DisplayHook
47 from IPython.core.displayhook import DisplayHook
48 from IPython.core.displaypub import DisplayPublisher
48 from IPython.core.displaypub import DisplayPublisher
49 from IPython.core.error import InputRejected, UsageError
49 from IPython.core.error import InputRejected, UsageError
50 from IPython.core.extensions import ExtensionManager
50 from IPython.core.extensions import ExtensionManager
51 from IPython.core.formatters import DisplayFormatter
51 from IPython.core.formatters import DisplayFormatter
52 from IPython.core.history import HistoryManager
52 from IPython.core.history import HistoryManager
53 from IPython.core.inputsplitter import ESC_MAGIC, ESC_MAGIC2
53 from IPython.core.inputsplitter import ESC_MAGIC, ESC_MAGIC2
54 from IPython.core.logger import Logger
54 from IPython.core.logger import Logger
55 from IPython.core.macro import Macro
55 from IPython.core.macro import Macro
56 from IPython.core.payload import PayloadManager
56 from IPython.core.payload import PayloadManager
57 from IPython.core.prefilter import PrefilterManager
57 from IPython.core.prefilter import PrefilterManager
58 from IPython.core.profiledir import ProfileDir
58 from IPython.core.profiledir import ProfileDir
59 from IPython.core.prompts import PromptManager
60 from IPython.core.usage import default_banner
59 from IPython.core.usage import default_banner
61 from IPython.testing.skipdoctest import skip_doctest_py2, skip_doctest
60 from IPython.testing.skipdoctest import skip_doctest_py2, skip_doctest
62 from IPython.utils import PyColorize
61 from IPython.utils import PyColorize
63 from IPython.utils import io
62 from IPython.utils import io
64 from IPython.utils import py3compat
63 from IPython.utils import py3compat
65 from IPython.utils import openpy
64 from IPython.utils import openpy
66 from IPython.utils.contexts import NoOpContext
65 from IPython.utils.contexts import NoOpContext
67 from IPython.utils.decorators import undoc
66 from IPython.utils.decorators import undoc
68 from IPython.utils.io import ask_yes_no
67 from IPython.utils.io import ask_yes_no
69 from IPython.utils.ipstruct import Struct
68 from IPython.utils.ipstruct import Struct
70 from IPython.paths import get_ipython_dir
69 from IPython.paths import get_ipython_dir
71 from IPython.utils.path import get_home_dir, get_py_filename, unquote_filename, ensure_dir_exists
70 from IPython.utils.path import get_home_dir, get_py_filename, unquote_filename, ensure_dir_exists
72 from IPython.utils.process import system, getoutput
71 from IPython.utils.process import system, getoutput
73 from IPython.utils.py3compat import (builtin_mod, unicode_type, string_types,
72 from IPython.utils.py3compat import (builtin_mod, unicode_type, string_types,
74 with_metaclass, iteritems)
73 with_metaclass, iteritems)
75 from IPython.utils.strdispatch import StrDispatch
74 from IPython.utils.strdispatch import StrDispatch
76 from IPython.utils.syspathcontext import prepended_to_syspath
75 from IPython.utils.syspathcontext import prepended_to_syspath
77 from IPython.utils.text import (format_screen, LSString, SList,
76 from IPython.utils.text import (format_screen, LSString, SList,
78 DollarFormatter)
77 DollarFormatter)
79 from traitlets import (
78 from traitlets import (
80 Integer, Bool, CaselessStrEnum, Enum, List, Dict, Unicode, Instance, Type,
79 Integer, Bool, CaselessStrEnum, Enum, List, Dict, Unicode, Instance, Type,
81 observe, default,
80 observe, default,
82 )
81 )
83 from warnings import warn
82 from warnings import warn
84 from logging import error
83 from logging import error
85 import IPython.core.hooks
84 import IPython.core.hooks
86
85
87 #-----------------------------------------------------------------------------
86 #-----------------------------------------------------------------------------
88 # Globals
87 # Globals
89 #-----------------------------------------------------------------------------
88 #-----------------------------------------------------------------------------
90
89
91 # compiled regexps for autoindent management
90 # compiled regexps for autoindent management
92 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
91 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
93
92
94 #-----------------------------------------------------------------------------
93 #-----------------------------------------------------------------------------
95 # Utilities
94 # Utilities
96 #-----------------------------------------------------------------------------
95 #-----------------------------------------------------------------------------
97
96
98 @undoc
97 @undoc
99 def softspace(file, newvalue):
98 def softspace(file, newvalue):
100 """Copied from code.py, to remove the dependency"""
99 """Copied from code.py, to remove the dependency"""
101
100
102 oldvalue = 0
101 oldvalue = 0
103 try:
102 try:
104 oldvalue = file.softspace
103 oldvalue = file.softspace
105 except AttributeError:
104 except AttributeError:
106 pass
105 pass
107 try:
106 try:
108 file.softspace = newvalue
107 file.softspace = newvalue
109 except (AttributeError, TypeError):
108 except (AttributeError, TypeError):
110 # "attribute-less object" or "read-only attributes"
109 # "attribute-less object" or "read-only attributes"
111 pass
110 pass
112 return oldvalue
111 return oldvalue
113
112
114 @undoc
113 @undoc
115 def no_op(*a, **kw): pass
114 def no_op(*a, **kw): pass
116
115
117
116
118 class SpaceInInput(Exception): pass
117 class SpaceInInput(Exception): pass
119
118
120
119
121 def get_default_colors():
120 def get_default_colors():
122 if sys.platform=='darwin':
121 if sys.platform=='darwin':
123 return "LightBG"
122 return "LightBG"
124 elif os.name=='nt':
123 elif os.name=='nt':
125 return 'Linux'
124 return 'Linux'
126 else:
125 else:
127 return 'Linux'
126 return 'Linux'
128
127
129
128
130 class SeparateUnicode(Unicode):
129 class SeparateUnicode(Unicode):
131 r"""A Unicode subclass to validate separate_in, separate_out, etc.
130 r"""A Unicode subclass to validate separate_in, separate_out, etc.
132
131
133 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
132 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
134 """
133 """
135
134
136 def validate(self, obj, value):
135 def validate(self, obj, value):
137 if value == '0': value = ''
136 if value == '0': value = ''
138 value = value.replace('\\n','\n')
137 value = value.replace('\\n','\n')
139 return super(SeparateUnicode, self).validate(obj, value)
138 return super(SeparateUnicode, self).validate(obj, value)
140
139
141
140
142 @undoc
141 @undoc
143 class DummyMod(object):
142 class DummyMod(object):
144 """A dummy module used for IPython's interactive module when
143 """A dummy module used for IPython's interactive module when
145 a namespace must be assigned to the module's __dict__."""
144 a namespace must be assigned to the module's __dict__."""
146 pass
145 pass
147
146
148
147
149 class ExecutionResult(object):
148 class ExecutionResult(object):
150 """The result of a call to :meth:`InteractiveShell.run_cell`
149 """The result of a call to :meth:`InteractiveShell.run_cell`
151
150
152 Stores information about what took place.
151 Stores information about what took place.
153 """
152 """
154 execution_count = None
153 execution_count = None
155 error_before_exec = None
154 error_before_exec = None
156 error_in_exec = None
155 error_in_exec = None
157 result = None
156 result = None
158
157
159 @property
158 @property
160 def success(self):
159 def success(self):
161 return (self.error_before_exec is None) and (self.error_in_exec is None)
160 return (self.error_before_exec is None) and (self.error_in_exec is None)
162
161
163 def raise_error(self):
162 def raise_error(self):
164 """Reraises error if `success` is `False`, otherwise does nothing"""
163 """Reraises error if `success` is `False`, otherwise does nothing"""
165 if self.error_before_exec is not None:
164 if self.error_before_exec is not None:
166 raise self.error_before_exec
165 raise self.error_before_exec
167 if self.error_in_exec is not None:
166 if self.error_in_exec is not None:
168 raise self.error_in_exec
167 raise self.error_in_exec
169
168
170
169
171 class InteractiveShell(SingletonConfigurable):
170 class InteractiveShell(SingletonConfigurable):
172 """An enhanced, interactive shell for Python."""
171 """An enhanced, interactive shell for Python."""
173
172
174 _instance = None
173 _instance = None
175
174
176 ast_transformers = List([], help=
175 ast_transformers = List([], help=
177 """
176 """
178 A list of ast.NodeTransformer subclass instances, which will be applied
177 A list of ast.NodeTransformer subclass instances, which will be applied
179 to user input before code is run.
178 to user input before code is run.
180 """
179 """
181 ).tag(config=True)
180 ).tag(config=True)
182
181
183 autocall = Enum((0,1,2), default_value=0, help=
182 autocall = Enum((0,1,2), default_value=0, help=
184 """
183 """
185 Make IPython automatically call any callable object even if you didn't
184 Make IPython automatically call any callable object even if you didn't
186 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
185 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
187 automatically. The value can be '0' to disable the feature, '1' for
186 automatically. The value can be '0' to disable the feature, '1' for
188 'smart' autocall, where it is not applied if there are no more
187 'smart' autocall, where it is not applied if there are no more
189 arguments on the line, and '2' for 'full' autocall, where all callable
188 arguments on the line, and '2' for 'full' autocall, where all callable
190 objects are automatically called (even if no arguments are present).
189 objects are automatically called (even if no arguments are present).
191 """
190 """
192 ).tag(config=True)
191 ).tag(config=True)
193 # TODO: remove all autoindent logic and put into frontends.
192 # TODO: remove all autoindent logic and put into frontends.
194 # We can't do this yet because even runlines uses the autoindent.
193 # We can't do this yet because even runlines uses the autoindent.
195 autoindent = Bool(True, help=
194 autoindent = Bool(True, help=
196 """
195 """
197 Autoindent IPython code entered interactively.
196 Autoindent IPython code entered interactively.
198 """
197 """
199 ).tag(config=True)
198 ).tag(config=True)
200 automagic = Bool(True, help=
199 automagic = Bool(True, help=
201 """
200 """
202 Enable magic commands to be called without the leading %.
201 Enable magic commands to be called without the leading %.
203 """
202 """
204 ).tag(config=True)
203 ).tag(config=True)
205
204
206 banner1 = Unicode(default_banner,
205 banner1 = Unicode(default_banner,
207 help="""The part of the banner to be printed before the profile"""
206 help="""The part of the banner to be printed before the profile"""
208 ).tag(config=True)
207 ).tag(config=True)
209 banner2 = Unicode('',
208 banner2 = Unicode('',
210 help="""The part of the banner to be printed after the profile"""
209 help="""The part of the banner to be printed after the profile"""
211 ).tag(config=True)
210 ).tag(config=True)
212
211
213 cache_size = Integer(1000, help=
212 cache_size = Integer(1000, help=
214 """
213 """
215 Set the size of the output cache. The default is 1000, you can
214 Set the size of the output cache. The default is 1000, you can
216 change it permanently in your config file. Setting it to 0 completely
215 change it permanently in your config file. Setting it to 0 completely
217 disables the caching system, and the minimum value accepted is 20 (if
216 disables the caching system, and the minimum value accepted is 20 (if
218 you provide a value less than 20, it is reset to 0 and a warning is
217 you provide a value less than 20, it is reset to 0 and a warning is
219 issued). This limit is defined because otherwise you'll spend more
218 issued). This limit is defined because otherwise you'll spend more
220 time re-flushing a too small cache than working
219 time re-flushing a too small cache than working
221 """
220 """
222 ).tag(config=True)
221 ).tag(config=True)
223 color_info = Bool(True, help=
222 color_info = Bool(True, help=
224 """
223 """
225 Use colors for displaying information about objects. Because this
224 Use colors for displaying information about objects. Because this
226 information is passed through a pager (like 'less'), and some pagers
225 information is passed through a pager (like 'less'), and some pagers
227 get confused with color codes, this capability can be turned off.
226 get confused with color codes, this capability can be turned off.
228 """
227 """
229 ).tag(config=True)
228 ).tag(config=True)
230 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
229 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
231 default_value=get_default_colors(),
230 default_value=get_default_colors(),
232 help="Set the color scheme (NoColor, Linux, or LightBG)."
231 help="Set the color scheme (NoColor, Linux, or LightBG)."
233 ).tag(config=True)
232 ).tag(config=True)
234 colors_force = Bool(False, help=
233 colors_force = Bool(False, help=
235 """
234 """
236 Force use of ANSI color codes, regardless of OS and readline
235 Force use of ANSI color codes, regardless of OS and readline
237 availability.
236 availability.
238 """
237 """
239 # FIXME: This is essentially a hack to allow ZMQShell to show colors
238 # FIXME: This is essentially a hack to allow ZMQShell to show colors
240 # without readline on Win32. When the ZMQ formatting system is
239 # without readline on Win32. When the ZMQ formatting system is
241 # refactored, this should be removed.
240 # refactored, this should be removed.
242 )
241 )
243 debug = Bool(False).tag(config=True)
242 debug = Bool(False).tag(config=True)
244 deep_reload = Bool(False, help=
243 deep_reload = Bool(False, help=
245 """
244 """
246 **Deprecated**
245 **Deprecated**
247
246
248 Will be removed in IPython 6.0
247 Will be removed in IPython 6.0
249
248
250 Enable deep (recursive) reloading by default. IPython can use the
249 Enable deep (recursive) reloading by default. IPython can use the
251 deep_reload module which reloads changes in modules recursively (it
250 deep_reload module which reloads changes in modules recursively (it
252 replaces the reload() function, so you don't need to change anything to
251 replaces the reload() function, so you don't need to change anything to
253 use it). `deep_reload` forces a full reload of modules whose code may
252 use it). `deep_reload` forces a full reload of modules whose code may
254 have changed, which the default reload() function does not. When
253 have changed, which the default reload() function does not. When
255 deep_reload is off, IPython will use the normal reload(), but
254 deep_reload is off, IPython will use the normal reload(), but
256 deep_reload will still be available as dreload().
255 deep_reload will still be available as dreload().
257 """
256 """
258 ).tag(config=True)
257 ).tag(config=True)
259 disable_failing_post_execute = Bool(False,
258 disable_failing_post_execute = Bool(False,
260 help="Don't call post-execute functions that have failed in the past."
259 help="Don't call post-execute functions that have failed in the past."
261 ).tag(config=True)
260 ).tag(config=True)
262 display_formatter = Instance(DisplayFormatter, allow_none=True)
261 display_formatter = Instance(DisplayFormatter, allow_none=True)
263 displayhook_class = Type(DisplayHook)
262 displayhook_class = Type(DisplayHook)
264 display_pub_class = Type(DisplayPublisher)
263 display_pub_class = Type(DisplayPublisher)
265 data_pub_class = None
264 data_pub_class = None
266
265
267 exit_now = Bool(False)
266 exit_now = Bool(False)
268 exiter = Instance(ExitAutocall)
267 exiter = Instance(ExitAutocall)
269 @default('exiter')
268 @default('exiter')
270 def _exiter_default(self):
269 def _exiter_default(self):
271 return ExitAutocall(self)
270 return ExitAutocall(self)
272 # Monotonically increasing execution counter
271 # Monotonically increasing execution counter
273 execution_count = Integer(1)
272 execution_count = Integer(1)
274 filename = Unicode("<ipython console>")
273 filename = Unicode("<ipython console>")
275 ipython_dir= Unicode('').tag(config=True) # Set to get_ipython_dir() in __init__
274 ipython_dir= Unicode('').tag(config=True) # Set to get_ipython_dir() in __init__
276
275
277 # Input splitter, to transform input line by line and detect when a block
276 # Input splitter, to transform input line by line and detect when a block
278 # is ready to be executed.
277 # is ready to be executed.
279 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
278 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
280 (), {'line_input_checker': True})
279 (), {'line_input_checker': True})
281
280
282 # This InputSplitter instance is used to transform completed cells before
281 # This InputSplitter instance is used to transform completed cells before
283 # running them. It allows cell magics to contain blank lines.
282 # running them. It allows cell magics to contain blank lines.
284 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
283 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
285 (), {'line_input_checker': False})
284 (), {'line_input_checker': False})
286
285
287 logstart = Bool(False, help=
286 logstart = Bool(False, help=
288 """
287 """
289 Start logging to the default log file in overwrite mode.
288 Start logging to the default log file in overwrite mode.
290 Use `logappend` to specify a log file to **append** logs to.
289 Use `logappend` to specify a log file to **append** logs to.
291 """
290 """
292 ).tag(config=True)
291 ).tag(config=True)
293 logfile = Unicode('', help=
292 logfile = Unicode('', help=
294 """
293 """
295 The name of the logfile to use.
294 The name of the logfile to use.
296 """
295 """
297 ).tag(config=True)
296 ).tag(config=True)
298 logappend = Unicode('', help=
297 logappend = Unicode('', help=
299 """
298 """
300 Start logging to the given file in append mode.
299 Start logging to the given file in append mode.
301 Use `logfile` to specify a log file to **overwrite** logs to.
300 Use `logfile` to specify a log file to **overwrite** logs to.
302 """
301 """
303 ).tag(config=True)
302 ).tag(config=True)
304 object_info_string_level = Enum((0,1,2), default_value=0,
303 object_info_string_level = Enum((0,1,2), default_value=0,
305 ).tag(config=True)
304 ).tag(config=True)
306 pdb = Bool(False, help=
305 pdb = Bool(False, help=
307 """
306 """
308 Automatically call the pdb debugger after every exception.
307 Automatically call the pdb debugger after every exception.
309 """
308 """
310 ).tag(config=True)
309 ).tag(config=True)
311 multiline_history = Bool(sys.platform != 'win32',
310 multiline_history = Bool(sys.platform != 'win32',
312 help="Save multi-line entries as one entry in readline history"
311 help="Save multi-line entries as one entry in readline history"
313 ).tag(config=True)
312 ).tag(config=True)
314 display_page = Bool(False,
313 display_page = Bool(False,
315 help="""If True, anything that would be passed to the pager
314 help="""If True, anything that would be passed to the pager
316 will be displayed as regular output instead."""
315 will be displayed as regular output instead."""
317 ).tag(config=True)
316 ).tag(config=True)
318
317
319 # deprecated prompt traits:
318 # deprecated prompt traits:
320
319
321 prompt_in1 = Unicode('In [\\#]: ',
320 prompt_in1 = Unicode('In [\\#]: ',
322 help="Deprecated, will be removed in IPython 5.0, use PromptManager.in_template"
321 help="Deprecated, will be removed in IPython 5.0, use PromptManager.in_template"
323 ).tag(config=True)
322 ).tag(config=True)
324 prompt_in2 = Unicode(' .\\D.: ',
323 prompt_in2 = Unicode(' .\\D.: ',
325 help="Deprecated, will be removed in IPython 5.0, use PromptManager.in2_template"
324 help="Deprecated, will be removed in IPython 5.0, use PromptManager.in2_template"
326 ).tag(config=True)
325 ).tag(config=True)
327 prompt_out = Unicode('Out[\\#]: ',
326 prompt_out = Unicode('Out[\\#]: ',
328 help="Deprecated, will be removed in IPython 5.0, use PromptManager.out_template"
327 help="Deprecated, will be removed in IPython 5.0, use PromptManager.out_template"
329 ).tag(config=True)
328 ).tag(config=True)
330 prompts_pad_left = Bool(True,
329 prompts_pad_left = Bool(True,
331 help="Deprecated, will be removed in IPython 5.0, use PromptManager.justify"
330 help="Deprecated, will be removed in IPython 5.0, use PromptManager.justify"
332 ).tag(config=True)
331 ).tag(config=True)
333
332
334 @observe('prompt_in1', 'prompt_in2', 'prompt_out', 'prompt_pad_left')
333 @observe('prompt_in1', 'prompt_in2', 'prompt_out', 'prompt_pad_left')
335 def _prompt_trait_changed(self, change):
334 def _prompt_trait_changed(self, change):
336 table = {
335 table = {
337 'prompt_in1' : 'in_template',
336 'prompt_in1' : 'in_template',
338 'prompt_in2' : 'in2_template',
337 'prompt_in2' : 'in2_template',
339 'prompt_out' : 'out_template',
338 'prompt_out' : 'out_template',
340 'prompts_pad_left' : 'justify',
339 'prompts_pad_left' : 'justify',
341 }
340 }
342 name = change['name']
341 name = change['name']
343 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
342 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
344 name=name, newname=table[name])
343 name=name, newname=table[name])
345 )
344 )
346 # protect against weird cases where self.config may not exist:
345 # protect against weird cases where self.config may not exist:
347 if self.config is not None:
346 if self.config is not None:
348 # propagate to corresponding PromptManager trait
347 # propagate to corresponding PromptManager trait
349 setattr(self.config.PromptManager, table[name], change['new'])
348 setattr(self.config.PromptManager, table[name], change['new'])
350
349
351 show_rewritten_input = Bool(True,
350 show_rewritten_input = Bool(True,
352 help="Show rewritten input, e.g. for autocall."
351 help="Show rewritten input, e.g. for autocall."
353 ).tag(config=True)
352 ).tag(config=True)
354
353
355 quiet = Bool(False).tag(config=True)
354 quiet = Bool(False).tag(config=True)
356
355
357 history_length = Integer(10000,
356 history_length = Integer(10000,
358 help='Total length of command history'
357 help='Total length of command history'
359 ).tag(config=True)
358 ).tag(config=True)
360
359
361 history_load_length = Integer(1000, help=
360 history_load_length = Integer(1000, help=
362 """
361 """
363 The number of saved history entries to be loaded
362 The number of saved history entries to be loaded
364 into the readline buffer at startup.
363 into the readline buffer at startup.
365 """
364 """
366 ).tag(config=True)
365 ).tag(config=True)
367
366
368 # The readline stuff will eventually be moved to the terminal subclass
367 # The readline stuff will eventually be moved to the terminal subclass
369 # but for now, we can't do that as readline is welded in everywhere.
368 # but for now, we can't do that as readline is welded in everywhere.
370 readline_use = Bool(True).tag(config=True)
369 readline_use = Bool(True).tag(config=True)
371 readline_remove_delims = Unicode('-/~').tag(config=True)
370 readline_remove_delims = Unicode('-/~').tag(config=True)
372 readline_delims = Unicode() # set by init_readline()
371 readline_delims = Unicode() # set by init_readline()
373 # don't use \M- bindings by default, because they
372 # don't use \M- bindings by default, because they
374 # conflict with 8-bit encodings. See gh-58,gh-88
373 # conflict with 8-bit encodings. See gh-58,gh-88
375 readline_parse_and_bind = List([
374 readline_parse_and_bind = List([
376 'tab: complete',
375 'tab: complete',
377 '"\C-l": clear-screen',
376 '"\C-l": clear-screen',
378 'set show-all-if-ambiguous on',
377 'set show-all-if-ambiguous on',
379 '"\C-o": tab-insert',
378 '"\C-o": tab-insert',
380 '"\C-r": reverse-search-history',
379 '"\C-r": reverse-search-history',
381 '"\C-s": forward-search-history',
380 '"\C-s": forward-search-history',
382 '"\C-p": history-search-backward',
381 '"\C-p": history-search-backward',
383 '"\C-n": history-search-forward',
382 '"\C-n": history-search-forward',
384 '"\e[A": history-search-backward',
383 '"\e[A": history-search-backward',
385 '"\e[B": history-search-forward',
384 '"\e[B": history-search-forward',
386 '"\C-k": kill-line',
385 '"\C-k": kill-line',
387 '"\C-u": unix-line-discard',
386 '"\C-u": unix-line-discard',
388 ]).tag(config=True)
387 ]).tag(config=True)
389
388
390 _custom_readline_config = False
389 _custom_readline_config = False
391
390
392 @observe('readline_parse_and_bind')
391 @observe('readline_parse_and_bind')
393 def _readline_parse_and_bind_changed(self, change):
392 def _readline_parse_and_bind_changed(self, change):
394 # notice that readline config is customized
393 # notice that readline config is customized
395 # indicates that it should have higher priority than inputrc
394 # indicates that it should have higher priority than inputrc
396 self._custom_readline_config = True
395 self._custom_readline_config = True
397
396
398 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
397 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
399 default_value='last_expr',
398 default_value='last_expr',
400 help="""
399 help="""
401 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
400 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
402 run interactively (displaying output from expressions)."""
401 run interactively (displaying output from expressions)."""
403 ).tag(config=True)
402 ).tag(config=True)
404
403
405 # TODO: this part of prompt management should be moved to the frontends.
404 # TODO: this part of prompt management should be moved to the frontends.
406 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
405 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
407 separate_in = SeparateUnicode('\n').tag(config=True)
406 separate_in = SeparateUnicode('\n').tag(config=True)
408 separate_out = SeparateUnicode('').tag(config=True)
407 separate_out = SeparateUnicode('').tag(config=True)
409 separate_out2 = SeparateUnicode('').tag(config=True)
408 separate_out2 = SeparateUnicode('').tag(config=True)
410 wildcards_case_sensitive = Bool(True).tag(config=True)
409 wildcards_case_sensitive = Bool(True).tag(config=True)
411 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
410 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
412 default_value='Context').tag(config=True)
411 default_value='Context').tag(config=True)
413
412
414 # Subcomponents of InteractiveShell
413 # Subcomponents of InteractiveShell
415 alias_manager = Instance('IPython.core.alias.AliasManager', allow_none=True)
414 alias_manager = Instance('IPython.core.alias.AliasManager', allow_none=True)
416 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager', allow_none=True)
415 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager', allow_none=True)
417 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap', allow_none=True)
416 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap', allow_none=True)
418 display_trap = Instance('IPython.core.display_trap.DisplayTrap', allow_none=True)
417 display_trap = Instance('IPython.core.display_trap.DisplayTrap', allow_none=True)
419 extension_manager = Instance('IPython.core.extensions.ExtensionManager', allow_none=True)
418 extension_manager = Instance('IPython.core.extensions.ExtensionManager', allow_none=True)
420 payload_manager = Instance('IPython.core.payload.PayloadManager', allow_none=True)
419 payload_manager = Instance('IPython.core.payload.PayloadManager', allow_none=True)
421 history_manager = Instance('IPython.core.history.HistoryAccessorBase', allow_none=True)
420 history_manager = Instance('IPython.core.history.HistoryAccessorBase', allow_none=True)
422 magics_manager = Instance('IPython.core.magic.MagicsManager', allow_none=True)
421 magics_manager = Instance('IPython.core.magic.MagicsManager', allow_none=True)
423
422
424 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True)
423 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True)
425 @property
424 @property
426 def profile(self):
425 def profile(self):
427 if self.profile_dir is not None:
426 if self.profile_dir is not None:
428 name = os.path.basename(self.profile_dir.location)
427 name = os.path.basename(self.profile_dir.location)
429 return name.replace('profile_','')
428 return name.replace('profile_','')
430
429
431
430
432 # Private interface
431 # Private interface
433 _post_execute = Dict()
432 _post_execute = Dict()
434
433
435 # Tracks any GUI loop loaded for pylab
434 # Tracks any GUI loop loaded for pylab
436 pylab_gui_select = None
435 pylab_gui_select = None
437
436
438 def __init__(self, ipython_dir=None, profile_dir=None,
437 def __init__(self, ipython_dir=None, profile_dir=None,
439 user_module=None, user_ns=None,
438 user_module=None, user_ns=None,
440 custom_exceptions=((), None), **kwargs):
439 custom_exceptions=((), None), **kwargs):
441
440
442 # This is where traits with a config_key argument are updated
441 # This is where traits with a config_key argument are updated
443 # from the values on config.
442 # from the values on config.
444 super(InteractiveShell, self).__init__(**kwargs)
443 super(InteractiveShell, self).__init__(**kwargs)
445 self.configurables = [self]
444 self.configurables = [self]
446
445
447 # These are relatively independent and stateless
446 # These are relatively independent and stateless
448 self.init_ipython_dir(ipython_dir)
447 self.init_ipython_dir(ipython_dir)
449 self.init_profile_dir(profile_dir)
448 self.init_profile_dir(profile_dir)
450 self.init_instance_attrs()
449 self.init_instance_attrs()
451 self.init_environment()
450 self.init_environment()
452
451
453 # Check if we're in a virtualenv, and set up sys.path.
452 # Check if we're in a virtualenv, and set up sys.path.
454 self.init_virtualenv()
453 self.init_virtualenv()
455
454
456 # Create namespaces (user_ns, user_global_ns, etc.)
455 # Create namespaces (user_ns, user_global_ns, etc.)
457 self.init_create_namespaces(user_module, user_ns)
456 self.init_create_namespaces(user_module, user_ns)
458 # This has to be done after init_create_namespaces because it uses
457 # This has to be done after init_create_namespaces because it uses
459 # something in self.user_ns, but before init_sys_modules, which
458 # something in self.user_ns, but before init_sys_modules, which
460 # is the first thing to modify sys.
459 # is the first thing to modify sys.
461 # TODO: When we override sys.stdout and sys.stderr before this class
460 # TODO: When we override sys.stdout and sys.stderr before this class
462 # is created, we are saving the overridden ones here. Not sure if this
461 # is created, we are saving the overridden ones here. Not sure if this
463 # is what we want to do.
462 # is what we want to do.
464 self.save_sys_module_state()
463 self.save_sys_module_state()
465 self.init_sys_modules()
464 self.init_sys_modules()
466
465
467 # While we're trying to have each part of the code directly access what
466 # While we're trying to have each part of the code directly access what
468 # it needs without keeping redundant references to objects, we have too
467 # it needs without keeping redundant references to objects, we have too
469 # much legacy code that expects ip.db to exist.
468 # much legacy code that expects ip.db to exist.
470 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
469 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
471
470
472 self.init_history()
471 self.init_history()
473 self.init_encoding()
472 self.init_encoding()
474 self.init_prefilter()
473 self.init_prefilter()
475
474
476 self.init_syntax_highlighting()
475 self.init_syntax_highlighting()
477 self.init_hooks()
476 self.init_hooks()
478 self.init_events()
477 self.init_events()
479 self.init_pushd_popd_magic()
478 self.init_pushd_popd_magic()
480 # self.init_traceback_handlers use to be here, but we moved it below
479 # self.init_traceback_handlers use to be here, but we moved it below
481 # because it and init_io have to come after init_readline.
480 # because it and init_io have to come after init_readline.
482 self.init_user_ns()
481 self.init_user_ns()
483 self.init_logger()
482 self.init_logger()
484 self.init_builtins()
483 self.init_builtins()
485
484
486 # The following was in post_config_initialization
485 # The following was in post_config_initialization
487 self.init_inspector()
486 self.init_inspector()
488 # init_readline() must come before init_io(), because init_io uses
487 # init_readline() must come before init_io(), because init_io uses
489 # readline related things.
488 # readline related things.
490 self.init_readline()
489 self.init_readline()
491 # We save this here in case user code replaces raw_input, but it needs
490 # We save this here in case user code replaces raw_input, but it needs
492 # to be after init_readline(), because PyPy's readline works by replacing
491 # to be after init_readline(), because PyPy's readline works by replacing
493 # raw_input.
492 # raw_input.
494 if py3compat.PY3:
493 if py3compat.PY3:
495 self.raw_input_original = input
494 self.raw_input_original = input
496 else:
495 else:
497 self.raw_input_original = raw_input
496 self.raw_input_original = raw_input
498 # init_completer must come after init_readline, because it needs to
497 # init_completer must come after init_readline, because it needs to
499 # know whether readline is present or not system-wide to configure the
498 # know whether readline is present or not system-wide to configure the
500 # completers, since the completion machinery can now operate
499 # completers, since the completion machinery can now operate
501 # independently of readline (e.g. over the network)
500 # independently of readline (e.g. over the network)
502 self.init_completer()
501 self.init_completer()
503 # TODO: init_io() needs to happen before init_traceback handlers
502 # TODO: init_io() needs to happen before init_traceback handlers
504 # because the traceback handlers hardcode the stdout/stderr streams.
503 # because the traceback handlers hardcode the stdout/stderr streams.
505 # This logic in in debugger.Pdb and should eventually be changed.
504 # This logic in in debugger.Pdb and should eventually be changed.
506 self.init_io()
505 self.init_io()
507 self.init_traceback_handlers(custom_exceptions)
506 self.init_traceback_handlers(custom_exceptions)
508 self.init_prompts()
507 self.init_prompts()
509 self.init_display_formatter()
508 self.init_display_formatter()
510 self.init_display_pub()
509 self.init_display_pub()
511 self.init_data_pub()
510 self.init_data_pub()
512 self.init_displayhook()
511 self.init_displayhook()
513 self.init_magics()
512 self.init_magics()
514 self.init_alias()
513 self.init_alias()
515 self.init_logstart()
514 self.init_logstart()
516 self.init_pdb()
515 self.init_pdb()
517 self.init_extension_manager()
516 self.init_extension_manager()
518 self.init_payload()
517 self.init_payload()
519 self.init_deprecation_warnings()
518 self.init_deprecation_warnings()
520 self.hooks.late_startup_hook()
519 self.hooks.late_startup_hook()
521 self.events.trigger('shell_initialized', self)
520 self.events.trigger('shell_initialized', self)
522 atexit.register(self.atexit_operations)
521 atexit.register(self.atexit_operations)
523
522
524 def get_ipython(self):
523 def get_ipython(self):
525 """Return the currently running IPython instance."""
524 """Return the currently running IPython instance."""
526 return self
525 return self
527
526
528 #-------------------------------------------------------------------------
527 #-------------------------------------------------------------------------
529 # Trait changed handlers
528 # Trait changed handlers
530 #-------------------------------------------------------------------------
529 #-------------------------------------------------------------------------
531 @observe('ipython_dir')
530 @observe('ipython_dir')
532 def _ipython_dir_changed(self, change):
531 def _ipython_dir_changed(self, change):
533 ensure_dir_exists(change['new'])
532 ensure_dir_exists(change['new'])
534
533
535 def set_autoindent(self,value=None):
534 def set_autoindent(self,value=None):
536 """Set the autoindent flag.
535 """Set the autoindent flag.
537
536
538 If called with no arguments, it acts as a toggle."""
537 If called with no arguments, it acts as a toggle."""
539 if value is None:
538 if value is None:
540 self.autoindent = not self.autoindent
539 self.autoindent = not self.autoindent
541 else:
540 else:
542 self.autoindent = value
541 self.autoindent = value
543
542
544 #-------------------------------------------------------------------------
543 #-------------------------------------------------------------------------
545 # init_* methods called by __init__
544 # init_* methods called by __init__
546 #-------------------------------------------------------------------------
545 #-------------------------------------------------------------------------
547
546
548 def init_ipython_dir(self, ipython_dir):
547 def init_ipython_dir(self, ipython_dir):
549 if ipython_dir is not None:
548 if ipython_dir is not None:
550 self.ipython_dir = ipython_dir
549 self.ipython_dir = ipython_dir
551 return
550 return
552
551
553 self.ipython_dir = get_ipython_dir()
552 self.ipython_dir = get_ipython_dir()
554
553
555 def init_profile_dir(self, profile_dir):
554 def init_profile_dir(self, profile_dir):
556 if profile_dir is not None:
555 if profile_dir is not None:
557 self.profile_dir = profile_dir
556 self.profile_dir = profile_dir
558 return
557 return
559 self.profile_dir =\
558 self.profile_dir =\
560 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
559 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
561
560
562 def init_instance_attrs(self):
561 def init_instance_attrs(self):
563 self.more = False
562 self.more = False
564
563
565 # command compiler
564 # command compiler
566 self.compile = CachingCompiler()
565 self.compile = CachingCompiler()
567
566
568 # Make an empty namespace, which extension writers can rely on both
567 # Make an empty namespace, which extension writers can rely on both
569 # existing and NEVER being used by ipython itself. This gives them a
568 # existing and NEVER being used by ipython itself. This gives them a
570 # convenient location for storing additional information and state
569 # convenient location for storing additional information and state
571 # their extensions may require, without fear of collisions with other
570 # their extensions may require, without fear of collisions with other
572 # ipython names that may develop later.
571 # ipython names that may develop later.
573 self.meta = Struct()
572 self.meta = Struct()
574
573
575 # Temporary files used for various purposes. Deleted at exit.
574 # Temporary files used for various purposes. Deleted at exit.
576 self.tempfiles = []
575 self.tempfiles = []
577 self.tempdirs = []
576 self.tempdirs = []
578
577
579 # Keep track of readline usage (later set by init_readline)
578 # Keep track of readline usage (later set by init_readline)
580 self.has_readline = False
579 self.has_readline = False
581
580
582 # keep track of where we started running (mainly for crash post-mortem)
581 # keep track of where we started running (mainly for crash post-mortem)
583 # This is not being used anywhere currently.
582 # This is not being used anywhere currently.
584 self.starting_dir = py3compat.getcwd()
583 self.starting_dir = py3compat.getcwd()
585
584
586 # Indentation management
585 # Indentation management
587 self.indent_current_nsp = 0
586 self.indent_current_nsp = 0
588
587
589 # Dict to track post-execution functions that have been registered
588 # Dict to track post-execution functions that have been registered
590 self._post_execute = {}
589 self._post_execute = {}
591
590
592 def init_environment(self):
591 def init_environment(self):
593 """Any changes we need to make to the user's environment."""
592 """Any changes we need to make to the user's environment."""
594 pass
593 pass
595
594
596 def init_encoding(self):
595 def init_encoding(self):
597 # Get system encoding at startup time. Certain terminals (like Emacs
596 # Get system encoding at startup time. Certain terminals (like Emacs
598 # under Win32 have it set to None, and we need to have a known valid
597 # under Win32 have it set to None, and we need to have a known valid
599 # encoding to use in the raw_input() method
598 # encoding to use in the raw_input() method
600 try:
599 try:
601 self.stdin_encoding = sys.stdin.encoding or 'ascii'
600 self.stdin_encoding = sys.stdin.encoding or 'ascii'
602 except AttributeError:
601 except AttributeError:
603 self.stdin_encoding = 'ascii'
602 self.stdin_encoding = 'ascii'
604
603
605 def init_syntax_highlighting(self):
604 def init_syntax_highlighting(self):
606 # Python source parser/formatter for syntax highlighting
605 # Python source parser/formatter for syntax highlighting
607 pyformat = PyColorize.Parser().format
606 pyformat = PyColorize.Parser().format
608 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
607 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
609
608
610 def init_pushd_popd_magic(self):
609 def init_pushd_popd_magic(self):
611 # for pushd/popd management
610 # for pushd/popd management
612 self.home_dir = get_home_dir()
611 self.home_dir = get_home_dir()
613
612
614 self.dir_stack = []
613 self.dir_stack = []
615
614
616 def init_logger(self):
615 def init_logger(self):
617 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
616 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
618 logmode='rotate')
617 logmode='rotate')
619
618
620 def init_logstart(self):
619 def init_logstart(self):
621 """Initialize logging in case it was requested at the command line.
620 """Initialize logging in case it was requested at the command line.
622 """
621 """
623 if self.logappend:
622 if self.logappend:
624 self.magic('logstart %s append' % self.logappend)
623 self.magic('logstart %s append' % self.logappend)
625 elif self.logfile:
624 elif self.logfile:
626 self.magic('logstart %s' % self.logfile)
625 self.magic('logstart %s' % self.logfile)
627 elif self.logstart:
626 elif self.logstart:
628 self.magic('logstart')
627 self.magic('logstart')
629
628
630 def init_deprecation_warnings(self):
629 def init_deprecation_warnings(self):
631 """
630 """
632 register default filter for deprecation warning.
631 register default filter for deprecation warning.
633
632
634 This will allow deprecation warning of function used interactively to show
633 This will allow deprecation warning of function used interactively to show
635 warning to users, and still hide deprecation warning from libraries import.
634 warning to users, and still hide deprecation warning from libraries import.
636 """
635 """
637 warnings.filterwarnings("default", category=DeprecationWarning, module=self.user_ns.get("__name__"))
636 warnings.filterwarnings("default", category=DeprecationWarning, module=self.user_ns.get("__name__"))
638
637
639 def init_builtins(self):
638 def init_builtins(self):
640 # A single, static flag that we set to True. Its presence indicates
639 # A single, static flag that we set to True. Its presence indicates
641 # that an IPython shell has been created, and we make no attempts at
640 # that an IPython shell has been created, and we make no attempts at
642 # removing on exit or representing the existence of more than one
641 # removing on exit or representing the existence of more than one
643 # IPython at a time.
642 # IPython at a time.
644 builtin_mod.__dict__['__IPYTHON__'] = True
643 builtin_mod.__dict__['__IPYTHON__'] = True
645
644
646 self.builtin_trap = BuiltinTrap(shell=self)
645 self.builtin_trap = BuiltinTrap(shell=self)
647
646
648 def init_inspector(self):
647 def init_inspector(self):
649 # Object inspector
648 # Object inspector
650 self.inspector = oinspect.Inspector(oinspect.InspectColors,
649 self.inspector = oinspect.Inspector(oinspect.InspectColors,
651 PyColorize.ANSICodeColors,
650 PyColorize.ANSICodeColors,
652 'NoColor',
651 'NoColor',
653 self.object_info_string_level)
652 self.object_info_string_level)
654
653
655 def init_io(self):
654 def init_io(self):
656 # This will just use sys.stdout and sys.stderr. If you want to
655 # This will just use sys.stdout and sys.stderr. If you want to
657 # override sys.stdout and sys.stderr themselves, you need to do that
656 # override sys.stdout and sys.stderr themselves, you need to do that
658 # *before* instantiating this class, because io holds onto
657 # *before* instantiating this class, because io holds onto
659 # references to the underlying streams.
658 # references to the underlying streams.
660 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
659 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
661 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
660 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
662 else:
661 else:
663 io.stdout = io.IOStream(sys.stdout)
662 io.stdout = io.IOStream(sys.stdout)
664 io.stderr = io.IOStream(sys.stderr)
663 io.stderr = io.IOStream(sys.stderr)
665
664
666 def init_prompts(self):
665 def init_prompts(self):
667 self.prompt_manager = PromptManager(shell=self, parent=self)
668 self.configurables.append(self.prompt_manager)
669 # Set system prompts, so that scripts can decide if they are running
666 # Set system prompts, so that scripts can decide if they are running
670 # interactively.
667 # interactively.
671 sys.ps1 = 'In : '
668 sys.ps1 = 'In : '
672 sys.ps2 = '...: '
669 sys.ps2 = '...: '
673 sys.ps3 = 'Out: '
670 sys.ps3 = 'Out: '
674
671
675 def init_display_formatter(self):
672 def init_display_formatter(self):
676 self.display_formatter = DisplayFormatter(parent=self)
673 self.display_formatter = DisplayFormatter(parent=self)
677 self.configurables.append(self.display_formatter)
674 self.configurables.append(self.display_formatter)
678
675
679 def init_display_pub(self):
676 def init_display_pub(self):
680 self.display_pub = self.display_pub_class(parent=self)
677 self.display_pub = self.display_pub_class(parent=self)
681 self.configurables.append(self.display_pub)
678 self.configurables.append(self.display_pub)
682
679
683 def init_data_pub(self):
680 def init_data_pub(self):
684 if not self.data_pub_class:
681 if not self.data_pub_class:
685 self.data_pub = None
682 self.data_pub = None
686 return
683 return
687 self.data_pub = self.data_pub_class(parent=self)
684 self.data_pub = self.data_pub_class(parent=self)
688 self.configurables.append(self.data_pub)
685 self.configurables.append(self.data_pub)
689
686
690 def init_displayhook(self):
687 def init_displayhook(self):
691 # Initialize displayhook, set in/out prompts and printing system
688 # Initialize displayhook, set in/out prompts and printing system
692 self.displayhook = self.displayhook_class(
689 self.displayhook = self.displayhook_class(
693 parent=self,
690 parent=self,
694 shell=self,
691 shell=self,
695 cache_size=self.cache_size,
692 cache_size=self.cache_size,
696 )
693 )
697 self.configurables.append(self.displayhook)
694 self.configurables.append(self.displayhook)
698 # This is a context manager that installs/revmoes the displayhook at
695 # This is a context manager that installs/revmoes the displayhook at
699 # the appropriate time.
696 # the appropriate time.
700 self.display_trap = DisplayTrap(hook=self.displayhook)
697 self.display_trap = DisplayTrap(hook=self.displayhook)
701
698
702 def init_virtualenv(self):
699 def init_virtualenv(self):
703 """Add a virtualenv to sys.path so the user can import modules from it.
700 """Add a virtualenv to sys.path so the user can import modules from it.
704 This isn't perfect: it doesn't use the Python interpreter with which the
701 This isn't perfect: it doesn't use the Python interpreter with which the
705 virtualenv was built, and it ignores the --no-site-packages option. A
702 virtualenv was built, and it ignores the --no-site-packages option. A
706 warning will appear suggesting the user installs IPython in the
703 warning will appear suggesting the user installs IPython in the
707 virtualenv, but for many cases, it probably works well enough.
704 virtualenv, but for many cases, it probably works well enough.
708
705
709 Adapted from code snippets online.
706 Adapted from code snippets online.
710
707
711 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
708 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
712 """
709 """
713 if 'VIRTUAL_ENV' not in os.environ:
710 if 'VIRTUAL_ENV' not in os.environ:
714 # Not in a virtualenv
711 # Not in a virtualenv
715 return
712 return
716
713
717 # venv detection:
714 # venv detection:
718 # stdlib venv may symlink sys.executable, so we can't use realpath.
715 # stdlib venv may symlink sys.executable, so we can't use realpath.
719 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
716 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
720 # So we just check every item in the symlink tree (generally <= 3)
717 # So we just check every item in the symlink tree (generally <= 3)
721 p = os.path.normcase(sys.executable)
718 p = os.path.normcase(sys.executable)
722 paths = [p]
719 paths = [p]
723 while os.path.islink(p):
720 while os.path.islink(p):
724 p = os.path.normcase(os.path.join(os.path.dirname(p), os.readlink(p)))
721 p = os.path.normcase(os.path.join(os.path.dirname(p), os.readlink(p)))
725 paths.append(p)
722 paths.append(p)
726 p_venv = os.path.normcase(os.environ['VIRTUAL_ENV'])
723 p_venv = os.path.normcase(os.environ['VIRTUAL_ENV'])
727 if any(p.startswith(p_venv) for p in paths):
724 if any(p.startswith(p_venv) for p in paths):
728 # Running properly in the virtualenv, don't need to do anything
725 # Running properly in the virtualenv, don't need to do anything
729 return
726 return
730
727
731 warn("Attempting to work in a virtualenv. If you encounter problems, please "
728 warn("Attempting to work in a virtualenv. If you encounter problems, please "
732 "install IPython inside the virtualenv.")
729 "install IPython inside the virtualenv.")
733 if sys.platform == "win32":
730 if sys.platform == "win32":
734 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
731 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
735 else:
732 else:
736 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
733 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
737 'python%d.%d' % sys.version_info[:2], 'site-packages')
734 'python%d.%d' % sys.version_info[:2], 'site-packages')
738
735
739 import site
736 import site
740 sys.path.insert(0, virtual_env)
737 sys.path.insert(0, virtual_env)
741 site.addsitedir(virtual_env)
738 site.addsitedir(virtual_env)
742
739
743 #-------------------------------------------------------------------------
740 #-------------------------------------------------------------------------
744 # Things related to injections into the sys module
741 # Things related to injections into the sys module
745 #-------------------------------------------------------------------------
742 #-------------------------------------------------------------------------
746
743
747 def save_sys_module_state(self):
744 def save_sys_module_state(self):
748 """Save the state of hooks in the sys module.
745 """Save the state of hooks in the sys module.
749
746
750 This has to be called after self.user_module is created.
747 This has to be called after self.user_module is created.
751 """
748 """
752 self._orig_sys_module_state = {'stdin': sys.stdin,
749 self._orig_sys_module_state = {'stdin': sys.stdin,
753 'stdout': sys.stdout,
750 'stdout': sys.stdout,
754 'stderr': sys.stderr,
751 'stderr': sys.stderr,
755 'excepthook': sys.excepthook}
752 'excepthook': sys.excepthook}
756 self._orig_sys_modules_main_name = self.user_module.__name__
753 self._orig_sys_modules_main_name = self.user_module.__name__
757 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
754 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
758
755
759 def restore_sys_module_state(self):
756 def restore_sys_module_state(self):
760 """Restore the state of the sys module."""
757 """Restore the state of the sys module."""
761 try:
758 try:
762 for k, v in iteritems(self._orig_sys_module_state):
759 for k, v in iteritems(self._orig_sys_module_state):
763 setattr(sys, k, v)
760 setattr(sys, k, v)
764 except AttributeError:
761 except AttributeError:
765 pass
762 pass
766 # Reset what what done in self.init_sys_modules
763 # Reset what what done in self.init_sys_modules
767 if self._orig_sys_modules_main_mod is not None:
764 if self._orig_sys_modules_main_mod is not None:
768 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
765 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
769
766
770 #-------------------------------------------------------------------------
767 #-------------------------------------------------------------------------
771 # Things related to the banner
768 # Things related to the banner
772 #-------------------------------------------------------------------------
769 #-------------------------------------------------------------------------
773
770
774 @property
771 @property
775 def banner(self):
772 def banner(self):
776 banner = self.banner1
773 banner = self.banner1
777 if self.profile and self.profile != 'default':
774 if self.profile and self.profile != 'default':
778 banner += '\nIPython profile: %s\n' % self.profile
775 banner += '\nIPython profile: %s\n' % self.profile
779 if self.banner2:
776 if self.banner2:
780 banner += '\n' + self.banner2
777 banner += '\n' + self.banner2
781 return banner
778 return banner
782
779
783 def show_banner(self, banner=None):
780 def show_banner(self, banner=None):
784 if banner is None:
781 if banner is None:
785 banner = self.banner
782 banner = self.banner
786 sys.stdout.write(banner)
783 sys.stdout.write(banner)
787
784
788 #-------------------------------------------------------------------------
785 #-------------------------------------------------------------------------
789 # Things related to hooks
786 # Things related to hooks
790 #-------------------------------------------------------------------------
787 #-------------------------------------------------------------------------
791
788
792 def init_hooks(self):
789 def init_hooks(self):
793 # hooks holds pointers used for user-side customizations
790 # hooks holds pointers used for user-side customizations
794 self.hooks = Struct()
791 self.hooks = Struct()
795
792
796 self.strdispatchers = {}
793 self.strdispatchers = {}
797
794
798 # Set all default hooks, defined in the IPython.hooks module.
795 # Set all default hooks, defined in the IPython.hooks module.
799 hooks = IPython.core.hooks
796 hooks = IPython.core.hooks
800 for hook_name in hooks.__all__:
797 for hook_name in hooks.__all__:
801 # default hooks have priority 100, i.e. low; user hooks should have
798 # default hooks have priority 100, i.e. low; user hooks should have
802 # 0-100 priority
799 # 0-100 priority
803 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
800 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
804
801
805 if self.display_page:
802 if self.display_page:
806 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
803 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
807
804
808 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
805 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
809 _warn_deprecated=True):
806 _warn_deprecated=True):
810 """set_hook(name,hook) -> sets an internal IPython hook.
807 """set_hook(name,hook) -> sets an internal IPython hook.
811
808
812 IPython exposes some of its internal API as user-modifiable hooks. By
809 IPython exposes some of its internal API as user-modifiable hooks. By
813 adding your function to one of these hooks, you can modify IPython's
810 adding your function to one of these hooks, you can modify IPython's
814 behavior to call at runtime your own routines."""
811 behavior to call at runtime your own routines."""
815
812
816 # At some point in the future, this should validate the hook before it
813 # At some point in the future, this should validate the hook before it
817 # accepts it. Probably at least check that the hook takes the number
814 # accepts it. Probably at least check that the hook takes the number
818 # of args it's supposed to.
815 # of args it's supposed to.
819
816
820 f = types.MethodType(hook,self)
817 f = types.MethodType(hook,self)
821
818
822 # check if the hook is for strdispatcher first
819 # check if the hook is for strdispatcher first
823 if str_key is not None:
820 if str_key is not None:
824 sdp = self.strdispatchers.get(name, StrDispatch())
821 sdp = self.strdispatchers.get(name, StrDispatch())
825 sdp.add_s(str_key, f, priority )
822 sdp.add_s(str_key, f, priority )
826 self.strdispatchers[name] = sdp
823 self.strdispatchers[name] = sdp
827 return
824 return
828 if re_key is not None:
825 if re_key is not None:
829 sdp = self.strdispatchers.get(name, StrDispatch())
826 sdp = self.strdispatchers.get(name, StrDispatch())
830 sdp.add_re(re.compile(re_key), f, priority )
827 sdp.add_re(re.compile(re_key), f, priority )
831 self.strdispatchers[name] = sdp
828 self.strdispatchers[name] = sdp
832 return
829 return
833
830
834 dp = getattr(self.hooks, name, None)
831 dp = getattr(self.hooks, name, None)
835 if name not in IPython.core.hooks.__all__:
832 if name not in IPython.core.hooks.__all__:
836 print("Warning! Hook '%s' is not one of %s" % \
833 print("Warning! Hook '%s' is not one of %s" % \
837 (name, IPython.core.hooks.__all__ ))
834 (name, IPython.core.hooks.__all__ ))
838
835
839 if _warn_deprecated and (name in IPython.core.hooks.deprecated):
836 if _warn_deprecated and (name in IPython.core.hooks.deprecated):
840 alternative = IPython.core.hooks.deprecated[name]
837 alternative = IPython.core.hooks.deprecated[name]
841 warn("Hook {} is deprecated. Use {} instead.".format(name, alternative))
838 warn("Hook {} is deprecated. Use {} instead.".format(name, alternative))
842
839
843 if not dp:
840 if not dp:
844 dp = IPython.core.hooks.CommandChainDispatcher()
841 dp = IPython.core.hooks.CommandChainDispatcher()
845
842
846 try:
843 try:
847 dp.add(f,priority)
844 dp.add(f,priority)
848 except AttributeError:
845 except AttributeError:
849 # it was not commandchain, plain old func - replace
846 # it was not commandchain, plain old func - replace
850 dp = f
847 dp = f
851
848
852 setattr(self.hooks,name, dp)
849 setattr(self.hooks,name, dp)
853
850
854 #-------------------------------------------------------------------------
851 #-------------------------------------------------------------------------
855 # Things related to events
852 # Things related to events
856 #-------------------------------------------------------------------------
853 #-------------------------------------------------------------------------
857
854
858 def init_events(self):
855 def init_events(self):
859 self.events = EventManager(self, available_events)
856 self.events = EventManager(self, available_events)
860
857
861 self.events.register("pre_execute", self._clear_warning_registry)
858 self.events.register("pre_execute", self._clear_warning_registry)
862
859
863 def register_post_execute(self, func):
860 def register_post_execute(self, func):
864 """DEPRECATED: Use ip.events.register('post_run_cell', func)
861 """DEPRECATED: Use ip.events.register('post_run_cell', func)
865
862
866 Register a function for calling after code execution.
863 Register a function for calling after code execution.
867 """
864 """
868 warn("ip.register_post_execute is deprecated, use "
865 warn("ip.register_post_execute is deprecated, use "
869 "ip.events.register('post_run_cell', func) instead.")
866 "ip.events.register('post_run_cell', func) instead.")
870 self.events.register('post_run_cell', func)
867 self.events.register('post_run_cell', func)
871
868
872 def _clear_warning_registry(self):
869 def _clear_warning_registry(self):
873 # clear the warning registry, so that different code blocks with
870 # clear the warning registry, so that different code blocks with
874 # overlapping line number ranges don't cause spurious suppression of
871 # overlapping line number ranges don't cause spurious suppression of
875 # warnings (see gh-6611 for details)
872 # warnings (see gh-6611 for details)
876 if "__warningregistry__" in self.user_global_ns:
873 if "__warningregistry__" in self.user_global_ns:
877 del self.user_global_ns["__warningregistry__"]
874 del self.user_global_ns["__warningregistry__"]
878
875
879 #-------------------------------------------------------------------------
876 #-------------------------------------------------------------------------
880 # Things related to the "main" module
877 # Things related to the "main" module
881 #-------------------------------------------------------------------------
878 #-------------------------------------------------------------------------
882
879
883 def new_main_mod(self, filename, modname):
880 def new_main_mod(self, filename, modname):
884 """Return a new 'main' module object for user code execution.
881 """Return a new 'main' module object for user code execution.
885
882
886 ``filename`` should be the path of the script which will be run in the
883 ``filename`` should be the path of the script which will be run in the
887 module. Requests with the same filename will get the same module, with
884 module. Requests with the same filename will get the same module, with
888 its namespace cleared.
885 its namespace cleared.
889
886
890 ``modname`` should be the module name - normally either '__main__' or
887 ``modname`` should be the module name - normally either '__main__' or
891 the basename of the file without the extension.
888 the basename of the file without the extension.
892
889
893 When scripts are executed via %run, we must keep a reference to their
890 When scripts are executed via %run, we must keep a reference to their
894 __main__ module around so that Python doesn't
891 __main__ module around so that Python doesn't
895 clear it, rendering references to module globals useless.
892 clear it, rendering references to module globals useless.
896
893
897 This method keeps said reference in a private dict, keyed by the
894 This method keeps said reference in a private dict, keyed by the
898 absolute path of the script. This way, for multiple executions of the
895 absolute path of the script. This way, for multiple executions of the
899 same script we only keep one copy of the namespace (the last one),
896 same script we only keep one copy of the namespace (the last one),
900 thus preventing memory leaks from old references while allowing the
897 thus preventing memory leaks from old references while allowing the
901 objects from the last execution to be accessible.
898 objects from the last execution to be accessible.
902 """
899 """
903 filename = os.path.abspath(filename)
900 filename = os.path.abspath(filename)
904 try:
901 try:
905 main_mod = self._main_mod_cache[filename]
902 main_mod = self._main_mod_cache[filename]
906 except KeyError:
903 except KeyError:
907 main_mod = self._main_mod_cache[filename] = types.ModuleType(
904 main_mod = self._main_mod_cache[filename] = types.ModuleType(
908 py3compat.cast_bytes_py2(modname),
905 py3compat.cast_bytes_py2(modname),
909 doc="Module created for script run in IPython")
906 doc="Module created for script run in IPython")
910 else:
907 else:
911 main_mod.__dict__.clear()
908 main_mod.__dict__.clear()
912 main_mod.__name__ = modname
909 main_mod.__name__ = modname
913
910
914 main_mod.__file__ = filename
911 main_mod.__file__ = filename
915 # It seems pydoc (and perhaps others) needs any module instance to
912 # It seems pydoc (and perhaps others) needs any module instance to
916 # implement a __nonzero__ method
913 # implement a __nonzero__ method
917 main_mod.__nonzero__ = lambda : True
914 main_mod.__nonzero__ = lambda : True
918
915
919 return main_mod
916 return main_mod
920
917
921 def clear_main_mod_cache(self):
918 def clear_main_mod_cache(self):
922 """Clear the cache of main modules.
919 """Clear the cache of main modules.
923
920
924 Mainly for use by utilities like %reset.
921 Mainly for use by utilities like %reset.
925
922
926 Examples
923 Examples
927 --------
924 --------
928
925
929 In [15]: import IPython
926 In [15]: import IPython
930
927
931 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
928 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
932
929
933 In [17]: len(_ip._main_mod_cache) > 0
930 In [17]: len(_ip._main_mod_cache) > 0
934 Out[17]: True
931 Out[17]: True
935
932
936 In [18]: _ip.clear_main_mod_cache()
933 In [18]: _ip.clear_main_mod_cache()
937
934
938 In [19]: len(_ip._main_mod_cache) == 0
935 In [19]: len(_ip._main_mod_cache) == 0
939 Out[19]: True
936 Out[19]: True
940 """
937 """
941 self._main_mod_cache.clear()
938 self._main_mod_cache.clear()
942
939
943 #-------------------------------------------------------------------------
940 #-------------------------------------------------------------------------
944 # Things related to debugging
941 # Things related to debugging
945 #-------------------------------------------------------------------------
942 #-------------------------------------------------------------------------
946
943
947 def init_pdb(self):
944 def init_pdb(self):
948 # Set calling of pdb on exceptions
945 # Set calling of pdb on exceptions
949 # self.call_pdb is a property
946 # self.call_pdb is a property
950 self.call_pdb = self.pdb
947 self.call_pdb = self.pdb
951
948
952 def _get_call_pdb(self):
949 def _get_call_pdb(self):
953 return self._call_pdb
950 return self._call_pdb
954
951
955 def _set_call_pdb(self,val):
952 def _set_call_pdb(self,val):
956
953
957 if val not in (0,1,False,True):
954 if val not in (0,1,False,True):
958 raise ValueError('new call_pdb value must be boolean')
955 raise ValueError('new call_pdb value must be boolean')
959
956
960 # store value in instance
957 # store value in instance
961 self._call_pdb = val
958 self._call_pdb = val
962
959
963 # notify the actual exception handlers
960 # notify the actual exception handlers
964 self.InteractiveTB.call_pdb = val
961 self.InteractiveTB.call_pdb = val
965
962
966 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
963 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
967 'Control auto-activation of pdb at exceptions')
964 'Control auto-activation of pdb at exceptions')
968
965
969 def debugger(self,force=False):
966 def debugger(self,force=False):
970 """Call the pdb debugger.
967 """Call the pdb debugger.
971
968
972 Keywords:
969 Keywords:
973
970
974 - force(False): by default, this routine checks the instance call_pdb
971 - force(False): by default, this routine checks the instance call_pdb
975 flag and does not actually invoke the debugger if the flag is false.
972 flag and does not actually invoke the debugger if the flag is false.
976 The 'force' option forces the debugger to activate even if the flag
973 The 'force' option forces the debugger to activate even if the flag
977 is false.
974 is false.
978 """
975 """
979
976
980 if not (force or self.call_pdb):
977 if not (force or self.call_pdb):
981 return
978 return
982
979
983 if not hasattr(sys,'last_traceback'):
980 if not hasattr(sys,'last_traceback'):
984 error('No traceback has been produced, nothing to debug.')
981 error('No traceback has been produced, nothing to debug.')
985 return
982 return
986
983
987
984
988 with self.readline_no_record:
985 with self.readline_no_record:
989 self.InteractiveTB.debugger(force=True)
986 self.InteractiveTB.debugger(force=True)
990
987
991 #-------------------------------------------------------------------------
988 #-------------------------------------------------------------------------
992 # Things related to IPython's various namespaces
989 # Things related to IPython's various namespaces
993 #-------------------------------------------------------------------------
990 #-------------------------------------------------------------------------
994 default_user_namespaces = True
991 default_user_namespaces = True
995
992
996 def init_create_namespaces(self, user_module=None, user_ns=None):
993 def init_create_namespaces(self, user_module=None, user_ns=None):
997 # Create the namespace where the user will operate. user_ns is
994 # Create the namespace where the user will operate. user_ns is
998 # normally the only one used, and it is passed to the exec calls as
995 # normally the only one used, and it is passed to the exec calls as
999 # the locals argument. But we do carry a user_global_ns namespace
996 # the locals argument. But we do carry a user_global_ns namespace
1000 # given as the exec 'globals' argument, This is useful in embedding
997 # given as the exec 'globals' argument, This is useful in embedding
1001 # situations where the ipython shell opens in a context where the
998 # situations where the ipython shell opens in a context where the
1002 # distinction between locals and globals is meaningful. For
999 # distinction between locals and globals is meaningful. For
1003 # non-embedded contexts, it is just the same object as the user_ns dict.
1000 # non-embedded contexts, it is just the same object as the user_ns dict.
1004
1001
1005 # FIXME. For some strange reason, __builtins__ is showing up at user
1002 # FIXME. For some strange reason, __builtins__ is showing up at user
1006 # level as a dict instead of a module. This is a manual fix, but I
1003 # level as a dict instead of a module. This is a manual fix, but I
1007 # should really track down where the problem is coming from. Alex
1004 # should really track down where the problem is coming from. Alex
1008 # Schmolck reported this problem first.
1005 # Schmolck reported this problem first.
1009
1006
1010 # A useful post by Alex Martelli on this topic:
1007 # A useful post by Alex Martelli on this topic:
1011 # Re: inconsistent value from __builtins__
1008 # Re: inconsistent value from __builtins__
1012 # Von: Alex Martelli <aleaxit@yahoo.com>
1009 # Von: Alex Martelli <aleaxit@yahoo.com>
1013 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1010 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1014 # Gruppen: comp.lang.python
1011 # Gruppen: comp.lang.python
1015
1012
1016 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1013 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1017 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1014 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1018 # > <type 'dict'>
1015 # > <type 'dict'>
1019 # > >>> print type(__builtins__)
1016 # > >>> print type(__builtins__)
1020 # > <type 'module'>
1017 # > <type 'module'>
1021 # > Is this difference in return value intentional?
1018 # > Is this difference in return value intentional?
1022
1019
1023 # Well, it's documented that '__builtins__' can be either a dictionary
1020 # Well, it's documented that '__builtins__' can be either a dictionary
1024 # or a module, and it's been that way for a long time. Whether it's
1021 # or a module, and it's been that way for a long time. Whether it's
1025 # intentional (or sensible), I don't know. In any case, the idea is
1022 # intentional (or sensible), I don't know. In any case, the idea is
1026 # that if you need to access the built-in namespace directly, you
1023 # that if you need to access the built-in namespace directly, you
1027 # should start with "import __builtin__" (note, no 's') which will
1024 # should start with "import __builtin__" (note, no 's') which will
1028 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1025 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1029
1026
1030 # These routines return a properly built module and dict as needed by
1027 # These routines return a properly built module and dict as needed by
1031 # the rest of the code, and can also be used by extension writers to
1028 # the rest of the code, and can also be used by extension writers to
1032 # generate properly initialized namespaces.
1029 # generate properly initialized namespaces.
1033 if (user_ns is not None) or (user_module is not None):
1030 if (user_ns is not None) or (user_module is not None):
1034 self.default_user_namespaces = False
1031 self.default_user_namespaces = False
1035 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1032 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1036
1033
1037 # A record of hidden variables we have added to the user namespace, so
1034 # A record of hidden variables we have added to the user namespace, so
1038 # we can list later only variables defined in actual interactive use.
1035 # we can list later only variables defined in actual interactive use.
1039 self.user_ns_hidden = {}
1036 self.user_ns_hidden = {}
1040
1037
1041 # Now that FakeModule produces a real module, we've run into a nasty
1038 # Now that FakeModule produces a real module, we've run into a nasty
1042 # problem: after script execution (via %run), the module where the user
1039 # problem: after script execution (via %run), the module where the user
1043 # code ran is deleted. Now that this object is a true module (needed
1040 # code ran is deleted. Now that this object is a true module (needed
1044 # so doctest and other tools work correctly), the Python module
1041 # so doctest and other tools work correctly), the Python module
1045 # teardown mechanism runs over it, and sets to None every variable
1042 # teardown mechanism runs over it, and sets to None every variable
1046 # present in that module. Top-level references to objects from the
1043 # present in that module. Top-level references to objects from the
1047 # script survive, because the user_ns is updated with them. However,
1044 # script survive, because the user_ns is updated with them. However,
1048 # calling functions defined in the script that use other things from
1045 # calling functions defined in the script that use other things from
1049 # the script will fail, because the function's closure had references
1046 # the script will fail, because the function's closure had references
1050 # to the original objects, which are now all None. So we must protect
1047 # to the original objects, which are now all None. So we must protect
1051 # these modules from deletion by keeping a cache.
1048 # these modules from deletion by keeping a cache.
1052 #
1049 #
1053 # To avoid keeping stale modules around (we only need the one from the
1050 # To avoid keeping stale modules around (we only need the one from the
1054 # last run), we use a dict keyed with the full path to the script, so
1051 # last run), we use a dict keyed with the full path to the script, so
1055 # only the last version of the module is held in the cache. Note,
1052 # only the last version of the module is held in the cache. Note,
1056 # however, that we must cache the module *namespace contents* (their
1053 # however, that we must cache the module *namespace contents* (their
1057 # __dict__). Because if we try to cache the actual modules, old ones
1054 # __dict__). Because if we try to cache the actual modules, old ones
1058 # (uncached) could be destroyed while still holding references (such as
1055 # (uncached) could be destroyed while still holding references (such as
1059 # those held by GUI objects that tend to be long-lived)>
1056 # those held by GUI objects that tend to be long-lived)>
1060 #
1057 #
1061 # The %reset command will flush this cache. See the cache_main_mod()
1058 # The %reset command will flush this cache. See the cache_main_mod()
1062 # and clear_main_mod_cache() methods for details on use.
1059 # and clear_main_mod_cache() methods for details on use.
1063
1060
1064 # This is the cache used for 'main' namespaces
1061 # This is the cache used for 'main' namespaces
1065 self._main_mod_cache = {}
1062 self._main_mod_cache = {}
1066
1063
1067 # A table holding all the namespaces IPython deals with, so that
1064 # A table holding all the namespaces IPython deals with, so that
1068 # introspection facilities can search easily.
1065 # introspection facilities can search easily.
1069 self.ns_table = {'user_global':self.user_module.__dict__,
1066 self.ns_table = {'user_global':self.user_module.__dict__,
1070 'user_local':self.user_ns,
1067 'user_local':self.user_ns,
1071 'builtin':builtin_mod.__dict__
1068 'builtin':builtin_mod.__dict__
1072 }
1069 }
1073
1070
1074 @property
1071 @property
1075 def user_global_ns(self):
1072 def user_global_ns(self):
1076 return self.user_module.__dict__
1073 return self.user_module.__dict__
1077
1074
1078 def prepare_user_module(self, user_module=None, user_ns=None):
1075 def prepare_user_module(self, user_module=None, user_ns=None):
1079 """Prepare the module and namespace in which user code will be run.
1076 """Prepare the module and namespace in which user code will be run.
1080
1077
1081 When IPython is started normally, both parameters are None: a new module
1078 When IPython is started normally, both parameters are None: a new module
1082 is created automatically, and its __dict__ used as the namespace.
1079 is created automatically, and its __dict__ used as the namespace.
1083
1080
1084 If only user_module is provided, its __dict__ is used as the namespace.
1081 If only user_module is provided, its __dict__ is used as the namespace.
1085 If only user_ns is provided, a dummy module is created, and user_ns
1082 If only user_ns is provided, a dummy module is created, and user_ns
1086 becomes the global namespace. If both are provided (as they may be
1083 becomes the global namespace. If both are provided (as they may be
1087 when embedding), user_ns is the local namespace, and user_module
1084 when embedding), user_ns is the local namespace, and user_module
1088 provides the global namespace.
1085 provides the global namespace.
1089
1086
1090 Parameters
1087 Parameters
1091 ----------
1088 ----------
1092 user_module : module, optional
1089 user_module : module, optional
1093 The current user module in which IPython is being run. If None,
1090 The current user module in which IPython is being run. If None,
1094 a clean module will be created.
1091 a clean module will be created.
1095 user_ns : dict, optional
1092 user_ns : dict, optional
1096 A namespace in which to run interactive commands.
1093 A namespace in which to run interactive commands.
1097
1094
1098 Returns
1095 Returns
1099 -------
1096 -------
1100 A tuple of user_module and user_ns, each properly initialised.
1097 A tuple of user_module and user_ns, each properly initialised.
1101 """
1098 """
1102 if user_module is None and user_ns is not None:
1099 if user_module is None and user_ns is not None:
1103 user_ns.setdefault("__name__", "__main__")
1100 user_ns.setdefault("__name__", "__main__")
1104 user_module = DummyMod()
1101 user_module = DummyMod()
1105 user_module.__dict__ = user_ns
1102 user_module.__dict__ = user_ns
1106
1103
1107 if user_module is None:
1104 if user_module is None:
1108 user_module = types.ModuleType("__main__",
1105 user_module = types.ModuleType("__main__",
1109 doc="Automatically created module for IPython interactive environment")
1106 doc="Automatically created module for IPython interactive environment")
1110
1107
1111 # We must ensure that __builtin__ (without the final 's') is always
1108 # We must ensure that __builtin__ (without the final 's') is always
1112 # available and pointing to the __builtin__ *module*. For more details:
1109 # available and pointing to the __builtin__ *module*. For more details:
1113 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1110 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1114 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1111 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1115 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1112 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1116
1113
1117 if user_ns is None:
1114 if user_ns is None:
1118 user_ns = user_module.__dict__
1115 user_ns = user_module.__dict__
1119
1116
1120 return user_module, user_ns
1117 return user_module, user_ns
1121
1118
1122 def init_sys_modules(self):
1119 def init_sys_modules(self):
1123 # We need to insert into sys.modules something that looks like a
1120 # We need to insert into sys.modules something that looks like a
1124 # module but which accesses the IPython namespace, for shelve and
1121 # module but which accesses the IPython namespace, for shelve and
1125 # pickle to work interactively. Normally they rely on getting
1122 # pickle to work interactively. Normally they rely on getting
1126 # everything out of __main__, but for embedding purposes each IPython
1123 # everything out of __main__, but for embedding purposes each IPython
1127 # instance has its own private namespace, so we can't go shoving
1124 # instance has its own private namespace, so we can't go shoving
1128 # everything into __main__.
1125 # everything into __main__.
1129
1126
1130 # note, however, that we should only do this for non-embedded
1127 # note, however, that we should only do this for non-embedded
1131 # ipythons, which really mimic the __main__.__dict__ with their own
1128 # ipythons, which really mimic the __main__.__dict__ with their own
1132 # namespace. Embedded instances, on the other hand, should not do
1129 # namespace. Embedded instances, on the other hand, should not do
1133 # this because they need to manage the user local/global namespaces
1130 # this because they need to manage the user local/global namespaces
1134 # only, but they live within a 'normal' __main__ (meaning, they
1131 # only, but they live within a 'normal' __main__ (meaning, they
1135 # shouldn't overtake the execution environment of the script they're
1132 # shouldn't overtake the execution environment of the script they're
1136 # embedded in).
1133 # embedded in).
1137
1134
1138 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1135 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1139 main_name = self.user_module.__name__
1136 main_name = self.user_module.__name__
1140 sys.modules[main_name] = self.user_module
1137 sys.modules[main_name] = self.user_module
1141
1138
1142 def init_user_ns(self):
1139 def init_user_ns(self):
1143 """Initialize all user-visible namespaces to their minimum defaults.
1140 """Initialize all user-visible namespaces to their minimum defaults.
1144
1141
1145 Certain history lists are also initialized here, as they effectively
1142 Certain history lists are also initialized here, as they effectively
1146 act as user namespaces.
1143 act as user namespaces.
1147
1144
1148 Notes
1145 Notes
1149 -----
1146 -----
1150 All data structures here are only filled in, they are NOT reset by this
1147 All data structures here are only filled in, they are NOT reset by this
1151 method. If they were not empty before, data will simply be added to
1148 method. If they were not empty before, data will simply be added to
1152 therm.
1149 therm.
1153 """
1150 """
1154 # This function works in two parts: first we put a few things in
1151 # This function works in two parts: first we put a few things in
1155 # user_ns, and we sync that contents into user_ns_hidden so that these
1152 # user_ns, and we sync that contents into user_ns_hidden so that these
1156 # initial variables aren't shown by %who. After the sync, we add the
1153 # initial variables aren't shown by %who. After the sync, we add the
1157 # rest of what we *do* want the user to see with %who even on a new
1154 # rest of what we *do* want the user to see with %who even on a new
1158 # session (probably nothing, so they really only see their own stuff)
1155 # session (probably nothing, so they really only see their own stuff)
1159
1156
1160 # The user dict must *always* have a __builtin__ reference to the
1157 # The user dict must *always* have a __builtin__ reference to the
1161 # Python standard __builtin__ namespace, which must be imported.
1158 # Python standard __builtin__ namespace, which must be imported.
1162 # This is so that certain operations in prompt evaluation can be
1159 # This is so that certain operations in prompt evaluation can be
1163 # reliably executed with builtins. Note that we can NOT use
1160 # reliably executed with builtins. Note that we can NOT use
1164 # __builtins__ (note the 's'), because that can either be a dict or a
1161 # __builtins__ (note the 's'), because that can either be a dict or a
1165 # module, and can even mutate at runtime, depending on the context
1162 # module, and can even mutate at runtime, depending on the context
1166 # (Python makes no guarantees on it). In contrast, __builtin__ is
1163 # (Python makes no guarantees on it). In contrast, __builtin__ is
1167 # always a module object, though it must be explicitly imported.
1164 # always a module object, though it must be explicitly imported.
1168
1165
1169 # For more details:
1166 # For more details:
1170 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1167 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1171 ns = dict()
1168 ns = dict()
1172
1169
1173 # make global variables for user access to the histories
1170 # make global variables for user access to the histories
1174 ns['_ih'] = self.history_manager.input_hist_parsed
1171 ns['_ih'] = self.history_manager.input_hist_parsed
1175 ns['_oh'] = self.history_manager.output_hist
1172 ns['_oh'] = self.history_manager.output_hist
1176 ns['_dh'] = self.history_manager.dir_hist
1173 ns['_dh'] = self.history_manager.dir_hist
1177
1174
1178 ns['_sh'] = shadowns
1175 ns['_sh'] = shadowns
1179
1176
1180 # user aliases to input and output histories. These shouldn't show up
1177 # user aliases to input and output histories. These shouldn't show up
1181 # in %who, as they can have very large reprs.
1178 # in %who, as they can have very large reprs.
1182 ns['In'] = self.history_manager.input_hist_parsed
1179 ns['In'] = self.history_manager.input_hist_parsed
1183 ns['Out'] = self.history_manager.output_hist
1180 ns['Out'] = self.history_manager.output_hist
1184
1181
1185 # Store myself as the public api!!!
1182 # Store myself as the public api!!!
1186 ns['get_ipython'] = self.get_ipython
1183 ns['get_ipython'] = self.get_ipython
1187
1184
1188 ns['exit'] = self.exiter
1185 ns['exit'] = self.exiter
1189 ns['quit'] = self.exiter
1186 ns['quit'] = self.exiter
1190
1187
1191 # Sync what we've added so far to user_ns_hidden so these aren't seen
1188 # Sync what we've added so far to user_ns_hidden so these aren't seen
1192 # by %who
1189 # by %who
1193 self.user_ns_hidden.update(ns)
1190 self.user_ns_hidden.update(ns)
1194
1191
1195 # Anything put into ns now would show up in %who. Think twice before
1192 # Anything put into ns now would show up in %who. Think twice before
1196 # putting anything here, as we really want %who to show the user their
1193 # putting anything here, as we really want %who to show the user their
1197 # stuff, not our variables.
1194 # stuff, not our variables.
1198
1195
1199 # Finally, update the real user's namespace
1196 # Finally, update the real user's namespace
1200 self.user_ns.update(ns)
1197 self.user_ns.update(ns)
1201
1198
1202 @property
1199 @property
1203 def all_ns_refs(self):
1200 def all_ns_refs(self):
1204 """Get a list of references to all the namespace dictionaries in which
1201 """Get a list of references to all the namespace dictionaries in which
1205 IPython might store a user-created object.
1202 IPython might store a user-created object.
1206
1203
1207 Note that this does not include the displayhook, which also caches
1204 Note that this does not include the displayhook, which also caches
1208 objects from the output."""
1205 objects from the output."""
1209 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1206 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1210 [m.__dict__ for m in self._main_mod_cache.values()]
1207 [m.__dict__ for m in self._main_mod_cache.values()]
1211
1208
1212 def reset(self, new_session=True):
1209 def reset(self, new_session=True):
1213 """Clear all internal namespaces, and attempt to release references to
1210 """Clear all internal namespaces, and attempt to release references to
1214 user objects.
1211 user objects.
1215
1212
1216 If new_session is True, a new history session will be opened.
1213 If new_session is True, a new history session will be opened.
1217 """
1214 """
1218 # Clear histories
1215 # Clear histories
1219 self.history_manager.reset(new_session)
1216 self.history_manager.reset(new_session)
1220 # Reset counter used to index all histories
1217 # Reset counter used to index all histories
1221 if new_session:
1218 if new_session:
1222 self.execution_count = 1
1219 self.execution_count = 1
1223
1220
1224 # Flush cached output items
1221 # Flush cached output items
1225 if self.displayhook.do_full_cache:
1222 if self.displayhook.do_full_cache:
1226 self.displayhook.flush()
1223 self.displayhook.flush()
1227
1224
1228 # The main execution namespaces must be cleared very carefully,
1225 # The main execution namespaces must be cleared very carefully,
1229 # skipping the deletion of the builtin-related keys, because doing so
1226 # skipping the deletion of the builtin-related keys, because doing so
1230 # would cause errors in many object's __del__ methods.
1227 # would cause errors in many object's __del__ methods.
1231 if self.user_ns is not self.user_global_ns:
1228 if self.user_ns is not self.user_global_ns:
1232 self.user_ns.clear()
1229 self.user_ns.clear()
1233 ns = self.user_global_ns
1230 ns = self.user_global_ns
1234 drop_keys = set(ns.keys())
1231 drop_keys = set(ns.keys())
1235 drop_keys.discard('__builtin__')
1232 drop_keys.discard('__builtin__')
1236 drop_keys.discard('__builtins__')
1233 drop_keys.discard('__builtins__')
1237 drop_keys.discard('__name__')
1234 drop_keys.discard('__name__')
1238 for k in drop_keys:
1235 for k in drop_keys:
1239 del ns[k]
1236 del ns[k]
1240
1237
1241 self.user_ns_hidden.clear()
1238 self.user_ns_hidden.clear()
1242
1239
1243 # Restore the user namespaces to minimal usability
1240 # Restore the user namespaces to minimal usability
1244 self.init_user_ns()
1241 self.init_user_ns()
1245
1242
1246 # Restore the default and user aliases
1243 # Restore the default and user aliases
1247 self.alias_manager.clear_aliases()
1244 self.alias_manager.clear_aliases()
1248 self.alias_manager.init_aliases()
1245 self.alias_manager.init_aliases()
1249
1246
1250 # Flush the private list of module references kept for script
1247 # Flush the private list of module references kept for script
1251 # execution protection
1248 # execution protection
1252 self.clear_main_mod_cache()
1249 self.clear_main_mod_cache()
1253
1250
1254 def del_var(self, varname, by_name=False):
1251 def del_var(self, varname, by_name=False):
1255 """Delete a variable from the various namespaces, so that, as
1252 """Delete a variable from the various namespaces, so that, as
1256 far as possible, we're not keeping any hidden references to it.
1253 far as possible, we're not keeping any hidden references to it.
1257
1254
1258 Parameters
1255 Parameters
1259 ----------
1256 ----------
1260 varname : str
1257 varname : str
1261 The name of the variable to delete.
1258 The name of the variable to delete.
1262 by_name : bool
1259 by_name : bool
1263 If True, delete variables with the given name in each
1260 If True, delete variables with the given name in each
1264 namespace. If False (default), find the variable in the user
1261 namespace. If False (default), find the variable in the user
1265 namespace, and delete references to it.
1262 namespace, and delete references to it.
1266 """
1263 """
1267 if varname in ('__builtin__', '__builtins__'):
1264 if varname in ('__builtin__', '__builtins__'):
1268 raise ValueError("Refusing to delete %s" % varname)
1265 raise ValueError("Refusing to delete %s" % varname)
1269
1266
1270 ns_refs = self.all_ns_refs
1267 ns_refs = self.all_ns_refs
1271
1268
1272 if by_name: # Delete by name
1269 if by_name: # Delete by name
1273 for ns in ns_refs:
1270 for ns in ns_refs:
1274 try:
1271 try:
1275 del ns[varname]
1272 del ns[varname]
1276 except KeyError:
1273 except KeyError:
1277 pass
1274 pass
1278 else: # Delete by object
1275 else: # Delete by object
1279 try:
1276 try:
1280 obj = self.user_ns[varname]
1277 obj = self.user_ns[varname]
1281 except KeyError:
1278 except KeyError:
1282 raise NameError("name '%s' is not defined" % varname)
1279 raise NameError("name '%s' is not defined" % varname)
1283 # Also check in output history
1280 # Also check in output history
1284 ns_refs.append(self.history_manager.output_hist)
1281 ns_refs.append(self.history_manager.output_hist)
1285 for ns in ns_refs:
1282 for ns in ns_refs:
1286 to_delete = [n for n, o in iteritems(ns) if o is obj]
1283 to_delete = [n for n, o in iteritems(ns) if o is obj]
1287 for name in to_delete:
1284 for name in to_delete:
1288 del ns[name]
1285 del ns[name]
1289
1286
1290 # displayhook keeps extra references, but not in a dictionary
1287 # displayhook keeps extra references, but not in a dictionary
1291 for name in ('_', '__', '___'):
1288 for name in ('_', '__', '___'):
1292 if getattr(self.displayhook, name) is obj:
1289 if getattr(self.displayhook, name) is obj:
1293 setattr(self.displayhook, name, None)
1290 setattr(self.displayhook, name, None)
1294
1291
1295 def reset_selective(self, regex=None):
1292 def reset_selective(self, regex=None):
1296 """Clear selective variables from internal namespaces based on a
1293 """Clear selective variables from internal namespaces based on a
1297 specified regular expression.
1294 specified regular expression.
1298
1295
1299 Parameters
1296 Parameters
1300 ----------
1297 ----------
1301 regex : string or compiled pattern, optional
1298 regex : string or compiled pattern, optional
1302 A regular expression pattern that will be used in searching
1299 A regular expression pattern that will be used in searching
1303 variable names in the users namespaces.
1300 variable names in the users namespaces.
1304 """
1301 """
1305 if regex is not None:
1302 if regex is not None:
1306 try:
1303 try:
1307 m = re.compile(regex)
1304 m = re.compile(regex)
1308 except TypeError:
1305 except TypeError:
1309 raise TypeError('regex must be a string or compiled pattern')
1306 raise TypeError('regex must be a string or compiled pattern')
1310 # Search for keys in each namespace that match the given regex
1307 # Search for keys in each namespace that match the given regex
1311 # If a match is found, delete the key/value pair.
1308 # If a match is found, delete the key/value pair.
1312 for ns in self.all_ns_refs:
1309 for ns in self.all_ns_refs:
1313 for var in ns:
1310 for var in ns:
1314 if m.search(var):
1311 if m.search(var):
1315 del ns[var]
1312 del ns[var]
1316
1313
1317 def push(self, variables, interactive=True):
1314 def push(self, variables, interactive=True):
1318 """Inject a group of variables into the IPython user namespace.
1315 """Inject a group of variables into the IPython user namespace.
1319
1316
1320 Parameters
1317 Parameters
1321 ----------
1318 ----------
1322 variables : dict, str or list/tuple of str
1319 variables : dict, str or list/tuple of str
1323 The variables to inject into the user's namespace. If a dict, a
1320 The variables to inject into the user's namespace. If a dict, a
1324 simple update is done. If a str, the string is assumed to have
1321 simple update is done. If a str, the string is assumed to have
1325 variable names separated by spaces. A list/tuple of str can also
1322 variable names separated by spaces. A list/tuple of str can also
1326 be used to give the variable names. If just the variable names are
1323 be used to give the variable names. If just the variable names are
1327 give (list/tuple/str) then the variable values looked up in the
1324 give (list/tuple/str) then the variable values looked up in the
1328 callers frame.
1325 callers frame.
1329 interactive : bool
1326 interactive : bool
1330 If True (default), the variables will be listed with the ``who``
1327 If True (default), the variables will be listed with the ``who``
1331 magic.
1328 magic.
1332 """
1329 """
1333 vdict = None
1330 vdict = None
1334
1331
1335 # We need a dict of name/value pairs to do namespace updates.
1332 # We need a dict of name/value pairs to do namespace updates.
1336 if isinstance(variables, dict):
1333 if isinstance(variables, dict):
1337 vdict = variables
1334 vdict = variables
1338 elif isinstance(variables, string_types+(list, tuple)):
1335 elif isinstance(variables, string_types+(list, tuple)):
1339 if isinstance(variables, string_types):
1336 if isinstance(variables, string_types):
1340 vlist = variables.split()
1337 vlist = variables.split()
1341 else:
1338 else:
1342 vlist = variables
1339 vlist = variables
1343 vdict = {}
1340 vdict = {}
1344 cf = sys._getframe(1)
1341 cf = sys._getframe(1)
1345 for name in vlist:
1342 for name in vlist:
1346 try:
1343 try:
1347 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1344 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1348 except:
1345 except:
1349 print('Could not get variable %s from %s' %
1346 print('Could not get variable %s from %s' %
1350 (name,cf.f_code.co_name))
1347 (name,cf.f_code.co_name))
1351 else:
1348 else:
1352 raise ValueError('variables must be a dict/str/list/tuple')
1349 raise ValueError('variables must be a dict/str/list/tuple')
1353
1350
1354 # Propagate variables to user namespace
1351 # Propagate variables to user namespace
1355 self.user_ns.update(vdict)
1352 self.user_ns.update(vdict)
1356
1353
1357 # And configure interactive visibility
1354 # And configure interactive visibility
1358 user_ns_hidden = self.user_ns_hidden
1355 user_ns_hidden = self.user_ns_hidden
1359 if interactive:
1356 if interactive:
1360 for name in vdict:
1357 for name in vdict:
1361 user_ns_hidden.pop(name, None)
1358 user_ns_hidden.pop(name, None)
1362 else:
1359 else:
1363 user_ns_hidden.update(vdict)
1360 user_ns_hidden.update(vdict)
1364
1361
1365 def drop_by_id(self, variables):
1362 def drop_by_id(self, variables):
1366 """Remove a dict of variables from the user namespace, if they are the
1363 """Remove a dict of variables from the user namespace, if they are the
1367 same as the values in the dictionary.
1364 same as the values in the dictionary.
1368
1365
1369 This is intended for use by extensions: variables that they've added can
1366 This is intended for use by extensions: variables that they've added can
1370 be taken back out if they are unloaded, without removing any that the
1367 be taken back out if they are unloaded, without removing any that the
1371 user has overwritten.
1368 user has overwritten.
1372
1369
1373 Parameters
1370 Parameters
1374 ----------
1371 ----------
1375 variables : dict
1372 variables : dict
1376 A dictionary mapping object names (as strings) to the objects.
1373 A dictionary mapping object names (as strings) to the objects.
1377 """
1374 """
1378 for name, obj in iteritems(variables):
1375 for name, obj in iteritems(variables):
1379 if name in self.user_ns and self.user_ns[name] is obj:
1376 if name in self.user_ns and self.user_ns[name] is obj:
1380 del self.user_ns[name]
1377 del self.user_ns[name]
1381 self.user_ns_hidden.pop(name, None)
1378 self.user_ns_hidden.pop(name, None)
1382
1379
1383 #-------------------------------------------------------------------------
1380 #-------------------------------------------------------------------------
1384 # Things related to object introspection
1381 # Things related to object introspection
1385 #-------------------------------------------------------------------------
1382 #-------------------------------------------------------------------------
1386
1383
1387 def _ofind(self, oname, namespaces=None):
1384 def _ofind(self, oname, namespaces=None):
1388 """Find an object in the available namespaces.
1385 """Find an object in the available namespaces.
1389
1386
1390 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1387 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1391
1388
1392 Has special code to detect magic functions.
1389 Has special code to detect magic functions.
1393 """
1390 """
1394 oname = oname.strip()
1391 oname = oname.strip()
1395 #print '1- oname: <%r>' % oname # dbg
1392 #print '1- oname: <%r>' % oname # dbg
1396 if not oname.startswith(ESC_MAGIC) and \
1393 if not oname.startswith(ESC_MAGIC) and \
1397 not oname.startswith(ESC_MAGIC2) and \
1394 not oname.startswith(ESC_MAGIC2) and \
1398 not py3compat.isidentifier(oname, dotted=True):
1395 not py3compat.isidentifier(oname, dotted=True):
1399 return dict(found=False)
1396 return dict(found=False)
1400
1397
1401 if namespaces is None:
1398 if namespaces is None:
1402 # Namespaces to search in:
1399 # Namespaces to search in:
1403 # Put them in a list. The order is important so that we
1400 # Put them in a list. The order is important so that we
1404 # find things in the same order that Python finds them.
1401 # find things in the same order that Python finds them.
1405 namespaces = [ ('Interactive', self.user_ns),
1402 namespaces = [ ('Interactive', self.user_ns),
1406 ('Interactive (global)', self.user_global_ns),
1403 ('Interactive (global)', self.user_global_ns),
1407 ('Python builtin', builtin_mod.__dict__),
1404 ('Python builtin', builtin_mod.__dict__),
1408 ]
1405 ]
1409
1406
1410 # initialize results to 'null'
1407 # initialize results to 'null'
1411 found = False; obj = None; ospace = None;
1408 found = False; obj = None; ospace = None;
1412 ismagic = False; isalias = False; parent = None
1409 ismagic = False; isalias = False; parent = None
1413
1410
1414 # We need to special-case 'print', which as of python2.6 registers as a
1411 # We need to special-case 'print', which as of python2.6 registers as a
1415 # function but should only be treated as one if print_function was
1412 # function but should only be treated as one if print_function was
1416 # loaded with a future import. In this case, just bail.
1413 # loaded with a future import. In this case, just bail.
1417 if (oname == 'print' and not py3compat.PY3 and not \
1414 if (oname == 'print' and not py3compat.PY3 and not \
1418 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1415 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1419 return {'found':found, 'obj':obj, 'namespace':ospace,
1416 return {'found':found, 'obj':obj, 'namespace':ospace,
1420 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1417 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1421
1418
1422 # Look for the given name by splitting it in parts. If the head is
1419 # Look for the given name by splitting it in parts. If the head is
1423 # found, then we look for all the remaining parts as members, and only
1420 # found, then we look for all the remaining parts as members, and only
1424 # declare success if we can find them all.
1421 # declare success if we can find them all.
1425 oname_parts = oname.split('.')
1422 oname_parts = oname.split('.')
1426 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1423 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1427 for nsname,ns in namespaces:
1424 for nsname,ns in namespaces:
1428 try:
1425 try:
1429 obj = ns[oname_head]
1426 obj = ns[oname_head]
1430 except KeyError:
1427 except KeyError:
1431 continue
1428 continue
1432 else:
1429 else:
1433 #print 'oname_rest:', oname_rest # dbg
1430 #print 'oname_rest:', oname_rest # dbg
1434 for idx, part in enumerate(oname_rest):
1431 for idx, part in enumerate(oname_rest):
1435 try:
1432 try:
1436 parent = obj
1433 parent = obj
1437 # The last part is looked up in a special way to avoid
1434 # The last part is looked up in a special way to avoid
1438 # descriptor invocation as it may raise or have side
1435 # descriptor invocation as it may raise or have side
1439 # effects.
1436 # effects.
1440 if idx == len(oname_rest) - 1:
1437 if idx == len(oname_rest) - 1:
1441 obj = self._getattr_property(obj, part)
1438 obj = self._getattr_property(obj, part)
1442 else:
1439 else:
1443 obj = getattr(obj, part)
1440 obj = getattr(obj, part)
1444 except:
1441 except:
1445 # Blanket except b/c some badly implemented objects
1442 # Blanket except b/c some badly implemented objects
1446 # allow __getattr__ to raise exceptions other than
1443 # allow __getattr__ to raise exceptions other than
1447 # AttributeError, which then crashes IPython.
1444 # AttributeError, which then crashes IPython.
1448 break
1445 break
1449 else:
1446 else:
1450 # If we finish the for loop (no break), we got all members
1447 # If we finish the for loop (no break), we got all members
1451 found = True
1448 found = True
1452 ospace = nsname
1449 ospace = nsname
1453 break # namespace loop
1450 break # namespace loop
1454
1451
1455 # Try to see if it's magic
1452 # Try to see if it's magic
1456 if not found:
1453 if not found:
1457 obj = None
1454 obj = None
1458 if oname.startswith(ESC_MAGIC2):
1455 if oname.startswith(ESC_MAGIC2):
1459 oname = oname.lstrip(ESC_MAGIC2)
1456 oname = oname.lstrip(ESC_MAGIC2)
1460 obj = self.find_cell_magic(oname)
1457 obj = self.find_cell_magic(oname)
1461 elif oname.startswith(ESC_MAGIC):
1458 elif oname.startswith(ESC_MAGIC):
1462 oname = oname.lstrip(ESC_MAGIC)
1459 oname = oname.lstrip(ESC_MAGIC)
1463 obj = self.find_line_magic(oname)
1460 obj = self.find_line_magic(oname)
1464 else:
1461 else:
1465 # search without prefix, so run? will find %run?
1462 # search without prefix, so run? will find %run?
1466 obj = self.find_line_magic(oname)
1463 obj = self.find_line_magic(oname)
1467 if obj is None:
1464 if obj is None:
1468 obj = self.find_cell_magic(oname)
1465 obj = self.find_cell_magic(oname)
1469 if obj is not None:
1466 if obj is not None:
1470 found = True
1467 found = True
1471 ospace = 'IPython internal'
1468 ospace = 'IPython internal'
1472 ismagic = True
1469 ismagic = True
1473 isalias = isinstance(obj, Alias)
1470 isalias = isinstance(obj, Alias)
1474
1471
1475 # Last try: special-case some literals like '', [], {}, etc:
1472 # Last try: special-case some literals like '', [], {}, etc:
1476 if not found and oname_head in ["''",'""','[]','{}','()']:
1473 if not found and oname_head in ["''",'""','[]','{}','()']:
1477 obj = eval(oname_head)
1474 obj = eval(oname_head)
1478 found = True
1475 found = True
1479 ospace = 'Interactive'
1476 ospace = 'Interactive'
1480
1477
1481 return {'found':found, 'obj':obj, 'namespace':ospace,
1478 return {'found':found, 'obj':obj, 'namespace':ospace,
1482 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1479 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1483
1480
1484 @staticmethod
1481 @staticmethod
1485 def _getattr_property(obj, attrname):
1482 def _getattr_property(obj, attrname):
1486 """Property-aware getattr to use in object finding.
1483 """Property-aware getattr to use in object finding.
1487
1484
1488 If attrname represents a property, return it unevaluated (in case it has
1485 If attrname represents a property, return it unevaluated (in case it has
1489 side effects or raises an error.
1486 side effects or raises an error.
1490
1487
1491 """
1488 """
1492 if not isinstance(obj, type):
1489 if not isinstance(obj, type):
1493 try:
1490 try:
1494 # `getattr(type(obj), attrname)` is not guaranteed to return
1491 # `getattr(type(obj), attrname)` is not guaranteed to return
1495 # `obj`, but does so for property:
1492 # `obj`, but does so for property:
1496 #
1493 #
1497 # property.__get__(self, None, cls) -> self
1494 # property.__get__(self, None, cls) -> self
1498 #
1495 #
1499 # The universal alternative is to traverse the mro manually
1496 # The universal alternative is to traverse the mro manually
1500 # searching for attrname in class dicts.
1497 # searching for attrname in class dicts.
1501 attr = getattr(type(obj), attrname)
1498 attr = getattr(type(obj), attrname)
1502 except AttributeError:
1499 except AttributeError:
1503 pass
1500 pass
1504 else:
1501 else:
1505 # This relies on the fact that data descriptors (with both
1502 # This relies on the fact that data descriptors (with both
1506 # __get__ & __set__ magic methods) take precedence over
1503 # __get__ & __set__ magic methods) take precedence over
1507 # instance-level attributes:
1504 # instance-level attributes:
1508 #
1505 #
1509 # class A(object):
1506 # class A(object):
1510 # @property
1507 # @property
1511 # def foobar(self): return 123
1508 # def foobar(self): return 123
1512 # a = A()
1509 # a = A()
1513 # a.__dict__['foobar'] = 345
1510 # a.__dict__['foobar'] = 345
1514 # a.foobar # == 123
1511 # a.foobar # == 123
1515 #
1512 #
1516 # So, a property may be returned right away.
1513 # So, a property may be returned right away.
1517 if isinstance(attr, property):
1514 if isinstance(attr, property):
1518 return attr
1515 return attr
1519
1516
1520 # Nothing helped, fall back.
1517 # Nothing helped, fall back.
1521 return getattr(obj, attrname)
1518 return getattr(obj, attrname)
1522
1519
1523 def _object_find(self, oname, namespaces=None):
1520 def _object_find(self, oname, namespaces=None):
1524 """Find an object and return a struct with info about it."""
1521 """Find an object and return a struct with info about it."""
1525 return Struct(self._ofind(oname, namespaces))
1522 return Struct(self._ofind(oname, namespaces))
1526
1523
1527 def _inspect(self, meth, oname, namespaces=None, **kw):
1524 def _inspect(self, meth, oname, namespaces=None, **kw):
1528 """Generic interface to the inspector system.
1525 """Generic interface to the inspector system.
1529
1526
1530 This function is meant to be called by pdef, pdoc & friends."""
1527 This function is meant to be called by pdef, pdoc & friends."""
1531 info = self._object_find(oname, namespaces)
1528 info = self._object_find(oname, namespaces)
1532 if info.found:
1529 if info.found:
1533 pmethod = getattr(self.inspector, meth)
1530 pmethod = getattr(self.inspector, meth)
1534 formatter = format_screen if info.ismagic else None
1531 formatter = format_screen if info.ismagic else None
1535 if meth == 'pdoc':
1532 if meth == 'pdoc':
1536 pmethod(info.obj, oname, formatter)
1533 pmethod(info.obj, oname, formatter)
1537 elif meth == 'pinfo':
1534 elif meth == 'pinfo':
1538 pmethod(info.obj, oname, formatter, info, **kw)
1535 pmethod(info.obj, oname, formatter, info, **kw)
1539 else:
1536 else:
1540 pmethod(info.obj, oname)
1537 pmethod(info.obj, oname)
1541 else:
1538 else:
1542 print('Object `%s` not found.' % oname)
1539 print('Object `%s` not found.' % oname)
1543 return 'not found' # so callers can take other action
1540 return 'not found' # so callers can take other action
1544
1541
1545 def object_inspect(self, oname, detail_level=0):
1542 def object_inspect(self, oname, detail_level=0):
1546 """Get object info about oname"""
1543 """Get object info about oname"""
1547 with self.builtin_trap:
1544 with self.builtin_trap:
1548 info = self._object_find(oname)
1545 info = self._object_find(oname)
1549 if info.found:
1546 if info.found:
1550 return self.inspector.info(info.obj, oname, info=info,
1547 return self.inspector.info(info.obj, oname, info=info,
1551 detail_level=detail_level
1548 detail_level=detail_level
1552 )
1549 )
1553 else:
1550 else:
1554 return oinspect.object_info(name=oname, found=False)
1551 return oinspect.object_info(name=oname, found=False)
1555
1552
1556 def object_inspect_text(self, oname, detail_level=0):
1553 def object_inspect_text(self, oname, detail_level=0):
1557 """Get object info as formatted text"""
1554 """Get object info as formatted text"""
1558 with self.builtin_trap:
1555 with self.builtin_trap:
1559 info = self._object_find(oname)
1556 info = self._object_find(oname)
1560 if info.found:
1557 if info.found:
1561 return self.inspector._format_info(info.obj, oname, info=info,
1558 return self.inspector._format_info(info.obj, oname, info=info,
1562 detail_level=detail_level
1559 detail_level=detail_level
1563 )
1560 )
1564 else:
1561 else:
1565 raise KeyError(oname)
1562 raise KeyError(oname)
1566
1563
1567 #-------------------------------------------------------------------------
1564 #-------------------------------------------------------------------------
1568 # Things related to history management
1565 # Things related to history management
1569 #-------------------------------------------------------------------------
1566 #-------------------------------------------------------------------------
1570
1567
1571 def init_history(self):
1568 def init_history(self):
1572 """Sets up the command history, and starts regular autosaves."""
1569 """Sets up the command history, and starts regular autosaves."""
1573 self.history_manager = HistoryManager(shell=self, parent=self)
1570 self.history_manager = HistoryManager(shell=self, parent=self)
1574 self.configurables.append(self.history_manager)
1571 self.configurables.append(self.history_manager)
1575
1572
1576 #-------------------------------------------------------------------------
1573 #-------------------------------------------------------------------------
1577 # Things related to exception handling and tracebacks (not debugging)
1574 # Things related to exception handling and tracebacks (not debugging)
1578 #-------------------------------------------------------------------------
1575 #-------------------------------------------------------------------------
1579
1576
1580 debugger_cls = Pdb
1577 debugger_cls = Pdb
1581
1578
1582 def init_traceback_handlers(self, custom_exceptions):
1579 def init_traceback_handlers(self, custom_exceptions):
1583 # Syntax error handler.
1580 # Syntax error handler.
1584 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1581 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1585
1582
1586 # The interactive one is initialized with an offset, meaning we always
1583 # The interactive one is initialized with an offset, meaning we always
1587 # want to remove the topmost item in the traceback, which is our own
1584 # want to remove the topmost item in the traceback, which is our own
1588 # internal code. Valid modes: ['Plain','Context','Verbose']
1585 # internal code. Valid modes: ['Plain','Context','Verbose']
1589 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1586 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1590 color_scheme='NoColor',
1587 color_scheme='NoColor',
1591 tb_offset = 1,
1588 tb_offset = 1,
1592 check_cache=check_linecache_ipython,
1589 check_cache=check_linecache_ipython,
1593 debugger_cls=self.debugger_cls)
1590 debugger_cls=self.debugger_cls)
1594
1591
1595 # The instance will store a pointer to the system-wide exception hook,
1592 # The instance will store a pointer to the system-wide exception hook,
1596 # so that runtime code (such as magics) can access it. This is because
1593 # so that runtime code (such as magics) can access it. This is because
1597 # during the read-eval loop, it may get temporarily overwritten.
1594 # during the read-eval loop, it may get temporarily overwritten.
1598 self.sys_excepthook = sys.excepthook
1595 self.sys_excepthook = sys.excepthook
1599
1596
1600 # and add any custom exception handlers the user may have specified
1597 # and add any custom exception handlers the user may have specified
1601 self.set_custom_exc(*custom_exceptions)
1598 self.set_custom_exc(*custom_exceptions)
1602
1599
1603 # Set the exception mode
1600 # Set the exception mode
1604 self.InteractiveTB.set_mode(mode=self.xmode)
1601 self.InteractiveTB.set_mode(mode=self.xmode)
1605
1602
1606 def set_custom_exc(self, exc_tuple, handler):
1603 def set_custom_exc(self, exc_tuple, handler):
1607 """set_custom_exc(exc_tuple,handler)
1604 """set_custom_exc(exc_tuple,handler)
1608
1605
1609 Set a custom exception handler, which will be called if any of the
1606 Set a custom exception handler, which will be called if any of the
1610 exceptions in exc_tuple occur in the mainloop (specifically, in the
1607 exceptions in exc_tuple occur in the mainloop (specifically, in the
1611 run_code() method).
1608 run_code() method).
1612
1609
1613 Parameters
1610 Parameters
1614 ----------
1611 ----------
1615
1612
1616 exc_tuple : tuple of exception classes
1613 exc_tuple : tuple of exception classes
1617 A *tuple* of exception classes, for which to call the defined
1614 A *tuple* of exception classes, for which to call the defined
1618 handler. It is very important that you use a tuple, and NOT A
1615 handler. It is very important that you use a tuple, and NOT A
1619 LIST here, because of the way Python's except statement works. If
1616 LIST here, because of the way Python's except statement works. If
1620 you only want to trap a single exception, use a singleton tuple::
1617 you only want to trap a single exception, use a singleton tuple::
1621
1618
1622 exc_tuple == (MyCustomException,)
1619 exc_tuple == (MyCustomException,)
1623
1620
1624 handler : callable
1621 handler : callable
1625 handler must have the following signature::
1622 handler must have the following signature::
1626
1623
1627 def my_handler(self, etype, value, tb, tb_offset=None):
1624 def my_handler(self, etype, value, tb, tb_offset=None):
1628 ...
1625 ...
1629 return structured_traceback
1626 return structured_traceback
1630
1627
1631 Your handler must return a structured traceback (a list of strings),
1628 Your handler must return a structured traceback (a list of strings),
1632 or None.
1629 or None.
1633
1630
1634 This will be made into an instance method (via types.MethodType)
1631 This will be made into an instance method (via types.MethodType)
1635 of IPython itself, and it will be called if any of the exceptions
1632 of IPython itself, and it will be called if any of the exceptions
1636 listed in the exc_tuple are caught. If the handler is None, an
1633 listed in the exc_tuple are caught. If the handler is None, an
1637 internal basic one is used, which just prints basic info.
1634 internal basic one is used, which just prints basic info.
1638
1635
1639 To protect IPython from crashes, if your handler ever raises an
1636 To protect IPython from crashes, if your handler ever raises an
1640 exception or returns an invalid result, it will be immediately
1637 exception or returns an invalid result, it will be immediately
1641 disabled.
1638 disabled.
1642
1639
1643 WARNING: by putting in your own exception handler into IPython's main
1640 WARNING: by putting in your own exception handler into IPython's main
1644 execution loop, you run a very good chance of nasty crashes. This
1641 execution loop, you run a very good chance of nasty crashes. This
1645 facility should only be used if you really know what you are doing."""
1642 facility should only be used if you really know what you are doing."""
1646
1643
1647 assert type(exc_tuple)==type(()) , \
1644 assert type(exc_tuple)==type(()) , \
1648 "The custom exceptions must be given AS A TUPLE."
1645 "The custom exceptions must be given AS A TUPLE."
1649
1646
1650 def dummy_handler(self,etype,value,tb,tb_offset=None):
1647 def dummy_handler(self,etype,value,tb,tb_offset=None):
1651 print('*** Simple custom exception handler ***')
1648 print('*** Simple custom exception handler ***')
1652 print('Exception type :',etype)
1649 print('Exception type :',etype)
1653 print('Exception value:',value)
1650 print('Exception value:',value)
1654 print('Traceback :',tb)
1651 print('Traceback :',tb)
1655 #print 'Source code :','\n'.join(self.buffer)
1652 #print 'Source code :','\n'.join(self.buffer)
1656
1653
1657 def validate_stb(stb):
1654 def validate_stb(stb):
1658 """validate structured traceback return type
1655 """validate structured traceback return type
1659
1656
1660 return type of CustomTB *should* be a list of strings, but allow
1657 return type of CustomTB *should* be a list of strings, but allow
1661 single strings or None, which are harmless.
1658 single strings or None, which are harmless.
1662
1659
1663 This function will *always* return a list of strings,
1660 This function will *always* return a list of strings,
1664 and will raise a TypeError if stb is inappropriate.
1661 and will raise a TypeError if stb is inappropriate.
1665 """
1662 """
1666 msg = "CustomTB must return list of strings, not %r" % stb
1663 msg = "CustomTB must return list of strings, not %r" % stb
1667 if stb is None:
1664 if stb is None:
1668 return []
1665 return []
1669 elif isinstance(stb, string_types):
1666 elif isinstance(stb, string_types):
1670 return [stb]
1667 return [stb]
1671 elif not isinstance(stb, list):
1668 elif not isinstance(stb, list):
1672 raise TypeError(msg)
1669 raise TypeError(msg)
1673 # it's a list
1670 # it's a list
1674 for line in stb:
1671 for line in stb:
1675 # check every element
1672 # check every element
1676 if not isinstance(line, string_types):
1673 if not isinstance(line, string_types):
1677 raise TypeError(msg)
1674 raise TypeError(msg)
1678 return stb
1675 return stb
1679
1676
1680 if handler is None:
1677 if handler is None:
1681 wrapped = dummy_handler
1678 wrapped = dummy_handler
1682 else:
1679 else:
1683 def wrapped(self,etype,value,tb,tb_offset=None):
1680 def wrapped(self,etype,value,tb,tb_offset=None):
1684 """wrap CustomTB handler, to protect IPython from user code
1681 """wrap CustomTB handler, to protect IPython from user code
1685
1682
1686 This makes it harder (but not impossible) for custom exception
1683 This makes it harder (but not impossible) for custom exception
1687 handlers to crash IPython.
1684 handlers to crash IPython.
1688 """
1685 """
1689 try:
1686 try:
1690 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1687 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1691 return validate_stb(stb)
1688 return validate_stb(stb)
1692 except:
1689 except:
1693 # clear custom handler immediately
1690 # clear custom handler immediately
1694 self.set_custom_exc((), None)
1691 self.set_custom_exc((), None)
1695 print("Custom TB Handler failed, unregistering", file=sys.stderr)
1692 print("Custom TB Handler failed, unregistering", file=sys.stderr)
1696 # show the exception in handler first
1693 # show the exception in handler first
1697 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1694 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1698 print(self.InteractiveTB.stb2text(stb))
1695 print(self.InteractiveTB.stb2text(stb))
1699 print("The original exception:")
1696 print("The original exception:")
1700 stb = self.InteractiveTB.structured_traceback(
1697 stb = self.InteractiveTB.structured_traceback(
1701 (etype,value,tb), tb_offset=tb_offset
1698 (etype,value,tb), tb_offset=tb_offset
1702 )
1699 )
1703 return stb
1700 return stb
1704
1701
1705 self.CustomTB = types.MethodType(wrapped,self)
1702 self.CustomTB = types.MethodType(wrapped,self)
1706 self.custom_exceptions = exc_tuple
1703 self.custom_exceptions = exc_tuple
1707
1704
1708 def excepthook(self, etype, value, tb):
1705 def excepthook(self, etype, value, tb):
1709 """One more defense for GUI apps that call sys.excepthook.
1706 """One more defense for GUI apps that call sys.excepthook.
1710
1707
1711 GUI frameworks like wxPython trap exceptions and call
1708 GUI frameworks like wxPython trap exceptions and call
1712 sys.excepthook themselves. I guess this is a feature that
1709 sys.excepthook themselves. I guess this is a feature that
1713 enables them to keep running after exceptions that would
1710 enables them to keep running after exceptions that would
1714 otherwise kill their mainloop. This is a bother for IPython
1711 otherwise kill their mainloop. This is a bother for IPython
1715 which excepts to catch all of the program exceptions with a try:
1712 which excepts to catch all of the program exceptions with a try:
1716 except: statement.
1713 except: statement.
1717
1714
1718 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1715 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1719 any app directly invokes sys.excepthook, it will look to the user like
1716 any app directly invokes sys.excepthook, it will look to the user like
1720 IPython crashed. In order to work around this, we can disable the
1717 IPython crashed. In order to work around this, we can disable the
1721 CrashHandler and replace it with this excepthook instead, which prints a
1718 CrashHandler and replace it with this excepthook instead, which prints a
1722 regular traceback using our InteractiveTB. In this fashion, apps which
1719 regular traceback using our InteractiveTB. In this fashion, apps which
1723 call sys.excepthook will generate a regular-looking exception from
1720 call sys.excepthook will generate a regular-looking exception from
1724 IPython, and the CrashHandler will only be triggered by real IPython
1721 IPython, and the CrashHandler will only be triggered by real IPython
1725 crashes.
1722 crashes.
1726
1723
1727 This hook should be used sparingly, only in places which are not likely
1724 This hook should be used sparingly, only in places which are not likely
1728 to be true IPython errors.
1725 to be true IPython errors.
1729 """
1726 """
1730 self.showtraceback((etype, value, tb), tb_offset=0)
1727 self.showtraceback((etype, value, tb), tb_offset=0)
1731
1728
1732 def _get_exc_info(self, exc_tuple=None):
1729 def _get_exc_info(self, exc_tuple=None):
1733 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1730 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1734
1731
1735 Ensures sys.last_type,value,traceback hold the exc_info we found,
1732 Ensures sys.last_type,value,traceback hold the exc_info we found,
1736 from whichever source.
1733 from whichever source.
1737
1734
1738 raises ValueError if none of these contain any information
1735 raises ValueError if none of these contain any information
1739 """
1736 """
1740 if exc_tuple is None:
1737 if exc_tuple is None:
1741 etype, value, tb = sys.exc_info()
1738 etype, value, tb = sys.exc_info()
1742 else:
1739 else:
1743 etype, value, tb = exc_tuple
1740 etype, value, tb = exc_tuple
1744
1741
1745 if etype is None:
1742 if etype is None:
1746 if hasattr(sys, 'last_type'):
1743 if hasattr(sys, 'last_type'):
1747 etype, value, tb = sys.last_type, sys.last_value, \
1744 etype, value, tb = sys.last_type, sys.last_value, \
1748 sys.last_traceback
1745 sys.last_traceback
1749
1746
1750 if etype is None:
1747 if etype is None:
1751 raise ValueError("No exception to find")
1748 raise ValueError("No exception to find")
1752
1749
1753 # Now store the exception info in sys.last_type etc.
1750 # Now store the exception info in sys.last_type etc.
1754 # WARNING: these variables are somewhat deprecated and not
1751 # WARNING: these variables are somewhat deprecated and not
1755 # necessarily safe to use in a threaded environment, but tools
1752 # necessarily safe to use in a threaded environment, but tools
1756 # like pdb depend on their existence, so let's set them. If we
1753 # like pdb depend on their existence, so let's set them. If we
1757 # find problems in the field, we'll need to revisit their use.
1754 # find problems in the field, we'll need to revisit their use.
1758 sys.last_type = etype
1755 sys.last_type = etype
1759 sys.last_value = value
1756 sys.last_value = value
1760 sys.last_traceback = tb
1757 sys.last_traceback = tb
1761
1758
1762 return etype, value, tb
1759 return etype, value, tb
1763
1760
1764 def show_usage_error(self, exc):
1761 def show_usage_error(self, exc):
1765 """Show a short message for UsageErrors
1762 """Show a short message for UsageErrors
1766
1763
1767 These are special exceptions that shouldn't show a traceback.
1764 These are special exceptions that shouldn't show a traceback.
1768 """
1765 """
1769 print("UsageError: %s" % exc, file=sys.stderr)
1766 print("UsageError: %s" % exc, file=sys.stderr)
1770
1767
1771 def get_exception_only(self, exc_tuple=None):
1768 def get_exception_only(self, exc_tuple=None):
1772 """
1769 """
1773 Return as a string (ending with a newline) the exception that
1770 Return as a string (ending with a newline) the exception that
1774 just occurred, without any traceback.
1771 just occurred, without any traceback.
1775 """
1772 """
1776 etype, value, tb = self._get_exc_info(exc_tuple)
1773 etype, value, tb = self._get_exc_info(exc_tuple)
1777 msg = traceback.format_exception_only(etype, value)
1774 msg = traceback.format_exception_only(etype, value)
1778 return ''.join(msg)
1775 return ''.join(msg)
1779
1776
1780 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
1777 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
1781 exception_only=False):
1778 exception_only=False):
1782 """Display the exception that just occurred.
1779 """Display the exception that just occurred.
1783
1780
1784 If nothing is known about the exception, this is the method which
1781 If nothing is known about the exception, this is the method which
1785 should be used throughout the code for presenting user tracebacks,
1782 should be used throughout the code for presenting user tracebacks,
1786 rather than directly invoking the InteractiveTB object.
1783 rather than directly invoking the InteractiveTB object.
1787
1784
1788 A specific showsyntaxerror() also exists, but this method can take
1785 A specific showsyntaxerror() also exists, but this method can take
1789 care of calling it if needed, so unless you are explicitly catching a
1786 care of calling it if needed, so unless you are explicitly catching a
1790 SyntaxError exception, don't try to analyze the stack manually and
1787 SyntaxError exception, don't try to analyze the stack manually and
1791 simply call this method."""
1788 simply call this method."""
1792
1789
1793 try:
1790 try:
1794 try:
1791 try:
1795 etype, value, tb = self._get_exc_info(exc_tuple)
1792 etype, value, tb = self._get_exc_info(exc_tuple)
1796 except ValueError:
1793 except ValueError:
1797 print('No traceback available to show.', file=sys.stderr)
1794 print('No traceback available to show.', file=sys.stderr)
1798 return
1795 return
1799
1796
1800 if issubclass(etype, SyntaxError):
1797 if issubclass(etype, SyntaxError):
1801 # Though this won't be called by syntax errors in the input
1798 # Though this won't be called by syntax errors in the input
1802 # line, there may be SyntaxError cases with imported code.
1799 # line, there may be SyntaxError cases with imported code.
1803 self.showsyntaxerror(filename)
1800 self.showsyntaxerror(filename)
1804 elif etype is UsageError:
1801 elif etype is UsageError:
1805 self.show_usage_error(value)
1802 self.show_usage_error(value)
1806 else:
1803 else:
1807 if exception_only:
1804 if exception_only:
1808 stb = ['An exception has occurred, use %tb to see '
1805 stb = ['An exception has occurred, use %tb to see '
1809 'the full traceback.\n']
1806 'the full traceback.\n']
1810 stb.extend(self.InteractiveTB.get_exception_only(etype,
1807 stb.extend(self.InteractiveTB.get_exception_only(etype,
1811 value))
1808 value))
1812 else:
1809 else:
1813 try:
1810 try:
1814 # Exception classes can customise their traceback - we
1811 # Exception classes can customise their traceback - we
1815 # use this in IPython.parallel for exceptions occurring
1812 # use this in IPython.parallel for exceptions occurring
1816 # in the engines. This should return a list of strings.
1813 # in the engines. This should return a list of strings.
1817 stb = value._render_traceback_()
1814 stb = value._render_traceback_()
1818 except Exception:
1815 except Exception:
1819 stb = self.InteractiveTB.structured_traceback(etype,
1816 stb = self.InteractiveTB.structured_traceback(etype,
1820 value, tb, tb_offset=tb_offset)
1817 value, tb, tb_offset=tb_offset)
1821
1818
1822 self._showtraceback(etype, value, stb)
1819 self._showtraceback(etype, value, stb)
1823 if self.call_pdb:
1820 if self.call_pdb:
1824 # drop into debugger
1821 # drop into debugger
1825 self.debugger(force=True)
1822 self.debugger(force=True)
1826 return
1823 return
1827
1824
1828 # Actually show the traceback
1825 # Actually show the traceback
1829 self._showtraceback(etype, value, stb)
1826 self._showtraceback(etype, value, stb)
1830
1827
1831 except KeyboardInterrupt:
1828 except KeyboardInterrupt:
1832 print('\n' + self.get_exception_only(), file=sys.stderr)
1829 print('\n' + self.get_exception_only(), file=sys.stderr)
1833
1830
1834 def _showtraceback(self, etype, evalue, stb):
1831 def _showtraceback(self, etype, evalue, stb):
1835 """Actually show a traceback.
1832 """Actually show a traceback.
1836
1833
1837 Subclasses may override this method to put the traceback on a different
1834 Subclasses may override this method to put the traceback on a different
1838 place, like a side channel.
1835 place, like a side channel.
1839 """
1836 """
1840 print(self.InteractiveTB.stb2text(stb))
1837 print(self.InteractiveTB.stb2text(stb))
1841
1838
1842 def showsyntaxerror(self, filename=None):
1839 def showsyntaxerror(self, filename=None):
1843 """Display the syntax error that just occurred.
1840 """Display the syntax error that just occurred.
1844
1841
1845 This doesn't display a stack trace because there isn't one.
1842 This doesn't display a stack trace because there isn't one.
1846
1843
1847 If a filename is given, it is stuffed in the exception instead
1844 If a filename is given, it is stuffed in the exception instead
1848 of what was there before (because Python's parser always uses
1845 of what was there before (because Python's parser always uses
1849 "<string>" when reading from a string).
1846 "<string>" when reading from a string).
1850 """
1847 """
1851 etype, value, last_traceback = self._get_exc_info()
1848 etype, value, last_traceback = self._get_exc_info()
1852
1849
1853 if filename and issubclass(etype, SyntaxError):
1850 if filename and issubclass(etype, SyntaxError):
1854 try:
1851 try:
1855 value.filename = filename
1852 value.filename = filename
1856 except:
1853 except:
1857 # Not the format we expect; leave it alone
1854 # Not the format we expect; leave it alone
1858 pass
1855 pass
1859
1856
1860 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1857 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1861 self._showtraceback(etype, value, stb)
1858 self._showtraceback(etype, value, stb)
1862
1859
1863 # This is overridden in TerminalInteractiveShell to show a message about
1860 # This is overridden in TerminalInteractiveShell to show a message about
1864 # the %paste magic.
1861 # the %paste magic.
1865 def showindentationerror(self):
1862 def showindentationerror(self):
1866 """Called by run_cell when there's an IndentationError in code entered
1863 """Called by run_cell when there's an IndentationError in code entered
1867 at the prompt.
1864 at the prompt.
1868
1865
1869 This is overridden in TerminalInteractiveShell to show a message about
1866 This is overridden in TerminalInteractiveShell to show a message about
1870 the %paste magic."""
1867 the %paste magic."""
1871 self.showsyntaxerror()
1868 self.showsyntaxerror()
1872
1869
1873 #-------------------------------------------------------------------------
1870 #-------------------------------------------------------------------------
1874 # Things related to readline
1871 # Things related to readline
1875 #-------------------------------------------------------------------------
1872 #-------------------------------------------------------------------------
1876
1873
1877 def init_readline(self):
1874 def init_readline(self):
1878 """Moved to terminal subclass, here only to simplify the init logic."""
1875 """Moved to terminal subclass, here only to simplify the init logic."""
1879 self.readline = None
1876 self.readline = None
1880 # Set a number of methods that depend on readline to be no-op
1877 # Set a number of methods that depend on readline to be no-op
1881 self.readline_no_record = NoOpContext()
1878 self.readline_no_record = NoOpContext()
1882 self.set_readline_completer = no_op
1879 self.set_readline_completer = no_op
1883 self.set_custom_completer = no_op
1880 self.set_custom_completer = no_op
1884
1881
1885 @skip_doctest
1882 @skip_doctest
1886 def set_next_input(self, s, replace=False):
1883 def set_next_input(self, s, replace=False):
1887 """ Sets the 'default' input string for the next command line.
1884 """ Sets the 'default' input string for the next command line.
1888
1885
1889 Example::
1886 Example::
1890
1887
1891 In [1]: _ip.set_next_input("Hello Word")
1888 In [1]: _ip.set_next_input("Hello Word")
1892 In [2]: Hello Word_ # cursor is here
1889 In [2]: Hello Word_ # cursor is here
1893 """
1890 """
1894 self.rl_next_input = py3compat.cast_bytes_py2(s)
1891 self.rl_next_input = py3compat.cast_bytes_py2(s)
1895
1892
1896 def _indent_current_str(self):
1893 def _indent_current_str(self):
1897 """return the current level of indentation as a string"""
1894 """return the current level of indentation as a string"""
1898 return self.input_splitter.indent_spaces * ' '
1895 return self.input_splitter.indent_spaces * ' '
1899
1896
1900 #-------------------------------------------------------------------------
1897 #-------------------------------------------------------------------------
1901 # Things related to text completion
1898 # Things related to text completion
1902 #-------------------------------------------------------------------------
1899 #-------------------------------------------------------------------------
1903
1900
1904 def init_completer(self):
1901 def init_completer(self):
1905 """Initialize the completion machinery.
1902 """Initialize the completion machinery.
1906
1903
1907 This creates completion machinery that can be used by client code,
1904 This creates completion machinery that can be used by client code,
1908 either interactively in-process (typically triggered by the readline
1905 either interactively in-process (typically triggered by the readline
1909 library), programmatically (such as in test suites) or out-of-process
1906 library), programmatically (such as in test suites) or out-of-process
1910 (typically over the network by remote frontends).
1907 (typically over the network by remote frontends).
1911 """
1908 """
1912 from IPython.core.completer import IPCompleter
1909 from IPython.core.completer import IPCompleter
1913 from IPython.core.completerlib import (module_completer,
1910 from IPython.core.completerlib import (module_completer,
1914 magic_run_completer, cd_completer, reset_completer)
1911 magic_run_completer, cd_completer, reset_completer)
1915
1912
1916 self.Completer = IPCompleter(shell=self,
1913 self.Completer = IPCompleter(shell=self,
1917 namespace=self.user_ns,
1914 namespace=self.user_ns,
1918 global_namespace=self.user_global_ns,
1915 global_namespace=self.user_global_ns,
1919 use_readline=self.has_readline,
1916 use_readline=self.has_readline,
1920 parent=self,
1917 parent=self,
1921 )
1918 )
1922 self.configurables.append(self.Completer)
1919 self.configurables.append(self.Completer)
1923
1920
1924 # Add custom completers to the basic ones built into IPCompleter
1921 # Add custom completers to the basic ones built into IPCompleter
1925 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1922 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1926 self.strdispatchers['complete_command'] = sdisp
1923 self.strdispatchers['complete_command'] = sdisp
1927 self.Completer.custom_completers = sdisp
1924 self.Completer.custom_completers = sdisp
1928
1925
1929 self.set_hook('complete_command', module_completer, str_key = 'import')
1926 self.set_hook('complete_command', module_completer, str_key = 'import')
1930 self.set_hook('complete_command', module_completer, str_key = 'from')
1927 self.set_hook('complete_command', module_completer, str_key = 'from')
1931 self.set_hook('complete_command', module_completer, str_key = '%aimport')
1928 self.set_hook('complete_command', module_completer, str_key = '%aimport')
1932 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1929 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1933 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1930 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1934 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1931 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1935
1932
1936
1933
1937 @skip_doctest_py2
1934 @skip_doctest_py2
1938 def complete(self, text, line=None, cursor_pos=None):
1935 def complete(self, text, line=None, cursor_pos=None):
1939 """Return the completed text and a list of completions.
1936 """Return the completed text and a list of completions.
1940
1937
1941 Parameters
1938 Parameters
1942 ----------
1939 ----------
1943
1940
1944 text : string
1941 text : string
1945 A string of text to be completed on. It can be given as empty and
1942 A string of text to be completed on. It can be given as empty and
1946 instead a line/position pair are given. In this case, the
1943 instead a line/position pair are given. In this case, the
1947 completer itself will split the line like readline does.
1944 completer itself will split the line like readline does.
1948
1945
1949 line : string, optional
1946 line : string, optional
1950 The complete line that text is part of.
1947 The complete line that text is part of.
1951
1948
1952 cursor_pos : int, optional
1949 cursor_pos : int, optional
1953 The position of the cursor on the input line.
1950 The position of the cursor on the input line.
1954
1951
1955 Returns
1952 Returns
1956 -------
1953 -------
1957 text : string
1954 text : string
1958 The actual text that was completed.
1955 The actual text that was completed.
1959
1956
1960 matches : list
1957 matches : list
1961 A sorted list with all possible completions.
1958 A sorted list with all possible completions.
1962
1959
1963 The optional arguments allow the completion to take more context into
1960 The optional arguments allow the completion to take more context into
1964 account, and are part of the low-level completion API.
1961 account, and are part of the low-level completion API.
1965
1962
1966 This is a wrapper around the completion mechanism, similar to what
1963 This is a wrapper around the completion mechanism, similar to what
1967 readline does at the command line when the TAB key is hit. By
1964 readline does at the command line when the TAB key is hit. By
1968 exposing it as a method, it can be used by other non-readline
1965 exposing it as a method, it can be used by other non-readline
1969 environments (such as GUIs) for text completion.
1966 environments (such as GUIs) for text completion.
1970
1967
1971 Simple usage example:
1968 Simple usage example:
1972
1969
1973 In [1]: x = 'hello'
1970 In [1]: x = 'hello'
1974
1971
1975 In [2]: _ip.complete('x.l')
1972 In [2]: _ip.complete('x.l')
1976 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
1973 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
1977 """
1974 """
1978
1975
1979 # Inject names into __builtin__ so we can complete on the added names.
1976 # Inject names into __builtin__ so we can complete on the added names.
1980 with self.builtin_trap:
1977 with self.builtin_trap:
1981 return self.Completer.complete(text, line, cursor_pos)
1978 return self.Completer.complete(text, line, cursor_pos)
1982
1979
1983 def set_custom_completer(self, completer, pos=0):
1980 def set_custom_completer(self, completer, pos=0):
1984 """Adds a new custom completer function.
1981 """Adds a new custom completer function.
1985
1982
1986 The position argument (defaults to 0) is the index in the completers
1983 The position argument (defaults to 0) is the index in the completers
1987 list where you want the completer to be inserted."""
1984 list where you want the completer to be inserted."""
1988
1985
1989 newcomp = types.MethodType(completer,self.Completer)
1986 newcomp = types.MethodType(completer,self.Completer)
1990 self.Completer.matchers.insert(pos,newcomp)
1987 self.Completer.matchers.insert(pos,newcomp)
1991
1988
1992 def set_completer_frame(self, frame=None):
1989 def set_completer_frame(self, frame=None):
1993 """Set the frame of the completer."""
1990 """Set the frame of the completer."""
1994 if frame:
1991 if frame:
1995 self.Completer.namespace = frame.f_locals
1992 self.Completer.namespace = frame.f_locals
1996 self.Completer.global_namespace = frame.f_globals
1993 self.Completer.global_namespace = frame.f_globals
1997 else:
1994 else:
1998 self.Completer.namespace = self.user_ns
1995 self.Completer.namespace = self.user_ns
1999 self.Completer.global_namespace = self.user_global_ns
1996 self.Completer.global_namespace = self.user_global_ns
2000
1997
2001 #-------------------------------------------------------------------------
1998 #-------------------------------------------------------------------------
2002 # Things related to magics
1999 # Things related to magics
2003 #-------------------------------------------------------------------------
2000 #-------------------------------------------------------------------------
2004
2001
2005 def init_magics(self):
2002 def init_magics(self):
2006 from IPython.core import magics as m
2003 from IPython.core import magics as m
2007 self.magics_manager = magic.MagicsManager(shell=self,
2004 self.magics_manager = magic.MagicsManager(shell=self,
2008 parent=self,
2005 parent=self,
2009 user_magics=m.UserMagics(self))
2006 user_magics=m.UserMagics(self))
2010 self.configurables.append(self.magics_manager)
2007 self.configurables.append(self.magics_manager)
2011
2008
2012 # Expose as public API from the magics manager
2009 # Expose as public API from the magics manager
2013 self.register_magics = self.magics_manager.register
2010 self.register_magics = self.magics_manager.register
2014
2011
2015 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2012 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2016 m.ConfigMagics, m.DisplayMagics, m.ExecutionMagics,
2013 m.ConfigMagics, m.DisplayMagics, m.ExecutionMagics,
2017 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2014 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2018 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2015 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2019 )
2016 )
2020
2017
2021 # Register Magic Aliases
2018 # Register Magic Aliases
2022 mman = self.magics_manager
2019 mman = self.magics_manager
2023 # FIXME: magic aliases should be defined by the Magics classes
2020 # FIXME: magic aliases should be defined by the Magics classes
2024 # or in MagicsManager, not here
2021 # or in MagicsManager, not here
2025 mman.register_alias('ed', 'edit')
2022 mman.register_alias('ed', 'edit')
2026 mman.register_alias('hist', 'history')
2023 mman.register_alias('hist', 'history')
2027 mman.register_alias('rep', 'recall')
2024 mman.register_alias('rep', 'recall')
2028 mman.register_alias('SVG', 'svg', 'cell')
2025 mman.register_alias('SVG', 'svg', 'cell')
2029 mman.register_alias('HTML', 'html', 'cell')
2026 mman.register_alias('HTML', 'html', 'cell')
2030 mman.register_alias('file', 'writefile', 'cell')
2027 mman.register_alias('file', 'writefile', 'cell')
2031
2028
2032 # FIXME: Move the color initialization to the DisplayHook, which
2029 # FIXME: Move the color initialization to the DisplayHook, which
2033 # should be split into a prompt manager and displayhook. We probably
2030 # should be split into a prompt manager and displayhook. We probably
2034 # even need a centralize colors management object.
2031 # even need a centralize colors management object.
2035 self.magic('colors %s' % self.colors)
2032 self.magic('colors %s' % self.colors)
2036
2033
2037 # Defined here so that it's included in the documentation
2034 # Defined here so that it's included in the documentation
2038 @functools.wraps(magic.MagicsManager.register_function)
2035 @functools.wraps(magic.MagicsManager.register_function)
2039 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2036 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2040 self.magics_manager.register_function(func,
2037 self.magics_manager.register_function(func,
2041 magic_kind=magic_kind, magic_name=magic_name)
2038 magic_kind=magic_kind, magic_name=magic_name)
2042
2039
2043 def run_line_magic(self, magic_name, line):
2040 def run_line_magic(self, magic_name, line):
2044 """Execute the given line magic.
2041 """Execute the given line magic.
2045
2042
2046 Parameters
2043 Parameters
2047 ----------
2044 ----------
2048 magic_name : str
2045 magic_name : str
2049 Name of the desired magic function, without '%' prefix.
2046 Name of the desired magic function, without '%' prefix.
2050
2047
2051 line : str
2048 line : str
2052 The rest of the input line as a single string.
2049 The rest of the input line as a single string.
2053 """
2050 """
2054 fn = self.find_line_magic(magic_name)
2051 fn = self.find_line_magic(magic_name)
2055 if fn is None:
2052 if fn is None:
2056 cm = self.find_cell_magic(magic_name)
2053 cm = self.find_cell_magic(magic_name)
2057 etpl = "Line magic function `%%%s` not found%s."
2054 etpl = "Line magic function `%%%s` not found%s."
2058 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2055 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2059 'did you mean that instead?)' % magic_name )
2056 'did you mean that instead?)' % magic_name )
2060 error(etpl % (magic_name, extra))
2057 error(etpl % (magic_name, extra))
2061 else:
2058 else:
2062 # Note: this is the distance in the stack to the user's frame.
2059 # Note: this is the distance in the stack to the user's frame.
2063 # This will need to be updated if the internal calling logic gets
2060 # This will need to be updated if the internal calling logic gets
2064 # refactored, or else we'll be expanding the wrong variables.
2061 # refactored, or else we'll be expanding the wrong variables.
2065 stack_depth = 2
2062 stack_depth = 2
2066 magic_arg_s = self.var_expand(line, stack_depth)
2063 magic_arg_s = self.var_expand(line, stack_depth)
2067 # Put magic args in a list so we can call with f(*a) syntax
2064 # Put magic args in a list so we can call with f(*a) syntax
2068 args = [magic_arg_s]
2065 args = [magic_arg_s]
2069 kwargs = {}
2066 kwargs = {}
2070 # Grab local namespace if we need it:
2067 # Grab local namespace if we need it:
2071 if getattr(fn, "needs_local_scope", False):
2068 if getattr(fn, "needs_local_scope", False):
2072 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2069 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2073 with self.builtin_trap:
2070 with self.builtin_trap:
2074 result = fn(*args,**kwargs)
2071 result = fn(*args,**kwargs)
2075 return result
2072 return result
2076
2073
2077 def run_cell_magic(self, magic_name, line, cell):
2074 def run_cell_magic(self, magic_name, line, cell):
2078 """Execute the given cell magic.
2075 """Execute the given cell magic.
2079
2076
2080 Parameters
2077 Parameters
2081 ----------
2078 ----------
2082 magic_name : str
2079 magic_name : str
2083 Name of the desired magic function, without '%' prefix.
2080 Name of the desired magic function, without '%' prefix.
2084
2081
2085 line : str
2082 line : str
2086 The rest of the first input line as a single string.
2083 The rest of the first input line as a single string.
2087
2084
2088 cell : str
2085 cell : str
2089 The body of the cell as a (possibly multiline) string.
2086 The body of the cell as a (possibly multiline) string.
2090 """
2087 """
2091 fn = self.find_cell_magic(magic_name)
2088 fn = self.find_cell_magic(magic_name)
2092 if fn is None:
2089 if fn is None:
2093 lm = self.find_line_magic(magic_name)
2090 lm = self.find_line_magic(magic_name)
2094 etpl = "Cell magic `%%{0}` not found{1}."
2091 etpl = "Cell magic `%%{0}` not found{1}."
2095 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2092 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2096 'did you mean that instead?)'.format(magic_name))
2093 'did you mean that instead?)'.format(magic_name))
2097 error(etpl.format(magic_name, extra))
2094 error(etpl.format(magic_name, extra))
2098 elif cell == '':
2095 elif cell == '':
2099 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2096 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2100 if self.find_line_magic(magic_name) is not None:
2097 if self.find_line_magic(magic_name) is not None:
2101 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2098 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2102 raise UsageError(message)
2099 raise UsageError(message)
2103 else:
2100 else:
2104 # Note: this is the distance in the stack to the user's frame.
2101 # Note: this is the distance in the stack to the user's frame.
2105 # This will need to be updated if the internal calling logic gets
2102 # This will need to be updated if the internal calling logic gets
2106 # refactored, or else we'll be expanding the wrong variables.
2103 # refactored, or else we'll be expanding the wrong variables.
2107 stack_depth = 2
2104 stack_depth = 2
2108 magic_arg_s = self.var_expand(line, stack_depth)
2105 magic_arg_s = self.var_expand(line, stack_depth)
2109 with self.builtin_trap:
2106 with self.builtin_trap:
2110 result = fn(magic_arg_s, cell)
2107 result = fn(magic_arg_s, cell)
2111 return result
2108 return result
2112
2109
2113 def find_line_magic(self, magic_name):
2110 def find_line_magic(self, magic_name):
2114 """Find and return a line magic by name.
2111 """Find and return a line magic by name.
2115
2112
2116 Returns None if the magic isn't found."""
2113 Returns None if the magic isn't found."""
2117 return self.magics_manager.magics['line'].get(magic_name)
2114 return self.magics_manager.magics['line'].get(magic_name)
2118
2115
2119 def find_cell_magic(self, magic_name):
2116 def find_cell_magic(self, magic_name):
2120 """Find and return a cell magic by name.
2117 """Find and return a cell magic by name.
2121
2118
2122 Returns None if the magic isn't found."""
2119 Returns None if the magic isn't found."""
2123 return self.magics_manager.magics['cell'].get(magic_name)
2120 return self.magics_manager.magics['cell'].get(magic_name)
2124
2121
2125 def find_magic(self, magic_name, magic_kind='line'):
2122 def find_magic(self, magic_name, magic_kind='line'):
2126 """Find and return a magic of the given type by name.
2123 """Find and return a magic of the given type by name.
2127
2124
2128 Returns None if the magic isn't found."""
2125 Returns None if the magic isn't found."""
2129 return self.magics_manager.magics[magic_kind].get(magic_name)
2126 return self.magics_manager.magics[magic_kind].get(magic_name)
2130
2127
2131 def magic(self, arg_s):
2128 def magic(self, arg_s):
2132 """DEPRECATED. Use run_line_magic() instead.
2129 """DEPRECATED. Use run_line_magic() instead.
2133
2130
2134 Call a magic function by name.
2131 Call a magic function by name.
2135
2132
2136 Input: a string containing the name of the magic function to call and
2133 Input: a string containing the name of the magic function to call and
2137 any additional arguments to be passed to the magic.
2134 any additional arguments to be passed to the magic.
2138
2135
2139 magic('name -opt foo bar') is equivalent to typing at the ipython
2136 magic('name -opt foo bar') is equivalent to typing at the ipython
2140 prompt:
2137 prompt:
2141
2138
2142 In[1]: %name -opt foo bar
2139 In[1]: %name -opt foo bar
2143
2140
2144 To call a magic without arguments, simply use magic('name').
2141 To call a magic without arguments, simply use magic('name').
2145
2142
2146 This provides a proper Python function to call IPython's magics in any
2143 This provides a proper Python function to call IPython's magics in any
2147 valid Python code you can type at the interpreter, including loops and
2144 valid Python code you can type at the interpreter, including loops and
2148 compound statements.
2145 compound statements.
2149 """
2146 """
2150 # TODO: should we issue a loud deprecation warning here?
2147 # TODO: should we issue a loud deprecation warning here?
2151 magic_name, _, magic_arg_s = arg_s.partition(' ')
2148 magic_name, _, magic_arg_s = arg_s.partition(' ')
2152 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2149 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2153 return self.run_line_magic(magic_name, magic_arg_s)
2150 return self.run_line_magic(magic_name, magic_arg_s)
2154
2151
2155 #-------------------------------------------------------------------------
2152 #-------------------------------------------------------------------------
2156 # Things related to macros
2153 # Things related to macros
2157 #-------------------------------------------------------------------------
2154 #-------------------------------------------------------------------------
2158
2155
2159 def define_macro(self, name, themacro):
2156 def define_macro(self, name, themacro):
2160 """Define a new macro
2157 """Define a new macro
2161
2158
2162 Parameters
2159 Parameters
2163 ----------
2160 ----------
2164 name : str
2161 name : str
2165 The name of the macro.
2162 The name of the macro.
2166 themacro : str or Macro
2163 themacro : str or Macro
2167 The action to do upon invoking the macro. If a string, a new
2164 The action to do upon invoking the macro. If a string, a new
2168 Macro object is created by passing the string to it.
2165 Macro object is created by passing the string to it.
2169 """
2166 """
2170
2167
2171 from IPython.core import macro
2168 from IPython.core import macro
2172
2169
2173 if isinstance(themacro, string_types):
2170 if isinstance(themacro, string_types):
2174 themacro = macro.Macro(themacro)
2171 themacro = macro.Macro(themacro)
2175 if not isinstance(themacro, macro.Macro):
2172 if not isinstance(themacro, macro.Macro):
2176 raise ValueError('A macro must be a string or a Macro instance.')
2173 raise ValueError('A macro must be a string or a Macro instance.')
2177 self.user_ns[name] = themacro
2174 self.user_ns[name] = themacro
2178
2175
2179 #-------------------------------------------------------------------------
2176 #-------------------------------------------------------------------------
2180 # Things related to the running of system commands
2177 # Things related to the running of system commands
2181 #-------------------------------------------------------------------------
2178 #-------------------------------------------------------------------------
2182
2179
2183 def system_piped(self, cmd):
2180 def system_piped(self, cmd):
2184 """Call the given cmd in a subprocess, piping stdout/err
2181 """Call the given cmd in a subprocess, piping stdout/err
2185
2182
2186 Parameters
2183 Parameters
2187 ----------
2184 ----------
2188 cmd : str
2185 cmd : str
2189 Command to execute (can not end in '&', as background processes are
2186 Command to execute (can not end in '&', as background processes are
2190 not supported. Should not be a command that expects input
2187 not supported. Should not be a command that expects input
2191 other than simple text.
2188 other than simple text.
2192 """
2189 """
2193 if cmd.rstrip().endswith('&'):
2190 if cmd.rstrip().endswith('&'):
2194 # this is *far* from a rigorous test
2191 # this is *far* from a rigorous test
2195 # We do not support backgrounding processes because we either use
2192 # We do not support backgrounding processes because we either use
2196 # pexpect or pipes to read from. Users can always just call
2193 # pexpect or pipes to read from. Users can always just call
2197 # os.system() or use ip.system=ip.system_raw
2194 # os.system() or use ip.system=ip.system_raw
2198 # if they really want a background process.
2195 # if they really want a background process.
2199 raise OSError("Background processes not supported.")
2196 raise OSError("Background processes not supported.")
2200
2197
2201 # we explicitly do NOT return the subprocess status code, because
2198 # we explicitly do NOT return the subprocess status code, because
2202 # a non-None value would trigger :func:`sys.displayhook` calls.
2199 # a non-None value would trigger :func:`sys.displayhook` calls.
2203 # Instead, we store the exit_code in user_ns.
2200 # Instead, we store the exit_code in user_ns.
2204 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2201 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2205
2202
2206 def system_raw(self, cmd):
2203 def system_raw(self, cmd):
2207 """Call the given cmd in a subprocess using os.system on Windows or
2204 """Call the given cmd in a subprocess using os.system on Windows or
2208 subprocess.call using the system shell on other platforms.
2205 subprocess.call using the system shell on other platforms.
2209
2206
2210 Parameters
2207 Parameters
2211 ----------
2208 ----------
2212 cmd : str
2209 cmd : str
2213 Command to execute.
2210 Command to execute.
2214 """
2211 """
2215 cmd = self.var_expand(cmd, depth=1)
2212 cmd = self.var_expand(cmd, depth=1)
2216 # protect os.system from UNC paths on Windows, which it can't handle:
2213 # protect os.system from UNC paths on Windows, which it can't handle:
2217 if sys.platform == 'win32':
2214 if sys.platform == 'win32':
2218 from IPython.utils._process_win32 import AvoidUNCPath
2215 from IPython.utils._process_win32 import AvoidUNCPath
2219 with AvoidUNCPath() as path:
2216 with AvoidUNCPath() as path:
2220 if path is not None:
2217 if path is not None:
2221 cmd = '"pushd %s &&"%s' % (path, cmd)
2218 cmd = '"pushd %s &&"%s' % (path, cmd)
2222 cmd = py3compat.unicode_to_str(cmd)
2219 cmd = py3compat.unicode_to_str(cmd)
2223 try:
2220 try:
2224 ec = os.system(cmd)
2221 ec = os.system(cmd)
2225 except KeyboardInterrupt:
2222 except KeyboardInterrupt:
2226 print('\n' + self.get_exception_only(), file=sys.stderr)
2223 print('\n' + self.get_exception_only(), file=sys.stderr)
2227 ec = -2
2224 ec = -2
2228 else:
2225 else:
2229 cmd = py3compat.unicode_to_str(cmd)
2226 cmd = py3compat.unicode_to_str(cmd)
2230 # For posix the result of the subprocess.call() below is an exit
2227 # For posix the result of the subprocess.call() below is an exit
2231 # code, which by convention is zero for success, positive for
2228 # code, which by convention is zero for success, positive for
2232 # program failure. Exit codes above 128 are reserved for signals,
2229 # program failure. Exit codes above 128 are reserved for signals,
2233 # and the formula for converting a signal to an exit code is usually
2230 # and the formula for converting a signal to an exit code is usually
2234 # signal_number+128. To more easily differentiate between exit
2231 # signal_number+128. To more easily differentiate between exit
2235 # codes and signals, ipython uses negative numbers. For instance
2232 # codes and signals, ipython uses negative numbers. For instance
2236 # since control-c is signal 2 but exit code 130, ipython's
2233 # since control-c is signal 2 but exit code 130, ipython's
2237 # _exit_code variable will read -2. Note that some shells like
2234 # _exit_code variable will read -2. Note that some shells like
2238 # csh and fish don't follow sh/bash conventions for exit codes.
2235 # csh and fish don't follow sh/bash conventions for exit codes.
2239 executable = os.environ.get('SHELL', None)
2236 executable = os.environ.get('SHELL', None)
2240 try:
2237 try:
2241 # Use env shell instead of default /bin/sh
2238 # Use env shell instead of default /bin/sh
2242 ec = subprocess.call(cmd, shell=True, executable=executable)
2239 ec = subprocess.call(cmd, shell=True, executable=executable)
2243 except KeyboardInterrupt:
2240 except KeyboardInterrupt:
2244 # intercept control-C; a long traceback is not useful here
2241 # intercept control-C; a long traceback is not useful here
2245 print('\n' + self.get_exception_only(), file=sys.stderr)
2242 print('\n' + self.get_exception_only(), file=sys.stderr)
2246 ec = 130
2243 ec = 130
2247 if ec > 128:
2244 if ec > 128:
2248 ec = -(ec - 128)
2245 ec = -(ec - 128)
2249
2246
2250 # We explicitly do NOT return the subprocess status code, because
2247 # We explicitly do NOT return the subprocess status code, because
2251 # a non-None value would trigger :func:`sys.displayhook` calls.
2248 # a non-None value would trigger :func:`sys.displayhook` calls.
2252 # Instead, we store the exit_code in user_ns. Note the semantics
2249 # Instead, we store the exit_code in user_ns. Note the semantics
2253 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2250 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2254 # but raising SystemExit(_exit_code) will give status 254!
2251 # but raising SystemExit(_exit_code) will give status 254!
2255 self.user_ns['_exit_code'] = ec
2252 self.user_ns['_exit_code'] = ec
2256
2253
2257 # use piped system by default, because it is better behaved
2254 # use piped system by default, because it is better behaved
2258 system = system_piped
2255 system = system_piped
2259
2256
2260 def getoutput(self, cmd, split=True, depth=0):
2257 def getoutput(self, cmd, split=True, depth=0):
2261 """Get output (possibly including stderr) from a subprocess.
2258 """Get output (possibly including stderr) from a subprocess.
2262
2259
2263 Parameters
2260 Parameters
2264 ----------
2261 ----------
2265 cmd : str
2262 cmd : str
2266 Command to execute (can not end in '&', as background processes are
2263 Command to execute (can not end in '&', as background processes are
2267 not supported.
2264 not supported.
2268 split : bool, optional
2265 split : bool, optional
2269 If True, split the output into an IPython SList. Otherwise, an
2266 If True, split the output into an IPython SList. Otherwise, an
2270 IPython LSString is returned. These are objects similar to normal
2267 IPython LSString is returned. These are objects similar to normal
2271 lists and strings, with a few convenience attributes for easier
2268 lists and strings, with a few convenience attributes for easier
2272 manipulation of line-based output. You can use '?' on them for
2269 manipulation of line-based output. You can use '?' on them for
2273 details.
2270 details.
2274 depth : int, optional
2271 depth : int, optional
2275 How many frames above the caller are the local variables which should
2272 How many frames above the caller are the local variables which should
2276 be expanded in the command string? The default (0) assumes that the
2273 be expanded in the command string? The default (0) assumes that the
2277 expansion variables are in the stack frame calling this function.
2274 expansion variables are in the stack frame calling this function.
2278 """
2275 """
2279 if cmd.rstrip().endswith('&'):
2276 if cmd.rstrip().endswith('&'):
2280 # this is *far* from a rigorous test
2277 # this is *far* from a rigorous test
2281 raise OSError("Background processes not supported.")
2278 raise OSError("Background processes not supported.")
2282 out = getoutput(self.var_expand(cmd, depth=depth+1))
2279 out = getoutput(self.var_expand(cmd, depth=depth+1))
2283 if split:
2280 if split:
2284 out = SList(out.splitlines())
2281 out = SList(out.splitlines())
2285 else:
2282 else:
2286 out = LSString(out)
2283 out = LSString(out)
2287 return out
2284 return out
2288
2285
2289 #-------------------------------------------------------------------------
2286 #-------------------------------------------------------------------------
2290 # Things related to aliases
2287 # Things related to aliases
2291 #-------------------------------------------------------------------------
2288 #-------------------------------------------------------------------------
2292
2289
2293 def init_alias(self):
2290 def init_alias(self):
2294 self.alias_manager = AliasManager(shell=self, parent=self)
2291 self.alias_manager = AliasManager(shell=self, parent=self)
2295 self.configurables.append(self.alias_manager)
2292 self.configurables.append(self.alias_manager)
2296
2293
2297 #-------------------------------------------------------------------------
2294 #-------------------------------------------------------------------------
2298 # Things related to extensions
2295 # Things related to extensions
2299 #-------------------------------------------------------------------------
2296 #-------------------------------------------------------------------------
2300
2297
2301 def init_extension_manager(self):
2298 def init_extension_manager(self):
2302 self.extension_manager = ExtensionManager(shell=self, parent=self)
2299 self.extension_manager = ExtensionManager(shell=self, parent=self)
2303 self.configurables.append(self.extension_manager)
2300 self.configurables.append(self.extension_manager)
2304
2301
2305 #-------------------------------------------------------------------------
2302 #-------------------------------------------------------------------------
2306 # Things related to payloads
2303 # Things related to payloads
2307 #-------------------------------------------------------------------------
2304 #-------------------------------------------------------------------------
2308
2305
2309 def init_payload(self):
2306 def init_payload(self):
2310 self.payload_manager = PayloadManager(parent=self)
2307 self.payload_manager = PayloadManager(parent=self)
2311 self.configurables.append(self.payload_manager)
2308 self.configurables.append(self.payload_manager)
2312
2309
2313 #-------------------------------------------------------------------------
2310 #-------------------------------------------------------------------------
2314 # Things related to the prefilter
2311 # Things related to the prefilter
2315 #-------------------------------------------------------------------------
2312 #-------------------------------------------------------------------------
2316
2313
2317 def init_prefilter(self):
2314 def init_prefilter(self):
2318 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2315 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2319 self.configurables.append(self.prefilter_manager)
2316 self.configurables.append(self.prefilter_manager)
2320 # Ultimately this will be refactored in the new interpreter code, but
2317 # Ultimately this will be refactored in the new interpreter code, but
2321 # for now, we should expose the main prefilter method (there's legacy
2318 # for now, we should expose the main prefilter method (there's legacy
2322 # code out there that may rely on this).
2319 # code out there that may rely on this).
2323 self.prefilter = self.prefilter_manager.prefilter_lines
2320 self.prefilter = self.prefilter_manager.prefilter_lines
2324
2321
2325 def auto_rewrite_input(self, cmd):
2322 def auto_rewrite_input(self, cmd):
2326 """Print to the screen the rewritten form of the user's command.
2323 """Print to the screen the rewritten form of the user's command.
2327
2324
2328 This shows visual feedback by rewriting input lines that cause
2325 This shows visual feedback by rewriting input lines that cause
2329 automatic calling to kick in, like::
2326 automatic calling to kick in, like::
2330
2327
2331 /f x
2328 /f x
2332
2329
2333 into::
2330 into::
2334
2331
2335 ------> f(x)
2332 ------> f(x)
2336
2333
2337 after the user's input prompt. This helps the user understand that the
2334 after the user's input prompt. This helps the user understand that the
2338 input line was transformed automatically by IPython.
2335 input line was transformed automatically by IPython.
2339 """
2336 """
2340 if not self.show_rewritten_input:
2337 if not self.show_rewritten_input:
2341 return
2338 return
2342
2339
2343 # This is overridden in TerminalInteractiveShell to use fancy prompts
2340 # This is overridden in TerminalInteractiveShell to use fancy prompts
2344 print("------> " + cmd)
2341 print("------> " + cmd)
2345
2342
2346 #-------------------------------------------------------------------------
2343 #-------------------------------------------------------------------------
2347 # Things related to extracting values/expressions from kernel and user_ns
2344 # Things related to extracting values/expressions from kernel and user_ns
2348 #-------------------------------------------------------------------------
2345 #-------------------------------------------------------------------------
2349
2346
2350 def _user_obj_error(self):
2347 def _user_obj_error(self):
2351 """return simple exception dict
2348 """return simple exception dict
2352
2349
2353 for use in user_expressions
2350 for use in user_expressions
2354 """
2351 """
2355
2352
2356 etype, evalue, tb = self._get_exc_info()
2353 etype, evalue, tb = self._get_exc_info()
2357 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2354 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2358
2355
2359 exc_info = {
2356 exc_info = {
2360 u'status' : 'error',
2357 u'status' : 'error',
2361 u'traceback' : stb,
2358 u'traceback' : stb,
2362 u'ename' : unicode_type(etype.__name__),
2359 u'ename' : unicode_type(etype.__name__),
2363 u'evalue' : py3compat.safe_unicode(evalue),
2360 u'evalue' : py3compat.safe_unicode(evalue),
2364 }
2361 }
2365
2362
2366 return exc_info
2363 return exc_info
2367
2364
2368 def _format_user_obj(self, obj):
2365 def _format_user_obj(self, obj):
2369 """format a user object to display dict
2366 """format a user object to display dict
2370
2367
2371 for use in user_expressions
2368 for use in user_expressions
2372 """
2369 """
2373
2370
2374 data, md = self.display_formatter.format(obj)
2371 data, md = self.display_formatter.format(obj)
2375 value = {
2372 value = {
2376 'status' : 'ok',
2373 'status' : 'ok',
2377 'data' : data,
2374 'data' : data,
2378 'metadata' : md,
2375 'metadata' : md,
2379 }
2376 }
2380 return value
2377 return value
2381
2378
2382 def user_expressions(self, expressions):
2379 def user_expressions(self, expressions):
2383 """Evaluate a dict of expressions in the user's namespace.
2380 """Evaluate a dict of expressions in the user's namespace.
2384
2381
2385 Parameters
2382 Parameters
2386 ----------
2383 ----------
2387 expressions : dict
2384 expressions : dict
2388 A dict with string keys and string values. The expression values
2385 A dict with string keys and string values. The expression values
2389 should be valid Python expressions, each of which will be evaluated
2386 should be valid Python expressions, each of which will be evaluated
2390 in the user namespace.
2387 in the user namespace.
2391
2388
2392 Returns
2389 Returns
2393 -------
2390 -------
2394 A dict, keyed like the input expressions dict, with the rich mime-typed
2391 A dict, keyed like the input expressions dict, with the rich mime-typed
2395 display_data of each value.
2392 display_data of each value.
2396 """
2393 """
2397 out = {}
2394 out = {}
2398 user_ns = self.user_ns
2395 user_ns = self.user_ns
2399 global_ns = self.user_global_ns
2396 global_ns = self.user_global_ns
2400
2397
2401 for key, expr in iteritems(expressions):
2398 for key, expr in iteritems(expressions):
2402 try:
2399 try:
2403 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2400 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2404 except:
2401 except:
2405 value = self._user_obj_error()
2402 value = self._user_obj_error()
2406 out[key] = value
2403 out[key] = value
2407 return out
2404 return out
2408
2405
2409 #-------------------------------------------------------------------------
2406 #-------------------------------------------------------------------------
2410 # Things related to the running of code
2407 # Things related to the running of code
2411 #-------------------------------------------------------------------------
2408 #-------------------------------------------------------------------------
2412
2409
2413 def ex(self, cmd):
2410 def ex(self, cmd):
2414 """Execute a normal python statement in user namespace."""
2411 """Execute a normal python statement in user namespace."""
2415 with self.builtin_trap:
2412 with self.builtin_trap:
2416 exec(cmd, self.user_global_ns, self.user_ns)
2413 exec(cmd, self.user_global_ns, self.user_ns)
2417
2414
2418 def ev(self, expr):
2415 def ev(self, expr):
2419 """Evaluate python expression expr in user namespace.
2416 """Evaluate python expression expr in user namespace.
2420
2417
2421 Returns the result of evaluation
2418 Returns the result of evaluation
2422 """
2419 """
2423 with self.builtin_trap:
2420 with self.builtin_trap:
2424 return eval(expr, self.user_global_ns, self.user_ns)
2421 return eval(expr, self.user_global_ns, self.user_ns)
2425
2422
2426 def safe_execfile(self, fname, *where, **kw):
2423 def safe_execfile(self, fname, *where, **kw):
2427 """A safe version of the builtin execfile().
2424 """A safe version of the builtin execfile().
2428
2425
2429 This version will never throw an exception, but instead print
2426 This version will never throw an exception, but instead print
2430 helpful error messages to the screen. This only works on pure
2427 helpful error messages to the screen. This only works on pure
2431 Python files with the .py extension.
2428 Python files with the .py extension.
2432
2429
2433 Parameters
2430 Parameters
2434 ----------
2431 ----------
2435 fname : string
2432 fname : string
2436 The name of the file to be executed.
2433 The name of the file to be executed.
2437 where : tuple
2434 where : tuple
2438 One or two namespaces, passed to execfile() as (globals,locals).
2435 One or two namespaces, passed to execfile() as (globals,locals).
2439 If only one is given, it is passed as both.
2436 If only one is given, it is passed as both.
2440 exit_ignore : bool (False)
2437 exit_ignore : bool (False)
2441 If True, then silence SystemExit for non-zero status (it is always
2438 If True, then silence SystemExit for non-zero status (it is always
2442 silenced for zero status, as it is so common).
2439 silenced for zero status, as it is so common).
2443 raise_exceptions : bool (False)
2440 raise_exceptions : bool (False)
2444 If True raise exceptions everywhere. Meant for testing.
2441 If True raise exceptions everywhere. Meant for testing.
2445 shell_futures : bool (False)
2442 shell_futures : bool (False)
2446 If True, the code will share future statements with the interactive
2443 If True, the code will share future statements with the interactive
2447 shell. It will both be affected by previous __future__ imports, and
2444 shell. It will both be affected by previous __future__ imports, and
2448 any __future__ imports in the code will affect the shell. If False,
2445 any __future__ imports in the code will affect the shell. If False,
2449 __future__ imports are not shared in either direction.
2446 __future__ imports are not shared in either direction.
2450
2447
2451 """
2448 """
2452 kw.setdefault('exit_ignore', False)
2449 kw.setdefault('exit_ignore', False)
2453 kw.setdefault('raise_exceptions', False)
2450 kw.setdefault('raise_exceptions', False)
2454 kw.setdefault('shell_futures', False)
2451 kw.setdefault('shell_futures', False)
2455
2452
2456 fname = os.path.abspath(os.path.expanduser(fname))
2453 fname = os.path.abspath(os.path.expanduser(fname))
2457
2454
2458 # Make sure we can open the file
2455 # Make sure we can open the file
2459 try:
2456 try:
2460 with open(fname):
2457 with open(fname):
2461 pass
2458 pass
2462 except:
2459 except:
2463 warn('Could not open file <%s> for safe execution.' % fname)
2460 warn('Could not open file <%s> for safe execution.' % fname)
2464 return
2461 return
2465
2462
2466 # Find things also in current directory. This is needed to mimic the
2463 # Find things also in current directory. This is needed to mimic the
2467 # behavior of running a script from the system command line, where
2464 # behavior of running a script from the system command line, where
2468 # Python inserts the script's directory into sys.path
2465 # Python inserts the script's directory into sys.path
2469 dname = os.path.dirname(fname)
2466 dname = os.path.dirname(fname)
2470
2467
2471 with prepended_to_syspath(dname):
2468 with prepended_to_syspath(dname):
2472 try:
2469 try:
2473 glob, loc = (where + (None, ))[:2]
2470 glob, loc = (where + (None, ))[:2]
2474 py3compat.execfile(
2471 py3compat.execfile(
2475 fname, glob, loc,
2472 fname, glob, loc,
2476 self.compile if kw['shell_futures'] else None)
2473 self.compile if kw['shell_futures'] else None)
2477 except SystemExit as status:
2474 except SystemExit as status:
2478 # If the call was made with 0 or None exit status (sys.exit(0)
2475 # If the call was made with 0 or None exit status (sys.exit(0)
2479 # or sys.exit() ), don't bother showing a traceback, as both of
2476 # or sys.exit() ), don't bother showing a traceback, as both of
2480 # these are considered normal by the OS:
2477 # these are considered normal by the OS:
2481 # > python -c'import sys;sys.exit(0)'; echo $?
2478 # > python -c'import sys;sys.exit(0)'; echo $?
2482 # 0
2479 # 0
2483 # > python -c'import sys;sys.exit()'; echo $?
2480 # > python -c'import sys;sys.exit()'; echo $?
2484 # 0
2481 # 0
2485 # For other exit status, we show the exception unless
2482 # For other exit status, we show the exception unless
2486 # explicitly silenced, but only in short form.
2483 # explicitly silenced, but only in short form.
2487 if status.code:
2484 if status.code:
2488 if kw['raise_exceptions']:
2485 if kw['raise_exceptions']:
2489 raise
2486 raise
2490 if not kw['exit_ignore']:
2487 if not kw['exit_ignore']:
2491 self.showtraceback(exception_only=True)
2488 self.showtraceback(exception_only=True)
2492 except:
2489 except:
2493 if kw['raise_exceptions']:
2490 if kw['raise_exceptions']:
2494 raise
2491 raise
2495 # tb offset is 2 because we wrap execfile
2492 # tb offset is 2 because we wrap execfile
2496 self.showtraceback(tb_offset=2)
2493 self.showtraceback(tb_offset=2)
2497
2494
2498 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False):
2495 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False):
2499 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2496 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2500
2497
2501 Parameters
2498 Parameters
2502 ----------
2499 ----------
2503 fname : str
2500 fname : str
2504 The name of the file to execute. The filename must have a
2501 The name of the file to execute. The filename must have a
2505 .ipy or .ipynb extension.
2502 .ipy or .ipynb extension.
2506 shell_futures : bool (False)
2503 shell_futures : bool (False)
2507 If True, the code will share future statements with the interactive
2504 If True, the code will share future statements with the interactive
2508 shell. It will both be affected by previous __future__ imports, and
2505 shell. It will both be affected by previous __future__ imports, and
2509 any __future__ imports in the code will affect the shell. If False,
2506 any __future__ imports in the code will affect the shell. If False,
2510 __future__ imports are not shared in either direction.
2507 __future__ imports are not shared in either direction.
2511 raise_exceptions : bool (False)
2508 raise_exceptions : bool (False)
2512 If True raise exceptions everywhere. Meant for testing.
2509 If True raise exceptions everywhere. Meant for testing.
2513 """
2510 """
2514 fname = os.path.abspath(os.path.expanduser(fname))
2511 fname = os.path.abspath(os.path.expanduser(fname))
2515
2512
2516 # Make sure we can open the file
2513 # Make sure we can open the file
2517 try:
2514 try:
2518 with open(fname):
2515 with open(fname):
2519 pass
2516 pass
2520 except:
2517 except:
2521 warn('Could not open file <%s> for safe execution.' % fname)
2518 warn('Could not open file <%s> for safe execution.' % fname)
2522 return
2519 return
2523
2520
2524 # Find things also in current directory. This is needed to mimic the
2521 # Find things also in current directory. This is needed to mimic the
2525 # behavior of running a script from the system command line, where
2522 # behavior of running a script from the system command line, where
2526 # Python inserts the script's directory into sys.path
2523 # Python inserts the script's directory into sys.path
2527 dname = os.path.dirname(fname)
2524 dname = os.path.dirname(fname)
2528
2525
2529 def get_cells():
2526 def get_cells():
2530 """generator for sequence of code blocks to run"""
2527 """generator for sequence of code blocks to run"""
2531 if fname.endswith('.ipynb'):
2528 if fname.endswith('.ipynb'):
2532 from nbformat import read
2529 from nbformat import read
2533 with io_open(fname) as f:
2530 with io_open(fname) as f:
2534 nb = read(f, as_version=4)
2531 nb = read(f, as_version=4)
2535 if not nb.cells:
2532 if not nb.cells:
2536 return
2533 return
2537 for cell in nb.cells:
2534 for cell in nb.cells:
2538 if cell.cell_type == 'code':
2535 if cell.cell_type == 'code':
2539 yield cell.source
2536 yield cell.source
2540 else:
2537 else:
2541 with open(fname) as f:
2538 with open(fname) as f:
2542 yield f.read()
2539 yield f.read()
2543
2540
2544 with prepended_to_syspath(dname):
2541 with prepended_to_syspath(dname):
2545 try:
2542 try:
2546 for cell in get_cells():
2543 for cell in get_cells():
2547 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2544 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2548 if raise_exceptions:
2545 if raise_exceptions:
2549 result.raise_error()
2546 result.raise_error()
2550 elif not result.success:
2547 elif not result.success:
2551 break
2548 break
2552 except:
2549 except:
2553 if raise_exceptions:
2550 if raise_exceptions:
2554 raise
2551 raise
2555 self.showtraceback()
2552 self.showtraceback()
2556 warn('Unknown failure executing file: <%s>' % fname)
2553 warn('Unknown failure executing file: <%s>' % fname)
2557
2554
2558 def safe_run_module(self, mod_name, where):
2555 def safe_run_module(self, mod_name, where):
2559 """A safe version of runpy.run_module().
2556 """A safe version of runpy.run_module().
2560
2557
2561 This version will never throw an exception, but instead print
2558 This version will never throw an exception, but instead print
2562 helpful error messages to the screen.
2559 helpful error messages to the screen.
2563
2560
2564 `SystemExit` exceptions with status code 0 or None are ignored.
2561 `SystemExit` exceptions with status code 0 or None are ignored.
2565
2562
2566 Parameters
2563 Parameters
2567 ----------
2564 ----------
2568 mod_name : string
2565 mod_name : string
2569 The name of the module to be executed.
2566 The name of the module to be executed.
2570 where : dict
2567 where : dict
2571 The globals namespace.
2568 The globals namespace.
2572 """
2569 """
2573 try:
2570 try:
2574 try:
2571 try:
2575 where.update(
2572 where.update(
2576 runpy.run_module(str(mod_name), run_name="__main__",
2573 runpy.run_module(str(mod_name), run_name="__main__",
2577 alter_sys=True)
2574 alter_sys=True)
2578 )
2575 )
2579 except SystemExit as status:
2576 except SystemExit as status:
2580 if status.code:
2577 if status.code:
2581 raise
2578 raise
2582 except:
2579 except:
2583 self.showtraceback()
2580 self.showtraceback()
2584 warn('Unknown failure executing module: <%s>' % mod_name)
2581 warn('Unknown failure executing module: <%s>' % mod_name)
2585
2582
2586 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2583 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2587 """Run a complete IPython cell.
2584 """Run a complete IPython cell.
2588
2585
2589 Parameters
2586 Parameters
2590 ----------
2587 ----------
2591 raw_cell : str
2588 raw_cell : str
2592 The code (including IPython code such as %magic functions) to run.
2589 The code (including IPython code such as %magic functions) to run.
2593 store_history : bool
2590 store_history : bool
2594 If True, the raw and translated cell will be stored in IPython's
2591 If True, the raw and translated cell will be stored in IPython's
2595 history. For user code calling back into IPython's machinery, this
2592 history. For user code calling back into IPython's machinery, this
2596 should be set to False.
2593 should be set to False.
2597 silent : bool
2594 silent : bool
2598 If True, avoid side-effects, such as implicit displayhooks and
2595 If True, avoid side-effects, such as implicit displayhooks and
2599 and logging. silent=True forces store_history=False.
2596 and logging. silent=True forces store_history=False.
2600 shell_futures : bool
2597 shell_futures : bool
2601 If True, the code will share future statements with the interactive
2598 If True, the code will share future statements with the interactive
2602 shell. It will both be affected by previous __future__ imports, and
2599 shell. It will both be affected by previous __future__ imports, and
2603 any __future__ imports in the code will affect the shell. If False,
2600 any __future__ imports in the code will affect the shell. If False,
2604 __future__ imports are not shared in either direction.
2601 __future__ imports are not shared in either direction.
2605
2602
2606 Returns
2603 Returns
2607 -------
2604 -------
2608 result : :class:`ExecutionResult`
2605 result : :class:`ExecutionResult`
2609 """
2606 """
2610 result = ExecutionResult()
2607 result = ExecutionResult()
2611
2608
2612 if (not raw_cell) or raw_cell.isspace():
2609 if (not raw_cell) or raw_cell.isspace():
2613 return result
2610 return result
2614
2611
2615 if silent:
2612 if silent:
2616 store_history = False
2613 store_history = False
2617
2614
2618 if store_history:
2615 if store_history:
2619 result.execution_count = self.execution_count
2616 result.execution_count = self.execution_count
2620
2617
2621 def error_before_exec(value):
2618 def error_before_exec(value):
2622 result.error_before_exec = value
2619 result.error_before_exec = value
2623 return result
2620 return result
2624
2621
2625 self.events.trigger('pre_execute')
2622 self.events.trigger('pre_execute')
2626 if not silent:
2623 if not silent:
2627 self.events.trigger('pre_run_cell')
2624 self.events.trigger('pre_run_cell')
2628
2625
2629 # If any of our input transformation (input_transformer_manager or
2626 # If any of our input transformation (input_transformer_manager or
2630 # prefilter_manager) raises an exception, we store it in this variable
2627 # prefilter_manager) raises an exception, we store it in this variable
2631 # so that we can display the error after logging the input and storing
2628 # so that we can display the error after logging the input and storing
2632 # it in the history.
2629 # it in the history.
2633 preprocessing_exc_tuple = None
2630 preprocessing_exc_tuple = None
2634 try:
2631 try:
2635 # Static input transformations
2632 # Static input transformations
2636 cell = self.input_transformer_manager.transform_cell(raw_cell)
2633 cell = self.input_transformer_manager.transform_cell(raw_cell)
2637 except SyntaxError:
2634 except SyntaxError:
2638 preprocessing_exc_tuple = sys.exc_info()
2635 preprocessing_exc_tuple = sys.exc_info()
2639 cell = raw_cell # cell has to exist so it can be stored/logged
2636 cell = raw_cell # cell has to exist so it can be stored/logged
2640 else:
2637 else:
2641 if len(cell.splitlines()) == 1:
2638 if len(cell.splitlines()) == 1:
2642 # Dynamic transformations - only applied for single line commands
2639 # Dynamic transformations - only applied for single line commands
2643 with self.builtin_trap:
2640 with self.builtin_trap:
2644 try:
2641 try:
2645 # use prefilter_lines to handle trailing newlines
2642 # use prefilter_lines to handle trailing newlines
2646 # restore trailing newline for ast.parse
2643 # restore trailing newline for ast.parse
2647 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2644 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2648 except Exception:
2645 except Exception:
2649 # don't allow prefilter errors to crash IPython
2646 # don't allow prefilter errors to crash IPython
2650 preprocessing_exc_tuple = sys.exc_info()
2647 preprocessing_exc_tuple = sys.exc_info()
2651
2648
2652 # Store raw and processed history
2649 # Store raw and processed history
2653 if store_history:
2650 if store_history:
2654 self.history_manager.store_inputs(self.execution_count,
2651 self.history_manager.store_inputs(self.execution_count,
2655 cell, raw_cell)
2652 cell, raw_cell)
2656 if not silent:
2653 if not silent:
2657 self.logger.log(cell, raw_cell)
2654 self.logger.log(cell, raw_cell)
2658
2655
2659 # Display the exception if input processing failed.
2656 # Display the exception if input processing failed.
2660 if preprocessing_exc_tuple is not None:
2657 if preprocessing_exc_tuple is not None:
2661 self.showtraceback(preprocessing_exc_tuple)
2658 self.showtraceback(preprocessing_exc_tuple)
2662 if store_history:
2659 if store_history:
2663 self.execution_count += 1
2660 self.execution_count += 1
2664 return error_before_exec(preprocessing_exc_tuple[2])
2661 return error_before_exec(preprocessing_exc_tuple[2])
2665
2662
2666 # Our own compiler remembers the __future__ environment. If we want to
2663 # Our own compiler remembers the __future__ environment. If we want to
2667 # run code with a separate __future__ environment, use the default
2664 # run code with a separate __future__ environment, use the default
2668 # compiler
2665 # compiler
2669 compiler = self.compile if shell_futures else CachingCompiler()
2666 compiler = self.compile if shell_futures else CachingCompiler()
2670
2667
2671 with self.builtin_trap:
2668 with self.builtin_trap:
2672 cell_name = self.compile.cache(cell, self.execution_count)
2669 cell_name = self.compile.cache(cell, self.execution_count)
2673
2670
2674 with self.display_trap:
2671 with self.display_trap:
2675 # Compile to bytecode
2672 # Compile to bytecode
2676 try:
2673 try:
2677 code_ast = compiler.ast_parse(cell, filename=cell_name)
2674 code_ast = compiler.ast_parse(cell, filename=cell_name)
2678 except IndentationError as e:
2675 except IndentationError as e:
2679 self.showindentationerror()
2676 self.showindentationerror()
2680 if store_history:
2677 if store_history:
2681 self.execution_count += 1
2678 self.execution_count += 1
2682 return error_before_exec(e)
2679 return error_before_exec(e)
2683 except (OverflowError, SyntaxError, ValueError, TypeError,
2680 except (OverflowError, SyntaxError, ValueError, TypeError,
2684 MemoryError) as e:
2681 MemoryError) as e:
2685 self.showsyntaxerror()
2682 self.showsyntaxerror()
2686 if store_history:
2683 if store_history:
2687 self.execution_count += 1
2684 self.execution_count += 1
2688 return error_before_exec(e)
2685 return error_before_exec(e)
2689
2686
2690 # Apply AST transformations
2687 # Apply AST transformations
2691 try:
2688 try:
2692 code_ast = self.transform_ast(code_ast)
2689 code_ast = self.transform_ast(code_ast)
2693 except InputRejected as e:
2690 except InputRejected as e:
2694 self.showtraceback()
2691 self.showtraceback()
2695 if store_history:
2692 if store_history:
2696 self.execution_count += 1
2693 self.execution_count += 1
2697 return error_before_exec(e)
2694 return error_before_exec(e)
2698
2695
2699 # Give the displayhook a reference to our ExecutionResult so it
2696 # Give the displayhook a reference to our ExecutionResult so it
2700 # can fill in the output value.
2697 # can fill in the output value.
2701 self.displayhook.exec_result = result
2698 self.displayhook.exec_result = result
2702
2699
2703 # Execute the user code
2700 # Execute the user code
2704 interactivity = "none" if silent else self.ast_node_interactivity
2701 interactivity = "none" if silent else self.ast_node_interactivity
2705 self.run_ast_nodes(code_ast.body, cell_name,
2702 self.run_ast_nodes(code_ast.body, cell_name,
2706 interactivity=interactivity, compiler=compiler, result=result)
2703 interactivity=interactivity, compiler=compiler, result=result)
2707
2704
2708 # Reset this so later displayed values do not modify the
2705 # Reset this so later displayed values do not modify the
2709 # ExecutionResult
2706 # ExecutionResult
2710 self.displayhook.exec_result = None
2707 self.displayhook.exec_result = None
2711
2708
2712 self.events.trigger('post_execute')
2709 self.events.trigger('post_execute')
2713 if not silent:
2710 if not silent:
2714 self.events.trigger('post_run_cell')
2711 self.events.trigger('post_run_cell')
2715
2712
2716 if store_history:
2713 if store_history:
2717 # Write output to the database. Does nothing unless
2714 # Write output to the database. Does nothing unless
2718 # history output logging is enabled.
2715 # history output logging is enabled.
2719 self.history_manager.store_output(self.execution_count)
2716 self.history_manager.store_output(self.execution_count)
2720 # Each cell is a *single* input, regardless of how many lines it has
2717 # Each cell is a *single* input, regardless of how many lines it has
2721 self.execution_count += 1
2718 self.execution_count += 1
2722
2719
2723 return result
2720 return result
2724
2721
2725 def transform_ast(self, node):
2722 def transform_ast(self, node):
2726 """Apply the AST transformations from self.ast_transformers
2723 """Apply the AST transformations from self.ast_transformers
2727
2724
2728 Parameters
2725 Parameters
2729 ----------
2726 ----------
2730 node : ast.Node
2727 node : ast.Node
2731 The root node to be transformed. Typically called with the ast.Module
2728 The root node to be transformed. Typically called with the ast.Module
2732 produced by parsing user input.
2729 produced by parsing user input.
2733
2730
2734 Returns
2731 Returns
2735 -------
2732 -------
2736 An ast.Node corresponding to the node it was called with. Note that it
2733 An ast.Node corresponding to the node it was called with. Note that it
2737 may also modify the passed object, so don't rely on references to the
2734 may also modify the passed object, so don't rely on references to the
2738 original AST.
2735 original AST.
2739 """
2736 """
2740 for transformer in self.ast_transformers:
2737 for transformer in self.ast_transformers:
2741 try:
2738 try:
2742 node = transformer.visit(node)
2739 node = transformer.visit(node)
2743 except InputRejected:
2740 except InputRejected:
2744 # User-supplied AST transformers can reject an input by raising
2741 # User-supplied AST transformers can reject an input by raising
2745 # an InputRejected. Short-circuit in this case so that we
2742 # an InputRejected. Short-circuit in this case so that we
2746 # don't unregister the transform.
2743 # don't unregister the transform.
2747 raise
2744 raise
2748 except Exception:
2745 except Exception:
2749 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2746 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2750 self.ast_transformers.remove(transformer)
2747 self.ast_transformers.remove(transformer)
2751
2748
2752 if self.ast_transformers:
2749 if self.ast_transformers:
2753 ast.fix_missing_locations(node)
2750 ast.fix_missing_locations(node)
2754 return node
2751 return node
2755
2752
2756
2753
2757 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2754 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2758 compiler=compile, result=None):
2755 compiler=compile, result=None):
2759 """Run a sequence of AST nodes. The execution mode depends on the
2756 """Run a sequence of AST nodes. The execution mode depends on the
2760 interactivity parameter.
2757 interactivity parameter.
2761
2758
2762 Parameters
2759 Parameters
2763 ----------
2760 ----------
2764 nodelist : list
2761 nodelist : list
2765 A sequence of AST nodes to run.
2762 A sequence of AST nodes to run.
2766 cell_name : str
2763 cell_name : str
2767 Will be passed to the compiler as the filename of the cell. Typically
2764 Will be passed to the compiler as the filename of the cell. Typically
2768 the value returned by ip.compile.cache(cell).
2765 the value returned by ip.compile.cache(cell).
2769 interactivity : str
2766 interactivity : str
2770 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2767 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2771 run interactively (displaying output from expressions). 'last_expr'
2768 run interactively (displaying output from expressions). 'last_expr'
2772 will run the last node interactively only if it is an expression (i.e.
2769 will run the last node interactively only if it is an expression (i.e.
2773 expressions in loops or other blocks are not displayed. Other values
2770 expressions in loops or other blocks are not displayed. Other values
2774 for this parameter will raise a ValueError.
2771 for this parameter will raise a ValueError.
2775 compiler : callable
2772 compiler : callable
2776 A function with the same interface as the built-in compile(), to turn
2773 A function with the same interface as the built-in compile(), to turn
2777 the AST nodes into code objects. Default is the built-in compile().
2774 the AST nodes into code objects. Default is the built-in compile().
2778 result : ExecutionResult, optional
2775 result : ExecutionResult, optional
2779 An object to store exceptions that occur during execution.
2776 An object to store exceptions that occur during execution.
2780
2777
2781 Returns
2778 Returns
2782 -------
2779 -------
2783 True if an exception occurred while running code, False if it finished
2780 True if an exception occurred while running code, False if it finished
2784 running.
2781 running.
2785 """
2782 """
2786 if not nodelist:
2783 if not nodelist:
2787 return
2784 return
2788
2785
2789 if interactivity == 'last_expr':
2786 if interactivity == 'last_expr':
2790 if isinstance(nodelist[-1], ast.Expr):
2787 if isinstance(nodelist[-1], ast.Expr):
2791 interactivity = "last"
2788 interactivity = "last"
2792 else:
2789 else:
2793 interactivity = "none"
2790 interactivity = "none"
2794
2791
2795 if interactivity == 'none':
2792 if interactivity == 'none':
2796 to_run_exec, to_run_interactive = nodelist, []
2793 to_run_exec, to_run_interactive = nodelist, []
2797 elif interactivity == 'last':
2794 elif interactivity == 'last':
2798 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2795 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2799 elif interactivity == 'all':
2796 elif interactivity == 'all':
2800 to_run_exec, to_run_interactive = [], nodelist
2797 to_run_exec, to_run_interactive = [], nodelist
2801 else:
2798 else:
2802 raise ValueError("Interactivity was %r" % interactivity)
2799 raise ValueError("Interactivity was %r" % interactivity)
2803
2800
2804 try:
2801 try:
2805 for i, node in enumerate(to_run_exec):
2802 for i, node in enumerate(to_run_exec):
2806 mod = ast.Module([node])
2803 mod = ast.Module([node])
2807 code = compiler(mod, cell_name, "exec")
2804 code = compiler(mod, cell_name, "exec")
2808 if self.run_code(code, result):
2805 if self.run_code(code, result):
2809 return True
2806 return True
2810
2807
2811 for i, node in enumerate(to_run_interactive):
2808 for i, node in enumerate(to_run_interactive):
2812 mod = ast.Interactive([node])
2809 mod = ast.Interactive([node])
2813 code = compiler(mod, cell_name, "single")
2810 code = compiler(mod, cell_name, "single")
2814 if self.run_code(code, result):
2811 if self.run_code(code, result):
2815 return True
2812 return True
2816
2813
2817 # Flush softspace
2814 # Flush softspace
2818 if softspace(sys.stdout, 0):
2815 if softspace(sys.stdout, 0):
2819 print()
2816 print()
2820
2817
2821 except:
2818 except:
2822 # It's possible to have exceptions raised here, typically by
2819 # It's possible to have exceptions raised here, typically by
2823 # compilation of odd code (such as a naked 'return' outside a
2820 # compilation of odd code (such as a naked 'return' outside a
2824 # function) that did parse but isn't valid. Typically the exception
2821 # function) that did parse but isn't valid. Typically the exception
2825 # is a SyntaxError, but it's safest just to catch anything and show
2822 # is a SyntaxError, but it's safest just to catch anything and show
2826 # the user a traceback.
2823 # the user a traceback.
2827
2824
2828 # We do only one try/except outside the loop to minimize the impact
2825 # We do only one try/except outside the loop to minimize the impact
2829 # on runtime, and also because if any node in the node list is
2826 # on runtime, and also because if any node in the node list is
2830 # broken, we should stop execution completely.
2827 # broken, we should stop execution completely.
2831 if result:
2828 if result:
2832 result.error_before_exec = sys.exc_info()[1]
2829 result.error_before_exec = sys.exc_info()[1]
2833 self.showtraceback()
2830 self.showtraceback()
2834 return True
2831 return True
2835
2832
2836 return False
2833 return False
2837
2834
2838 def run_code(self, code_obj, result=None):
2835 def run_code(self, code_obj, result=None):
2839 """Execute a code object.
2836 """Execute a code object.
2840
2837
2841 When an exception occurs, self.showtraceback() is called to display a
2838 When an exception occurs, self.showtraceback() is called to display a
2842 traceback.
2839 traceback.
2843
2840
2844 Parameters
2841 Parameters
2845 ----------
2842 ----------
2846 code_obj : code object
2843 code_obj : code object
2847 A compiled code object, to be executed
2844 A compiled code object, to be executed
2848 result : ExecutionResult, optional
2845 result : ExecutionResult, optional
2849 An object to store exceptions that occur during execution.
2846 An object to store exceptions that occur during execution.
2850
2847
2851 Returns
2848 Returns
2852 -------
2849 -------
2853 False : successful execution.
2850 False : successful execution.
2854 True : an error occurred.
2851 True : an error occurred.
2855 """
2852 """
2856 # Set our own excepthook in case the user code tries to call it
2853 # Set our own excepthook in case the user code tries to call it
2857 # directly, so that the IPython crash handler doesn't get triggered
2854 # directly, so that the IPython crash handler doesn't get triggered
2858 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
2855 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
2859
2856
2860 # we save the original sys.excepthook in the instance, in case config
2857 # we save the original sys.excepthook in the instance, in case config
2861 # code (such as magics) needs access to it.
2858 # code (such as magics) needs access to it.
2862 self.sys_excepthook = old_excepthook
2859 self.sys_excepthook = old_excepthook
2863 outflag = 1 # happens in more places, so it's easier as default
2860 outflag = 1 # happens in more places, so it's easier as default
2864 try:
2861 try:
2865 try:
2862 try:
2866 self.hooks.pre_run_code_hook()
2863 self.hooks.pre_run_code_hook()
2867 #rprint('Running code', repr(code_obj)) # dbg
2864 #rprint('Running code', repr(code_obj)) # dbg
2868 exec(code_obj, self.user_global_ns, self.user_ns)
2865 exec(code_obj, self.user_global_ns, self.user_ns)
2869 finally:
2866 finally:
2870 # Reset our crash handler in place
2867 # Reset our crash handler in place
2871 sys.excepthook = old_excepthook
2868 sys.excepthook = old_excepthook
2872 except SystemExit as e:
2869 except SystemExit as e:
2873 if result is not None:
2870 if result is not None:
2874 result.error_in_exec = e
2871 result.error_in_exec = e
2875 self.showtraceback(exception_only=True)
2872 self.showtraceback(exception_only=True)
2876 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2873 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2877 except self.custom_exceptions:
2874 except self.custom_exceptions:
2878 etype, value, tb = sys.exc_info()
2875 etype, value, tb = sys.exc_info()
2879 if result is not None:
2876 if result is not None:
2880 result.error_in_exec = value
2877 result.error_in_exec = value
2881 self.CustomTB(etype, value, tb)
2878 self.CustomTB(etype, value, tb)
2882 except:
2879 except:
2883 if result is not None:
2880 if result is not None:
2884 result.error_in_exec = sys.exc_info()[1]
2881 result.error_in_exec = sys.exc_info()[1]
2885 self.showtraceback()
2882 self.showtraceback()
2886 else:
2883 else:
2887 outflag = 0
2884 outflag = 0
2888 return outflag
2885 return outflag
2889
2886
2890 # For backwards compatibility
2887 # For backwards compatibility
2891 runcode = run_code
2888 runcode = run_code
2892
2889
2893 #-------------------------------------------------------------------------
2890 #-------------------------------------------------------------------------
2894 # Things related to GUI support and pylab
2891 # Things related to GUI support and pylab
2895 #-------------------------------------------------------------------------
2892 #-------------------------------------------------------------------------
2896
2893
2897 def enable_gui(self, gui=None):
2894 def enable_gui(self, gui=None):
2898 raise NotImplementedError('Implement enable_gui in a subclass')
2895 raise NotImplementedError('Implement enable_gui in a subclass')
2899
2896
2900 def enable_matplotlib(self, gui=None):
2897 def enable_matplotlib(self, gui=None):
2901 """Enable interactive matplotlib and inline figure support.
2898 """Enable interactive matplotlib and inline figure support.
2902
2899
2903 This takes the following steps:
2900 This takes the following steps:
2904
2901
2905 1. select the appropriate eventloop and matplotlib backend
2902 1. select the appropriate eventloop and matplotlib backend
2906 2. set up matplotlib for interactive use with that backend
2903 2. set up matplotlib for interactive use with that backend
2907 3. configure formatters for inline figure display
2904 3. configure formatters for inline figure display
2908 4. enable the selected gui eventloop
2905 4. enable the selected gui eventloop
2909
2906
2910 Parameters
2907 Parameters
2911 ----------
2908 ----------
2912 gui : optional, string
2909 gui : optional, string
2913 If given, dictates the choice of matplotlib GUI backend to use
2910 If given, dictates the choice of matplotlib GUI backend to use
2914 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2911 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2915 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2912 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2916 matplotlib (as dictated by the matplotlib build-time options plus the
2913 matplotlib (as dictated by the matplotlib build-time options plus the
2917 user's matplotlibrc configuration file). Note that not all backends
2914 user's matplotlibrc configuration file). Note that not all backends
2918 make sense in all contexts, for example a terminal ipython can't
2915 make sense in all contexts, for example a terminal ipython can't
2919 display figures inline.
2916 display figures inline.
2920 """
2917 """
2921 from IPython.core import pylabtools as pt
2918 from IPython.core import pylabtools as pt
2922 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
2919 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
2923
2920
2924 if gui != 'inline':
2921 if gui != 'inline':
2925 # If we have our first gui selection, store it
2922 # If we have our first gui selection, store it
2926 if self.pylab_gui_select is None:
2923 if self.pylab_gui_select is None:
2927 self.pylab_gui_select = gui
2924 self.pylab_gui_select = gui
2928 # Otherwise if they are different
2925 # Otherwise if they are different
2929 elif gui != self.pylab_gui_select:
2926 elif gui != self.pylab_gui_select:
2930 print ('Warning: Cannot change to a different GUI toolkit: %s.'
2927 print ('Warning: Cannot change to a different GUI toolkit: %s.'
2931 ' Using %s instead.' % (gui, self.pylab_gui_select))
2928 ' Using %s instead.' % (gui, self.pylab_gui_select))
2932 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
2929 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
2933
2930
2934 pt.activate_matplotlib(backend)
2931 pt.activate_matplotlib(backend)
2935 pt.configure_inline_support(self, backend)
2932 pt.configure_inline_support(self, backend)
2936
2933
2937 # Now we must activate the gui pylab wants to use, and fix %run to take
2934 # Now we must activate the gui pylab wants to use, and fix %run to take
2938 # plot updates into account
2935 # plot updates into account
2939 self.enable_gui(gui)
2936 self.enable_gui(gui)
2940 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2937 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2941 pt.mpl_runner(self.safe_execfile)
2938 pt.mpl_runner(self.safe_execfile)
2942
2939
2943 return gui, backend
2940 return gui, backend
2944
2941
2945 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2942 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2946 """Activate pylab support at runtime.
2943 """Activate pylab support at runtime.
2947
2944
2948 This turns on support for matplotlib, preloads into the interactive
2945 This turns on support for matplotlib, preloads into the interactive
2949 namespace all of numpy and pylab, and configures IPython to correctly
2946 namespace all of numpy and pylab, and configures IPython to correctly
2950 interact with the GUI event loop. The GUI backend to be used can be
2947 interact with the GUI event loop. The GUI backend to be used can be
2951 optionally selected with the optional ``gui`` argument.
2948 optionally selected with the optional ``gui`` argument.
2952
2949
2953 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
2950 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
2954
2951
2955 Parameters
2952 Parameters
2956 ----------
2953 ----------
2957 gui : optional, string
2954 gui : optional, string
2958 If given, dictates the choice of matplotlib GUI backend to use
2955 If given, dictates the choice of matplotlib GUI backend to use
2959 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2956 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2960 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2957 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2961 matplotlib (as dictated by the matplotlib build-time options plus the
2958 matplotlib (as dictated by the matplotlib build-time options plus the
2962 user's matplotlibrc configuration file). Note that not all backends
2959 user's matplotlibrc configuration file). Note that not all backends
2963 make sense in all contexts, for example a terminal ipython can't
2960 make sense in all contexts, for example a terminal ipython can't
2964 display figures inline.
2961 display figures inline.
2965 import_all : optional, bool, default: True
2962 import_all : optional, bool, default: True
2966 Whether to do `from numpy import *` and `from pylab import *`
2963 Whether to do `from numpy import *` and `from pylab import *`
2967 in addition to module imports.
2964 in addition to module imports.
2968 welcome_message : deprecated
2965 welcome_message : deprecated
2969 This argument is ignored, no welcome message will be displayed.
2966 This argument is ignored, no welcome message will be displayed.
2970 """
2967 """
2971 from IPython.core.pylabtools import import_pylab
2968 from IPython.core.pylabtools import import_pylab
2972
2969
2973 gui, backend = self.enable_matplotlib(gui)
2970 gui, backend = self.enable_matplotlib(gui)
2974
2971
2975 # We want to prevent the loading of pylab to pollute the user's
2972 # We want to prevent the loading of pylab to pollute the user's
2976 # namespace as shown by the %who* magics, so we execute the activation
2973 # namespace as shown by the %who* magics, so we execute the activation
2977 # code in an empty namespace, and we update *both* user_ns and
2974 # code in an empty namespace, and we update *both* user_ns and
2978 # user_ns_hidden with this information.
2975 # user_ns_hidden with this information.
2979 ns = {}
2976 ns = {}
2980 import_pylab(ns, import_all)
2977 import_pylab(ns, import_all)
2981 # warn about clobbered names
2978 # warn about clobbered names
2982 ignored = {"__builtins__"}
2979 ignored = {"__builtins__"}
2983 both = set(ns).intersection(self.user_ns).difference(ignored)
2980 both = set(ns).intersection(self.user_ns).difference(ignored)
2984 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
2981 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
2985 self.user_ns.update(ns)
2982 self.user_ns.update(ns)
2986 self.user_ns_hidden.update(ns)
2983 self.user_ns_hidden.update(ns)
2987 return gui, backend, clobbered
2984 return gui, backend, clobbered
2988
2985
2989 #-------------------------------------------------------------------------
2986 #-------------------------------------------------------------------------
2990 # Utilities
2987 # Utilities
2991 #-------------------------------------------------------------------------
2988 #-------------------------------------------------------------------------
2992
2989
2993 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2990 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2994 """Expand python variables in a string.
2991 """Expand python variables in a string.
2995
2992
2996 The depth argument indicates how many frames above the caller should
2993 The depth argument indicates how many frames above the caller should
2997 be walked to look for the local namespace where to expand variables.
2994 be walked to look for the local namespace where to expand variables.
2998
2995
2999 The global namespace for expansion is always the user's interactive
2996 The global namespace for expansion is always the user's interactive
3000 namespace.
2997 namespace.
3001 """
2998 """
3002 ns = self.user_ns.copy()
2999 ns = self.user_ns.copy()
3003 try:
3000 try:
3004 frame = sys._getframe(depth+1)
3001 frame = sys._getframe(depth+1)
3005 except ValueError:
3002 except ValueError:
3006 # This is thrown if there aren't that many frames on the stack,
3003 # This is thrown if there aren't that many frames on the stack,
3007 # e.g. if a script called run_line_magic() directly.
3004 # e.g. if a script called run_line_magic() directly.
3008 pass
3005 pass
3009 else:
3006 else:
3010 ns.update(frame.f_locals)
3007 ns.update(frame.f_locals)
3011
3008
3012 try:
3009 try:
3013 # We have to use .vformat() here, because 'self' is a valid and common
3010 # We have to use .vformat() here, because 'self' is a valid and common
3014 # name, and expanding **ns for .format() would make it collide with
3011 # name, and expanding **ns for .format() would make it collide with
3015 # the 'self' argument of the method.
3012 # the 'self' argument of the method.
3016 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3013 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3017 except Exception:
3014 except Exception:
3018 # if formatter couldn't format, just let it go untransformed
3015 # if formatter couldn't format, just let it go untransformed
3019 pass
3016 pass
3020 return cmd
3017 return cmd
3021
3018
3022 def mktempfile(self, data=None, prefix='ipython_edit_'):
3019 def mktempfile(self, data=None, prefix='ipython_edit_'):
3023 """Make a new tempfile and return its filename.
3020 """Make a new tempfile and return its filename.
3024
3021
3025 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3022 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3026 but it registers the created filename internally so ipython cleans it up
3023 but it registers the created filename internally so ipython cleans it up
3027 at exit time.
3024 at exit time.
3028
3025
3029 Optional inputs:
3026 Optional inputs:
3030
3027
3031 - data(None): if data is given, it gets written out to the temp file
3028 - data(None): if data is given, it gets written out to the temp file
3032 immediately, and the file is closed again."""
3029 immediately, and the file is closed again."""
3033
3030
3034 dirname = tempfile.mkdtemp(prefix=prefix)
3031 dirname = tempfile.mkdtemp(prefix=prefix)
3035 self.tempdirs.append(dirname)
3032 self.tempdirs.append(dirname)
3036
3033
3037 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3034 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3038 os.close(handle) # On Windows, there can only be one open handle on a file
3035 os.close(handle) # On Windows, there can only be one open handle on a file
3039 self.tempfiles.append(filename)
3036 self.tempfiles.append(filename)
3040
3037
3041 if data:
3038 if data:
3042 tmp_file = open(filename,'w')
3039 tmp_file = open(filename,'w')
3043 tmp_file.write(data)
3040 tmp_file.write(data)
3044 tmp_file.close()
3041 tmp_file.close()
3045 return filename
3042 return filename
3046
3043
3047 @undoc
3044 @undoc
3048 def write(self,data):
3045 def write(self,data):
3049 """DEPRECATED: Write a string to the default output"""
3046 """DEPRECATED: Write a string to the default output"""
3050 warn('InteractiveShell.write() is deprecated, use sys.stdout instead',
3047 warn('InteractiveShell.write() is deprecated, use sys.stdout instead',
3051 DeprecationWarning, stacklevel=2)
3048 DeprecationWarning, stacklevel=2)
3052 sys.stdout.write(data)
3049 sys.stdout.write(data)
3053
3050
3054 @undoc
3051 @undoc
3055 def write_err(self,data):
3052 def write_err(self,data):
3056 """DEPRECATED: Write a string to the default error output"""
3053 """DEPRECATED: Write a string to the default error output"""
3057 warn('InteractiveShell.write_err() is deprecated, use sys.stderr instead',
3054 warn('InteractiveShell.write_err() is deprecated, use sys.stderr instead',
3058 DeprecationWarning, stacklevel=2)
3055 DeprecationWarning, stacklevel=2)
3059 sys.stderr.write(data)
3056 sys.stderr.write(data)
3060
3057
3061 def ask_yes_no(self, prompt, default=None, interrupt=None):
3058 def ask_yes_no(self, prompt, default=None, interrupt=None):
3062 if self.quiet:
3059 if self.quiet:
3063 return True
3060 return True
3064 return ask_yes_no(prompt,default,interrupt)
3061 return ask_yes_no(prompt,default,interrupt)
3065
3062
3066 def show_usage(self):
3063 def show_usage(self):
3067 """Show a usage message"""
3064 """Show a usage message"""
3068 page.page(IPython.core.usage.interactive_usage)
3065 page.page(IPython.core.usage.interactive_usage)
3069
3066
3070 def extract_input_lines(self, range_str, raw=False):
3067 def extract_input_lines(self, range_str, raw=False):
3071 """Return as a string a set of input history slices.
3068 """Return as a string a set of input history slices.
3072
3069
3073 Parameters
3070 Parameters
3074 ----------
3071 ----------
3075 range_str : string
3072 range_str : string
3076 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3073 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3077 since this function is for use by magic functions which get their
3074 since this function is for use by magic functions which get their
3078 arguments as strings. The number before the / is the session
3075 arguments as strings. The number before the / is the session
3079 number: ~n goes n back from the current session.
3076 number: ~n goes n back from the current session.
3080
3077
3081 raw : bool, optional
3078 raw : bool, optional
3082 By default, the processed input is used. If this is true, the raw
3079 By default, the processed input is used. If this is true, the raw
3083 input history is used instead.
3080 input history is used instead.
3084
3081
3085 Notes
3082 Notes
3086 -----
3083 -----
3087
3084
3088 Slices can be described with two notations:
3085 Slices can be described with two notations:
3089
3086
3090 * ``N:M`` -> standard python form, means including items N...(M-1).
3087 * ``N:M`` -> standard python form, means including items N...(M-1).
3091 * ``N-M`` -> include items N..M (closed endpoint).
3088 * ``N-M`` -> include items N..M (closed endpoint).
3092 """
3089 """
3093 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3090 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3094 return "\n".join(x for _, _, x in lines)
3091 return "\n".join(x for _, _, x in lines)
3095
3092
3096 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3093 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3097 """Get a code string from history, file, url, or a string or macro.
3094 """Get a code string from history, file, url, or a string or macro.
3098
3095
3099 This is mainly used by magic functions.
3096 This is mainly used by magic functions.
3100
3097
3101 Parameters
3098 Parameters
3102 ----------
3099 ----------
3103
3100
3104 target : str
3101 target : str
3105
3102
3106 A string specifying code to retrieve. This will be tried respectively
3103 A string specifying code to retrieve. This will be tried respectively
3107 as: ranges of input history (see %history for syntax), url,
3104 as: ranges of input history (see %history for syntax), url,
3108 corresponding .py file, filename, or an expression evaluating to a
3105 corresponding .py file, filename, or an expression evaluating to a
3109 string or Macro in the user namespace.
3106 string or Macro in the user namespace.
3110
3107
3111 raw : bool
3108 raw : bool
3112 If true (default), retrieve raw history. Has no effect on the other
3109 If true (default), retrieve raw history. Has no effect on the other
3113 retrieval mechanisms.
3110 retrieval mechanisms.
3114
3111
3115 py_only : bool (default False)
3112 py_only : bool (default False)
3116 Only try to fetch python code, do not try alternative methods to decode file
3113 Only try to fetch python code, do not try alternative methods to decode file
3117 if unicode fails.
3114 if unicode fails.
3118
3115
3119 Returns
3116 Returns
3120 -------
3117 -------
3121 A string of code.
3118 A string of code.
3122
3119
3123 ValueError is raised if nothing is found, and TypeError if it evaluates
3120 ValueError is raised if nothing is found, and TypeError if it evaluates
3124 to an object of another type. In each case, .args[0] is a printable
3121 to an object of another type. In each case, .args[0] is a printable
3125 message.
3122 message.
3126 """
3123 """
3127 code = self.extract_input_lines(target, raw=raw) # Grab history
3124 code = self.extract_input_lines(target, raw=raw) # Grab history
3128 if code:
3125 if code:
3129 return code
3126 return code
3130 utarget = unquote_filename(target)
3127 utarget = unquote_filename(target)
3131 try:
3128 try:
3132 if utarget.startswith(('http://', 'https://')):
3129 if utarget.startswith(('http://', 'https://')):
3133 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3130 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3134 except UnicodeDecodeError:
3131 except UnicodeDecodeError:
3135 if not py_only :
3132 if not py_only :
3136 # Deferred import
3133 # Deferred import
3137 try:
3134 try:
3138 from urllib.request import urlopen # Py3
3135 from urllib.request import urlopen # Py3
3139 except ImportError:
3136 except ImportError:
3140 from urllib import urlopen
3137 from urllib import urlopen
3141 response = urlopen(target)
3138 response = urlopen(target)
3142 return response.read().decode('latin1')
3139 return response.read().decode('latin1')
3143 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3140 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3144
3141
3145 potential_target = [target]
3142 potential_target = [target]
3146 try :
3143 try :
3147 potential_target.insert(0,get_py_filename(target))
3144 potential_target.insert(0,get_py_filename(target))
3148 except IOError:
3145 except IOError:
3149 pass
3146 pass
3150
3147
3151 for tgt in potential_target :
3148 for tgt in potential_target :
3152 if os.path.isfile(tgt): # Read file
3149 if os.path.isfile(tgt): # Read file
3153 try :
3150 try :
3154 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3151 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3155 except UnicodeDecodeError :
3152 except UnicodeDecodeError :
3156 if not py_only :
3153 if not py_only :
3157 with io_open(tgt,'r', encoding='latin1') as f :
3154 with io_open(tgt,'r', encoding='latin1') as f :
3158 return f.read()
3155 return f.read()
3159 raise ValueError(("'%s' seem to be unreadable.") % target)
3156 raise ValueError(("'%s' seem to be unreadable.") % target)
3160 elif os.path.isdir(os.path.expanduser(tgt)):
3157 elif os.path.isdir(os.path.expanduser(tgt)):
3161 raise ValueError("'%s' is a directory, not a regular file." % target)
3158 raise ValueError("'%s' is a directory, not a regular file." % target)
3162
3159
3163 if search_ns:
3160 if search_ns:
3164 # Inspect namespace to load object source
3161 # Inspect namespace to load object source
3165 object_info = self.object_inspect(target, detail_level=1)
3162 object_info = self.object_inspect(target, detail_level=1)
3166 if object_info['found'] and object_info['source']:
3163 if object_info['found'] and object_info['source']:
3167 return object_info['source']
3164 return object_info['source']
3168
3165
3169 try: # User namespace
3166 try: # User namespace
3170 codeobj = eval(target, self.user_ns)
3167 codeobj = eval(target, self.user_ns)
3171 except Exception:
3168 except Exception:
3172 raise ValueError(("'%s' was not found in history, as a file, url, "
3169 raise ValueError(("'%s' was not found in history, as a file, url, "
3173 "nor in the user namespace.") % target)
3170 "nor in the user namespace.") % target)
3174
3171
3175 if isinstance(codeobj, string_types):
3172 if isinstance(codeobj, string_types):
3176 return codeobj
3173 return codeobj
3177 elif isinstance(codeobj, Macro):
3174 elif isinstance(codeobj, Macro):
3178 return codeobj.value
3175 return codeobj.value
3179
3176
3180 raise TypeError("%s is neither a string nor a macro." % target,
3177 raise TypeError("%s is neither a string nor a macro." % target,
3181 codeobj)
3178 codeobj)
3182
3179
3183 #-------------------------------------------------------------------------
3180 #-------------------------------------------------------------------------
3184 # Things related to IPython exiting
3181 # Things related to IPython exiting
3185 #-------------------------------------------------------------------------
3182 #-------------------------------------------------------------------------
3186 def atexit_operations(self):
3183 def atexit_operations(self):
3187 """This will be executed at the time of exit.
3184 """This will be executed at the time of exit.
3188
3185
3189 Cleanup operations and saving of persistent data that is done
3186 Cleanup operations and saving of persistent data that is done
3190 unconditionally by IPython should be performed here.
3187 unconditionally by IPython should be performed here.
3191
3188
3192 For things that may depend on startup flags or platform specifics (such
3189 For things that may depend on startup flags or platform specifics (such
3193 as having readline or not), register a separate atexit function in the
3190 as having readline or not), register a separate atexit function in the
3194 code that has the appropriate information, rather than trying to
3191 code that has the appropriate information, rather than trying to
3195 clutter
3192 clutter
3196 """
3193 """
3197 # Close the history session (this stores the end time and line count)
3194 # Close the history session (this stores the end time and line count)
3198 # this must be *before* the tempfile cleanup, in case of temporary
3195 # this must be *before* the tempfile cleanup, in case of temporary
3199 # history db
3196 # history db
3200 self.history_manager.end_session()
3197 self.history_manager.end_session()
3201
3198
3202 # Cleanup all tempfiles and folders left around
3199 # Cleanup all tempfiles and folders left around
3203 for tfile in self.tempfiles:
3200 for tfile in self.tempfiles:
3204 try:
3201 try:
3205 os.unlink(tfile)
3202 os.unlink(tfile)
3206 except OSError:
3203 except OSError:
3207 pass
3204 pass
3208
3205
3209 for tdir in self.tempdirs:
3206 for tdir in self.tempdirs:
3210 try:
3207 try:
3211 os.rmdir(tdir)
3208 os.rmdir(tdir)
3212 except OSError:
3209 except OSError:
3213 pass
3210 pass
3214
3211
3215 # Clear all user namespaces to release all references cleanly.
3212 # Clear all user namespaces to release all references cleanly.
3216 self.reset(new_session=False)
3213 self.reset(new_session=False)
3217
3214
3218 # Run user hooks
3215 # Run user hooks
3219 self.hooks.shutdown_hook()
3216 self.hooks.shutdown_hook()
3220
3217
3221 def cleanup(self):
3218 def cleanup(self):
3222 self.restore_sys_module_state()
3219 self.restore_sys_module_state()
3223
3220
3224
3221
3225 class InteractiveShellABC(with_metaclass(abc.ABCMeta, object)):
3222 class InteractiveShellABC(with_metaclass(abc.ABCMeta, object)):
3226 """An abstract base class for InteractiveShell."""
3223 """An abstract base class for InteractiveShell."""
3227
3224
3228 InteractiveShellABC.register(InteractiveShell)
3225 InteractiveShellABC.register(InteractiveShell)
@@ -1,614 +1,597 b''
1 """Implementation of basic magic functions."""
1 """Implementation of basic magic functions."""
2
2
3 from __future__ import print_function
3 from __future__ import print_function
4 from __future__ import absolute_import
4 from __future__ import absolute_import
5
5
6 import io
6 import io
7 import sys
7 import sys
8 from pprint import pformat
8 from pprint import pformat
9
9
10 from IPython.core import magic_arguments, page
10 from IPython.core import magic_arguments, page
11 from IPython.core.error import UsageError
11 from IPython.core.error import UsageError
12 from IPython.core.magic import Magics, magics_class, line_magic, magic_escapes
12 from IPython.core.magic import Magics, magics_class, line_magic, magic_escapes
13 from IPython.utils.text import format_screen, dedent, indent
13 from IPython.utils.text import format_screen, dedent, indent
14 from IPython.testing.skipdoctest import skip_doctest
14 from IPython.testing.skipdoctest import skip_doctest
15 from IPython.utils.ipstruct import Struct
15 from IPython.utils.ipstruct import Struct
16 from IPython.utils.path import unquote_filename
16 from IPython.utils.path import unquote_filename
17 from IPython.utils.py3compat import unicode_type
17 from IPython.utils.py3compat import unicode_type
18 from warnings import warn
18 from warnings import warn
19 from logging import error
19 from logging import error
20
20
21
21
22 class MagicsDisplay(object):
22 class MagicsDisplay(object):
23 def __init__(self, magics_manager):
23 def __init__(self, magics_manager):
24 self.magics_manager = magics_manager
24 self.magics_manager = magics_manager
25
25
26 def _lsmagic(self):
26 def _lsmagic(self):
27 """The main implementation of the %lsmagic"""
27 """The main implementation of the %lsmagic"""
28 mesc = magic_escapes['line']
28 mesc = magic_escapes['line']
29 cesc = magic_escapes['cell']
29 cesc = magic_escapes['cell']
30 mman = self.magics_manager
30 mman = self.magics_manager
31 magics = mman.lsmagic()
31 magics = mman.lsmagic()
32 out = ['Available line magics:',
32 out = ['Available line magics:',
33 mesc + (' '+mesc).join(sorted(magics['line'])),
33 mesc + (' '+mesc).join(sorted(magics['line'])),
34 '',
34 '',
35 'Available cell magics:',
35 'Available cell magics:',
36 cesc + (' '+cesc).join(sorted(magics['cell'])),
36 cesc + (' '+cesc).join(sorted(magics['cell'])),
37 '',
37 '',
38 mman.auto_status()]
38 mman.auto_status()]
39 return '\n'.join(out)
39 return '\n'.join(out)
40
40
41 def _repr_pretty_(self, p, cycle):
41 def _repr_pretty_(self, p, cycle):
42 p.text(self._lsmagic())
42 p.text(self._lsmagic())
43
43
44 def __str__(self):
44 def __str__(self):
45 return self._lsmagic()
45 return self._lsmagic()
46
46
47 def _jsonable(self):
47 def _jsonable(self):
48 """turn magics dict into jsonable dict of the same structure
48 """turn magics dict into jsonable dict of the same structure
49
49
50 replaces object instances with their class names as strings
50 replaces object instances with their class names as strings
51 """
51 """
52 magic_dict = {}
52 magic_dict = {}
53 mman = self.magics_manager
53 mman = self.magics_manager
54 magics = mman.lsmagic()
54 magics = mman.lsmagic()
55 for key, subdict in magics.items():
55 for key, subdict in magics.items():
56 d = {}
56 d = {}
57 magic_dict[key] = d
57 magic_dict[key] = d
58 for name, obj in subdict.items():
58 for name, obj in subdict.items():
59 try:
59 try:
60 classname = obj.__self__.__class__.__name__
60 classname = obj.__self__.__class__.__name__
61 except AttributeError:
61 except AttributeError:
62 classname = 'Other'
62 classname = 'Other'
63
63
64 d[name] = classname
64 d[name] = classname
65 return magic_dict
65 return magic_dict
66
66
67 def _repr_json_(self):
67 def _repr_json_(self):
68 return self._jsonable()
68 return self._jsonable()
69
69
70
70
71 @magics_class
71 @magics_class
72 class BasicMagics(Magics):
72 class BasicMagics(Magics):
73 """Magics that provide central IPython functionality.
73 """Magics that provide central IPython functionality.
74
74
75 These are various magics that don't fit into specific categories but that
75 These are various magics that don't fit into specific categories but that
76 are all part of the base 'IPython experience'."""
76 are all part of the base 'IPython experience'."""
77
77
78 @magic_arguments.magic_arguments()
78 @magic_arguments.magic_arguments()
79 @magic_arguments.argument(
79 @magic_arguments.argument(
80 '-l', '--line', action='store_true',
80 '-l', '--line', action='store_true',
81 help="""Create a line magic alias."""
81 help="""Create a line magic alias."""
82 )
82 )
83 @magic_arguments.argument(
83 @magic_arguments.argument(
84 '-c', '--cell', action='store_true',
84 '-c', '--cell', action='store_true',
85 help="""Create a cell magic alias."""
85 help="""Create a cell magic alias."""
86 )
86 )
87 @magic_arguments.argument(
87 @magic_arguments.argument(
88 'name',
88 'name',
89 help="""Name of the magic to be created."""
89 help="""Name of the magic to be created."""
90 )
90 )
91 @magic_arguments.argument(
91 @magic_arguments.argument(
92 'target',
92 'target',
93 help="""Name of the existing line or cell magic."""
93 help="""Name of the existing line or cell magic."""
94 )
94 )
95 @line_magic
95 @line_magic
96 def alias_magic(self, line=''):
96 def alias_magic(self, line=''):
97 """Create an alias for an existing line or cell magic.
97 """Create an alias for an existing line or cell magic.
98
98
99 Examples
99 Examples
100 --------
100 --------
101 ::
101 ::
102
102
103 In [1]: %alias_magic t timeit
103 In [1]: %alias_magic t timeit
104 Created `%t` as an alias for `%timeit`.
104 Created `%t` as an alias for `%timeit`.
105 Created `%%t` as an alias for `%%timeit`.
105 Created `%%t` as an alias for `%%timeit`.
106
106
107 In [2]: %t -n1 pass
107 In [2]: %t -n1 pass
108 1 loops, best of 3: 954 ns per loop
108 1 loops, best of 3: 954 ns per loop
109
109
110 In [3]: %%t -n1
110 In [3]: %%t -n1
111 ...: pass
111 ...: pass
112 ...:
112 ...:
113 1 loops, best of 3: 954 ns per loop
113 1 loops, best of 3: 954 ns per loop
114
114
115 In [4]: %alias_magic --cell whereami pwd
115 In [4]: %alias_magic --cell whereami pwd
116 UsageError: Cell magic function `%%pwd` not found.
116 UsageError: Cell magic function `%%pwd` not found.
117 In [5]: %alias_magic --line whereami pwd
117 In [5]: %alias_magic --line whereami pwd
118 Created `%whereami` as an alias for `%pwd`.
118 Created `%whereami` as an alias for `%pwd`.
119
119
120 In [6]: %whereami
120 In [6]: %whereami
121 Out[6]: u'/home/testuser'
121 Out[6]: u'/home/testuser'
122 """
122 """
123 args = magic_arguments.parse_argstring(self.alias_magic, line)
123 args = magic_arguments.parse_argstring(self.alias_magic, line)
124 shell = self.shell
124 shell = self.shell
125 mman = self.shell.magics_manager
125 mman = self.shell.magics_manager
126 escs = ''.join(magic_escapes.values())
126 escs = ''.join(magic_escapes.values())
127
127
128 target = args.target.lstrip(escs)
128 target = args.target.lstrip(escs)
129 name = args.name.lstrip(escs)
129 name = args.name.lstrip(escs)
130
130
131 # Find the requested magics.
131 # Find the requested magics.
132 m_line = shell.find_magic(target, 'line')
132 m_line = shell.find_magic(target, 'line')
133 m_cell = shell.find_magic(target, 'cell')
133 m_cell = shell.find_magic(target, 'cell')
134 if args.line and m_line is None:
134 if args.line and m_line is None:
135 raise UsageError('Line magic function `%s%s` not found.' %
135 raise UsageError('Line magic function `%s%s` not found.' %
136 (magic_escapes['line'], target))
136 (magic_escapes['line'], target))
137 if args.cell and m_cell is None:
137 if args.cell and m_cell is None:
138 raise UsageError('Cell magic function `%s%s` not found.' %
138 raise UsageError('Cell magic function `%s%s` not found.' %
139 (magic_escapes['cell'], target))
139 (magic_escapes['cell'], target))
140
140
141 # If --line and --cell are not specified, default to the ones
141 # If --line and --cell are not specified, default to the ones
142 # that are available.
142 # that are available.
143 if not args.line and not args.cell:
143 if not args.line and not args.cell:
144 if not m_line and not m_cell:
144 if not m_line and not m_cell:
145 raise UsageError(
145 raise UsageError(
146 'No line or cell magic with name `%s` found.' % target
146 'No line or cell magic with name `%s` found.' % target
147 )
147 )
148 args.line = bool(m_line)
148 args.line = bool(m_line)
149 args.cell = bool(m_cell)
149 args.cell = bool(m_cell)
150
150
151 if args.line:
151 if args.line:
152 mman.register_alias(name, target, 'line')
152 mman.register_alias(name, target, 'line')
153 print('Created `%s%s` as an alias for `%s%s`.' % (
153 print('Created `%s%s` as an alias for `%s%s`.' % (
154 magic_escapes['line'], name,
154 magic_escapes['line'], name,
155 magic_escapes['line'], target))
155 magic_escapes['line'], target))
156
156
157 if args.cell:
157 if args.cell:
158 mman.register_alias(name, target, 'cell')
158 mman.register_alias(name, target, 'cell')
159 print('Created `%s%s` as an alias for `%s%s`.' % (
159 print('Created `%s%s` as an alias for `%s%s`.' % (
160 magic_escapes['cell'], name,
160 magic_escapes['cell'], name,
161 magic_escapes['cell'], target))
161 magic_escapes['cell'], target))
162
162
163 @line_magic
163 @line_magic
164 def lsmagic(self, parameter_s=''):
164 def lsmagic(self, parameter_s=''):
165 """List currently available magic functions."""
165 """List currently available magic functions."""
166 return MagicsDisplay(self.shell.magics_manager)
166 return MagicsDisplay(self.shell.magics_manager)
167
167
168 def _magic_docs(self, brief=False, rest=False):
168 def _magic_docs(self, brief=False, rest=False):
169 """Return docstrings from magic functions."""
169 """Return docstrings from magic functions."""
170 mman = self.shell.magics_manager
170 mman = self.shell.magics_manager
171 docs = mman.lsmagic_docs(brief, missing='No documentation')
171 docs = mman.lsmagic_docs(brief, missing='No documentation')
172
172
173 if rest:
173 if rest:
174 format_string = '**%s%s**::\n\n%s\n\n'
174 format_string = '**%s%s**::\n\n%s\n\n'
175 else:
175 else:
176 format_string = '%s%s:\n%s\n'
176 format_string = '%s%s:\n%s\n'
177
177
178 return ''.join(
178 return ''.join(
179 [format_string % (magic_escapes['line'], fname,
179 [format_string % (magic_escapes['line'], fname,
180 indent(dedent(fndoc)))
180 indent(dedent(fndoc)))
181 for fname, fndoc in sorted(docs['line'].items())]
181 for fname, fndoc in sorted(docs['line'].items())]
182 +
182 +
183 [format_string % (magic_escapes['cell'], fname,
183 [format_string % (magic_escapes['cell'], fname,
184 indent(dedent(fndoc)))
184 indent(dedent(fndoc)))
185 for fname, fndoc in sorted(docs['cell'].items())]
185 for fname, fndoc in sorted(docs['cell'].items())]
186 )
186 )
187
187
188 @line_magic
188 @line_magic
189 def magic(self, parameter_s=''):
189 def magic(self, parameter_s=''):
190 """Print information about the magic function system.
190 """Print information about the magic function system.
191
191
192 Supported formats: -latex, -brief, -rest
192 Supported formats: -latex, -brief, -rest
193 """
193 """
194
194
195 mode = ''
195 mode = ''
196 try:
196 try:
197 mode = parameter_s.split()[0][1:]
197 mode = parameter_s.split()[0][1:]
198 except IndexError:
198 except IndexError:
199 pass
199 pass
200
200
201 brief = (mode == 'brief')
201 brief = (mode == 'brief')
202 rest = (mode == 'rest')
202 rest = (mode == 'rest')
203 magic_docs = self._magic_docs(brief, rest)
203 magic_docs = self._magic_docs(brief, rest)
204
204
205 if mode == 'latex':
205 if mode == 'latex':
206 print(self.format_latex(magic_docs))
206 print(self.format_latex(magic_docs))
207 return
207 return
208 else:
208 else:
209 magic_docs = format_screen(magic_docs)
209 magic_docs = format_screen(magic_docs)
210
210
211 out = ["""
211 out = ["""
212 IPython's 'magic' functions
212 IPython's 'magic' functions
213 ===========================
213 ===========================
214
214
215 The magic function system provides a series of functions which allow you to
215 The magic function system provides a series of functions which allow you to
216 control the behavior of IPython itself, plus a lot of system-type
216 control the behavior of IPython itself, plus a lot of system-type
217 features. There are two kinds of magics, line-oriented and cell-oriented.
217 features. There are two kinds of magics, line-oriented and cell-oriented.
218
218
219 Line magics are prefixed with the % character and work much like OS
219 Line magics are prefixed with the % character and work much like OS
220 command-line calls: they get as an argument the rest of the line, where
220 command-line calls: they get as an argument the rest of the line, where
221 arguments are passed without parentheses or quotes. For example, this will
221 arguments are passed without parentheses or quotes. For example, this will
222 time the given statement::
222 time the given statement::
223
223
224 %timeit range(1000)
224 %timeit range(1000)
225
225
226 Cell magics are prefixed with a double %%, and they are functions that get as
226 Cell magics are prefixed with a double %%, and they are functions that get as
227 an argument not only the rest of the line, but also the lines below it in a
227 an argument not only the rest of the line, but also the lines below it in a
228 separate argument. These magics are called with two arguments: the rest of the
228 separate argument. These magics are called with two arguments: the rest of the
229 call line and the body of the cell, consisting of the lines below the first.
229 call line and the body of the cell, consisting of the lines below the first.
230 For example::
230 For example::
231
231
232 %%timeit x = numpy.random.randn((100, 100))
232 %%timeit x = numpy.random.randn((100, 100))
233 numpy.linalg.svd(x)
233 numpy.linalg.svd(x)
234
234
235 will time the execution of the numpy svd routine, running the assignment of x
235 will time the execution of the numpy svd routine, running the assignment of x
236 as part of the setup phase, which is not timed.
236 as part of the setup phase, which is not timed.
237
237
238 In a line-oriented client (the terminal or Qt console IPython), starting a new
238 In a line-oriented client (the terminal or Qt console IPython), starting a new
239 input with %% will automatically enter cell mode, and IPython will continue
239 input with %% will automatically enter cell mode, and IPython will continue
240 reading input until a blank line is given. In the notebook, simply type the
240 reading input until a blank line is given. In the notebook, simply type the
241 whole cell as one entity, but keep in mind that the %% escape can only be at
241 whole cell as one entity, but keep in mind that the %% escape can only be at
242 the very start of the cell.
242 the very start of the cell.
243
243
244 NOTE: If you have 'automagic' enabled (via the command line option or with the
244 NOTE: If you have 'automagic' enabled (via the command line option or with the
245 %automagic function), you don't need to type in the % explicitly for line
245 %automagic function), you don't need to type in the % explicitly for line
246 magics; cell magics always require an explicit '%%' escape. By default,
246 magics; cell magics always require an explicit '%%' escape. By default,
247 IPython ships with automagic on, so you should only rarely need the % escape.
247 IPython ships with automagic on, so you should only rarely need the % escape.
248
248
249 Example: typing '%cd mydir' (without the quotes) changes your working directory
249 Example: typing '%cd mydir' (without the quotes) changes your working directory
250 to 'mydir', if it exists.
250 to 'mydir', if it exists.
251
251
252 For a list of the available magic functions, use %lsmagic. For a description
252 For a list of the available magic functions, use %lsmagic. For a description
253 of any of them, type %magic_name?, e.g. '%cd?'.
253 of any of them, type %magic_name?, e.g. '%cd?'.
254
254
255 Currently the magic system has the following functions:""",
255 Currently the magic system has the following functions:""",
256 magic_docs,
256 magic_docs,
257 "Summary of magic functions (from %slsmagic):" % magic_escapes['line'],
257 "Summary of magic functions (from %slsmagic):" % magic_escapes['line'],
258 str(self.lsmagic()),
258 str(self.lsmagic()),
259 ]
259 ]
260 page.page('\n'.join(out))
260 page.page('\n'.join(out))
261
261
262
262
263 @line_magic
263 @line_magic
264 def page(self, parameter_s=''):
264 def page(self, parameter_s=''):
265 """Pretty print the object and display it through a pager.
265 """Pretty print the object and display it through a pager.
266
266
267 %page [options] OBJECT
267 %page [options] OBJECT
268
268
269 If no object is given, use _ (last output).
269 If no object is given, use _ (last output).
270
270
271 Options:
271 Options:
272
272
273 -r: page str(object), don't pretty-print it."""
273 -r: page str(object), don't pretty-print it."""
274
274
275 # After a function contributed by Olivier Aubert, slightly modified.
275 # After a function contributed by Olivier Aubert, slightly modified.
276
276
277 # Process options/args
277 # Process options/args
278 opts, args = self.parse_options(parameter_s, 'r')
278 opts, args = self.parse_options(parameter_s, 'r')
279 raw = 'r' in opts
279 raw = 'r' in opts
280
280
281 oname = args and args or '_'
281 oname = args and args or '_'
282 info = self.shell._ofind(oname)
282 info = self.shell._ofind(oname)
283 if info['found']:
283 if info['found']:
284 txt = (raw and str or pformat)( info['obj'] )
284 txt = (raw and str or pformat)( info['obj'] )
285 page.page(txt)
285 page.page(txt)
286 else:
286 else:
287 print('Object `%s` not found' % oname)
287 print('Object `%s` not found' % oname)
288
288
289 @line_magic
289 @line_magic
290 def profile(self, parameter_s=''):
290 def profile(self, parameter_s=''):
291 """Print your currently active IPython profile.
291 """Print your currently active IPython profile.
292
292
293 See Also
293 See Also
294 --------
294 --------
295 prun : run code using the Python profiler
295 prun : run code using the Python profiler
296 (:meth:`~IPython.core.magics.execution.ExecutionMagics.prun`)
296 (:meth:`~IPython.core.magics.execution.ExecutionMagics.prun`)
297 """
297 """
298 warn("%profile is now deprecated. Please use get_ipython().profile instead.")
298 warn("%profile is now deprecated. Please use get_ipython().profile instead.")
299 from IPython.core.application import BaseIPythonApplication
299 from IPython.core.application import BaseIPythonApplication
300 if BaseIPythonApplication.initialized():
300 if BaseIPythonApplication.initialized():
301 print(BaseIPythonApplication.instance().profile)
301 print(BaseIPythonApplication.instance().profile)
302 else:
302 else:
303 error("profile is an application-level value, but you don't appear to be in an IPython application")
303 error("profile is an application-level value, but you don't appear to be in an IPython application")
304
304
305 @line_magic
305 @line_magic
306 def pprint(self, parameter_s=''):
306 def pprint(self, parameter_s=''):
307 """Toggle pretty printing on/off."""
307 """Toggle pretty printing on/off."""
308 ptformatter = self.shell.display_formatter.formatters['text/plain']
308 ptformatter = self.shell.display_formatter.formatters['text/plain']
309 ptformatter.pprint = bool(1 - ptformatter.pprint)
309 ptformatter.pprint = bool(1 - ptformatter.pprint)
310 print('Pretty printing has been turned',
310 print('Pretty printing has been turned',
311 ['OFF','ON'][ptformatter.pprint])
311 ['OFF','ON'][ptformatter.pprint])
312
312
313 @line_magic
313 @line_magic
314 def colors(self, parameter_s=''):
314 def colors(self, parameter_s=''):
315 """Switch color scheme for prompts, info system and exception handlers.
315 """Switch color scheme for prompts, info system and exception handlers.
316
316
317 Currently implemented schemes: NoColor, Linux, LightBG.
317 Currently implemented schemes: NoColor, Linux, LightBG.
318
318
319 Color scheme names are not case-sensitive.
319 Color scheme names are not case-sensitive.
320
320
321 Examples
321 Examples
322 --------
322 --------
323 To get a plain black and white terminal::
323 To get a plain black and white terminal::
324
324
325 %colors nocolor
325 %colors nocolor
326 """
326 """
327 def color_switch_err(name):
327 def color_switch_err(name):
328 warn('Error changing %s color schemes.\n%s' %
328 warn('Error changing %s color schemes.\n%s' %
329 (name, sys.exc_info()[1]))
329 (name, sys.exc_info()[1]))
330
330
331
331
332 new_scheme = parameter_s.strip()
332 new_scheme = parameter_s.strip()
333 if not new_scheme:
333 if not new_scheme:
334 raise UsageError(
334 raise UsageError(
335 "%colors: you must specify a color scheme. See '%colors?'")
335 "%colors: you must specify a color scheme. See '%colors?'")
336 # local shortcut
336 # local shortcut
337 shell = self.shell
337 shell = self.shell
338
338
339
339
340
340
341 if not shell.colors_force:
341 if not shell.colors_force:
342 if sys.platform in {'win32', 'cli'}:
342 if sys.platform in {'win32', 'cli'}:
343 import IPython.utils.rlineimpl as readline
343 import IPython.utils.rlineimpl as readline
344 if not readline.have_readline:
344 if not readline.have_readline:
345 msg = """\
345 msg = """\
346 Proper color support under MS Windows requires the pyreadline library.
346 Proper color support under MS Windows requires the pyreadline library.
347 You can find it at:
347 You can find it at:
348 http://ipython.org/pyreadline.html
348 http://ipython.org/pyreadline.html
349
349
350 Defaulting color scheme to 'NoColor'"""
350 Defaulting color scheme to 'NoColor'"""
351 new_scheme = 'NoColor'
351 new_scheme = 'NoColor'
352 warn(msg)
352 warn(msg)
353
353
354 elif not shell.has_readline:
354 elif not shell.has_readline:
355 # Coloured prompts get messed up without readline
355 # Coloured prompts get messed up without readline
356 # Will remove this check after switching to prompt_toolkit
356 # Will remove this check after switching to prompt_toolkit
357 new_scheme = 'NoColor'
357 new_scheme = 'NoColor'
358
358
359 # Set prompt colors
360 try:
361 shell.prompt_manager.color_scheme = new_scheme
362 except:
363 color_switch_err('prompt')
364 else:
365 shell.colors = \
366 shell.prompt_manager.color_scheme_table.active_scheme_name
367 # Set exception colors
359 # Set exception colors
368 try:
360 try:
369 shell.InteractiveTB.set_colors(scheme = new_scheme)
361 shell.InteractiveTB.set_colors(scheme = new_scheme)
370 shell.SyntaxTB.set_colors(scheme = new_scheme)
362 shell.SyntaxTB.set_colors(scheme = new_scheme)
371 except:
363 except:
372 color_switch_err('exception')
364 color_switch_err('exception')
373
365
374 # Set info (for 'object?') colors
366 # Set info (for 'object?') colors
375 if shell.color_info:
367 if shell.color_info:
376 try:
368 try:
377 shell.inspector.set_active_scheme(new_scheme)
369 shell.inspector.set_active_scheme(new_scheme)
378 except:
370 except:
379 color_switch_err('object inspector')
371 color_switch_err('object inspector')
380 else:
372 else:
381 shell.inspector.set_active_scheme('NoColor')
373 shell.inspector.set_active_scheme('NoColor')
382
374
383 @line_magic
375 @line_magic
384 def xmode(self, parameter_s=''):
376 def xmode(self, parameter_s=''):
385 """Switch modes for the exception handlers.
377 """Switch modes for the exception handlers.
386
378
387 Valid modes: Plain, Context and Verbose.
379 Valid modes: Plain, Context and Verbose.
388
380
389 If called without arguments, acts as a toggle."""
381 If called without arguments, acts as a toggle."""
390
382
391 def xmode_switch_err(name):
383 def xmode_switch_err(name):
392 warn('Error changing %s exception modes.\n%s' %
384 warn('Error changing %s exception modes.\n%s' %
393 (name,sys.exc_info()[1]))
385 (name,sys.exc_info()[1]))
394
386
395 shell = self.shell
387 shell = self.shell
396 new_mode = parameter_s.strip().capitalize()
388 new_mode = parameter_s.strip().capitalize()
397 try:
389 try:
398 shell.InteractiveTB.set_mode(mode=new_mode)
390 shell.InteractiveTB.set_mode(mode=new_mode)
399 print('Exception reporting mode:',shell.InteractiveTB.mode)
391 print('Exception reporting mode:',shell.InteractiveTB.mode)
400 except:
392 except:
401 xmode_switch_err('user')
393 xmode_switch_err('user')
402
394
403 @line_magic
395 @line_magic
404 def quickref(self,arg):
396 def quickref(self,arg):
405 """ Show a quick reference sheet """
397 """ Show a quick reference sheet """
406 from IPython.core.usage import quick_reference
398 from IPython.core.usage import quick_reference
407 qr = quick_reference + self._magic_docs(brief=True)
399 qr = quick_reference + self._magic_docs(brief=True)
408 page.page(qr)
400 page.page(qr)
409
401
410 @line_magic
402 @line_magic
411 def doctest_mode(self, parameter_s=''):
403 def doctest_mode(self, parameter_s=''):
412 """Toggle doctest mode on and off.
404 """Toggle doctest mode on and off.
413
405
414 This mode is intended to make IPython behave as much as possible like a
406 This mode is intended to make IPython behave as much as possible like a
415 plain Python shell, from the perspective of how its prompts, exceptions
407 plain Python shell, from the perspective of how its prompts, exceptions
416 and output look. This makes it easy to copy and paste parts of a
408 and output look. This makes it easy to copy and paste parts of a
417 session into doctests. It does so by:
409 session into doctests. It does so by:
418
410
419 - Changing the prompts to the classic ``>>>`` ones.
411 - Changing the prompts to the classic ``>>>`` ones.
420 - Changing the exception reporting mode to 'Plain'.
412 - Changing the exception reporting mode to 'Plain'.
421 - Disabling pretty-printing of output.
413 - Disabling pretty-printing of output.
422
414
423 Note that IPython also supports the pasting of code snippets that have
415 Note that IPython also supports the pasting of code snippets that have
424 leading '>>>' and '...' prompts in them. This means that you can paste
416 leading '>>>' and '...' prompts in them. This means that you can paste
425 doctests from files or docstrings (even if they have leading
417 doctests from files or docstrings (even if they have leading
426 whitespace), and the code will execute correctly. You can then use
418 whitespace), and the code will execute correctly. You can then use
427 '%history -t' to see the translated history; this will give you the
419 '%history -t' to see the translated history; this will give you the
428 input after removal of all the leading prompts and whitespace, which
420 input after removal of all the leading prompts and whitespace, which
429 can be pasted back into an editor.
421 can be pasted back into an editor.
430
422
431 With these features, you can switch into this mode easily whenever you
423 With these features, you can switch into this mode easily whenever you
432 need to do testing and changes to doctests, without having to leave
424 need to do testing and changes to doctests, without having to leave
433 your existing IPython session.
425 your existing IPython session.
434 """
426 """
435
427
436 # Shorthands
428 # Shorthands
437 shell = self.shell
429 shell = self.shell
438 pm = shell.prompt_manager
439 meta = shell.meta
430 meta = shell.meta
440 disp_formatter = self.shell.display_formatter
431 disp_formatter = self.shell.display_formatter
441 ptformatter = disp_formatter.formatters['text/plain']
432 ptformatter = disp_formatter.formatters['text/plain']
442 # dstore is a data store kept in the instance metadata bag to track any
433 # dstore is a data store kept in the instance metadata bag to track any
443 # changes we make, so we can undo them later.
434 # changes we make, so we can undo them later.
444 dstore = meta.setdefault('doctest_mode',Struct())
435 dstore = meta.setdefault('doctest_mode',Struct())
445 save_dstore = dstore.setdefault
436 save_dstore = dstore.setdefault
446
437
447 # save a few values we'll need to recover later
438 # save a few values we'll need to recover later
448 mode = save_dstore('mode',False)
439 mode = save_dstore('mode',False)
449 save_dstore('rc_pprint',ptformatter.pprint)
440 save_dstore('rc_pprint',ptformatter.pprint)
450 save_dstore('xmode',shell.InteractiveTB.mode)
441 save_dstore('xmode',shell.InteractiveTB.mode)
451 save_dstore('rc_separate_out',shell.separate_out)
442 save_dstore('rc_separate_out',shell.separate_out)
452 save_dstore('rc_separate_out2',shell.separate_out2)
443 save_dstore('rc_separate_out2',shell.separate_out2)
453 save_dstore('rc_prompts_pad_left',pm.justify)
444 save_dstore('rc_prompts_pad_left',pm.justify)
454 save_dstore('rc_separate_in',shell.separate_in)
445 save_dstore('rc_separate_in',shell.separate_in)
455 save_dstore('rc_active_types',disp_formatter.active_types)
446 save_dstore('rc_active_types',disp_formatter.active_types)
456 save_dstore('prompt_templates',(pm.in_template, pm.in2_template, pm.out_template))
447 save_dstore('prompt_templates',(pm.in_template, pm.in2_template, pm.out_template))
457
448
458 if not mode:
449 if not mode:
459 # turn on
450 # turn on
460 pm.in_template = '>>> '
461 pm.in2_template = '... '
462 pm.out_template = ''
463
451
464 # Prompt separators like plain python
452 # Prompt separators like plain python
465 shell.separate_in = ''
453 shell.separate_in = ''
466 shell.separate_out = ''
454 shell.separate_out = ''
467 shell.separate_out2 = ''
455 shell.separate_out2 = ''
468
456
469 pm.justify = False
470
457
471 ptformatter.pprint = False
458 ptformatter.pprint = False
472 disp_formatter.active_types = ['text/plain']
459 disp_formatter.active_types = ['text/plain']
473
460
474 shell.magic('xmode Plain')
461 shell.magic('xmode Plain')
475 else:
462 else:
476 # turn off
463 # turn off
477 pm.in_template, pm.in2_template, pm.out_template = dstore.prompt_templates
478
479 shell.separate_in = dstore.rc_separate_in
464 shell.separate_in = dstore.rc_separate_in
480
465
481 shell.separate_out = dstore.rc_separate_out
466 shell.separate_out = dstore.rc_separate_out
482 shell.separate_out2 = dstore.rc_separate_out2
467 shell.separate_out2 = dstore.rc_separate_out2
483
468
484 pm.justify = dstore.rc_prompts_pad_left
485
486 ptformatter.pprint = dstore.rc_pprint
469 ptformatter.pprint = dstore.rc_pprint
487 disp_formatter.active_types = dstore.rc_active_types
470 disp_formatter.active_types = dstore.rc_active_types
488
471
489 shell.magic('xmode ' + dstore.xmode)
472 shell.magic('xmode ' + dstore.xmode)
490
473
491 # Store new mode and inform
474 # Store new mode and inform
492 dstore.mode = bool(1-int(mode))
475 dstore.mode = bool(1-int(mode))
493 mode_label = ['OFF','ON'][dstore.mode]
476 mode_label = ['OFF','ON'][dstore.mode]
494 print('Doctest mode is:', mode_label)
477 print('Doctest mode is:', mode_label)
495
478
496 @line_magic
479 @line_magic
497 def gui(self, parameter_s=''):
480 def gui(self, parameter_s=''):
498 """Enable or disable IPython GUI event loop integration.
481 """Enable or disable IPython GUI event loop integration.
499
482
500 %gui [GUINAME]
483 %gui [GUINAME]
501
484
502 This magic replaces IPython's threaded shells that were activated
485 This magic replaces IPython's threaded shells that were activated
503 using the (pylab/wthread/etc.) command line flags. GUI toolkits
486 using the (pylab/wthread/etc.) command line flags. GUI toolkits
504 can now be enabled at runtime and keyboard
487 can now be enabled at runtime and keyboard
505 interrupts should work without any problems. The following toolkits
488 interrupts should work without any problems. The following toolkits
506 are supported: wxPython, PyQt4, PyGTK, Tk and Cocoa (OSX)::
489 are supported: wxPython, PyQt4, PyGTK, Tk and Cocoa (OSX)::
507
490
508 %gui wx # enable wxPython event loop integration
491 %gui wx # enable wxPython event loop integration
509 %gui qt4|qt # enable PyQt4 event loop integration
492 %gui qt4|qt # enable PyQt4 event loop integration
510 %gui qt5 # enable PyQt5 event loop integration
493 %gui qt5 # enable PyQt5 event loop integration
511 %gui gtk # enable PyGTK event loop integration
494 %gui gtk # enable PyGTK event loop integration
512 %gui gtk3 # enable Gtk3 event loop integration
495 %gui gtk3 # enable Gtk3 event loop integration
513 %gui tk # enable Tk event loop integration
496 %gui tk # enable Tk event loop integration
514 %gui osx # enable Cocoa event loop integration
497 %gui osx # enable Cocoa event loop integration
515 # (requires %matplotlib 1.1)
498 # (requires %matplotlib 1.1)
516 %gui # disable all event loop integration
499 %gui # disable all event loop integration
517
500
518 WARNING: after any of these has been called you can simply create
501 WARNING: after any of these has been called you can simply create
519 an application object, but DO NOT start the event loop yourself, as
502 an application object, but DO NOT start the event loop yourself, as
520 we have already handled that.
503 we have already handled that.
521 """
504 """
522 opts, arg = self.parse_options(parameter_s, '')
505 opts, arg = self.parse_options(parameter_s, '')
523 if arg=='': arg = None
506 if arg=='': arg = None
524 try:
507 try:
525 return self.shell.enable_gui(arg)
508 return self.shell.enable_gui(arg)
526 except Exception as e:
509 except Exception as e:
527 # print simple error message, rather than traceback if we can't
510 # print simple error message, rather than traceback if we can't
528 # hook up the GUI
511 # hook up the GUI
529 error(str(e))
512 error(str(e))
530
513
531 @skip_doctest
514 @skip_doctest
532 @line_magic
515 @line_magic
533 def precision(self, s=''):
516 def precision(self, s=''):
534 """Set floating point precision for pretty printing.
517 """Set floating point precision for pretty printing.
535
518
536 Can set either integer precision or a format string.
519 Can set either integer precision or a format string.
537
520
538 If numpy has been imported and precision is an int,
521 If numpy has been imported and precision is an int,
539 numpy display precision will also be set, via ``numpy.set_printoptions``.
522 numpy display precision will also be set, via ``numpy.set_printoptions``.
540
523
541 If no argument is given, defaults will be restored.
524 If no argument is given, defaults will be restored.
542
525
543 Examples
526 Examples
544 --------
527 --------
545 ::
528 ::
546
529
547 In [1]: from math import pi
530 In [1]: from math import pi
548
531
549 In [2]: %precision 3
532 In [2]: %precision 3
550 Out[2]: u'%.3f'
533 Out[2]: u'%.3f'
551
534
552 In [3]: pi
535 In [3]: pi
553 Out[3]: 3.142
536 Out[3]: 3.142
554
537
555 In [4]: %precision %i
538 In [4]: %precision %i
556 Out[4]: u'%i'
539 Out[4]: u'%i'
557
540
558 In [5]: pi
541 In [5]: pi
559 Out[5]: 3
542 Out[5]: 3
560
543
561 In [6]: %precision %e
544 In [6]: %precision %e
562 Out[6]: u'%e'
545 Out[6]: u'%e'
563
546
564 In [7]: pi**10
547 In [7]: pi**10
565 Out[7]: 9.364805e+04
548 Out[7]: 9.364805e+04
566
549
567 In [8]: %precision
550 In [8]: %precision
568 Out[8]: u'%r'
551 Out[8]: u'%r'
569
552
570 In [9]: pi**10
553 In [9]: pi**10
571 Out[9]: 93648.047476082982
554 Out[9]: 93648.047476082982
572 """
555 """
573 ptformatter = self.shell.display_formatter.formatters['text/plain']
556 ptformatter = self.shell.display_formatter.formatters['text/plain']
574 ptformatter.float_precision = s
557 ptformatter.float_precision = s
575 return ptformatter.float_format
558 return ptformatter.float_format
576
559
577 @magic_arguments.magic_arguments()
560 @magic_arguments.magic_arguments()
578 @magic_arguments.argument(
561 @magic_arguments.argument(
579 '-e', '--export', action='store_true', default=False,
562 '-e', '--export', action='store_true', default=False,
580 help='Export IPython history as a notebook. The filename argument '
563 help='Export IPython history as a notebook. The filename argument '
581 'is used to specify the notebook name and format. For example '
564 'is used to specify the notebook name and format. For example '
582 'a filename of notebook.ipynb will result in a notebook name '
565 'a filename of notebook.ipynb will result in a notebook name '
583 'of "notebook" and a format of "json". Likewise using a ".py" '
566 'of "notebook" and a format of "json". Likewise using a ".py" '
584 'file extension will write the notebook as a Python script'
567 'file extension will write the notebook as a Python script'
585 )
568 )
586 @magic_arguments.argument(
569 @magic_arguments.argument(
587 'filename', type=unicode_type,
570 'filename', type=unicode_type,
588 help='Notebook name or filename'
571 help='Notebook name or filename'
589 )
572 )
590 @line_magic
573 @line_magic
591 def notebook(self, s):
574 def notebook(self, s):
592 """Export and convert IPython notebooks.
575 """Export and convert IPython notebooks.
593
576
594 This function can export the current IPython history to a notebook file.
577 This function can export the current IPython history to a notebook file.
595 For example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
578 For example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
596 To export the history to "foo.py" do "%notebook -e foo.py".
579 To export the history to "foo.py" do "%notebook -e foo.py".
597 """
580 """
598 args = magic_arguments.parse_argstring(self.notebook, s)
581 args = magic_arguments.parse_argstring(self.notebook, s)
599
582
600 from nbformat import write, v4
583 from nbformat import write, v4
601 args.filename = unquote_filename(args.filename)
584 args.filename = unquote_filename(args.filename)
602 if args.export:
585 if args.export:
603 cells = []
586 cells = []
604 hist = list(self.shell.history_manager.get_range())
587 hist = list(self.shell.history_manager.get_range())
605 if(len(hist)<=1):
588 if(len(hist)<=1):
606 raise ValueError('History is empty, cannot export')
589 raise ValueError('History is empty, cannot export')
607 for session, execution_count, source in hist[:-1]:
590 for session, execution_count, source in hist[:-1]:
608 cells.append(v4.new_code_cell(
591 cells.append(v4.new_code_cell(
609 execution_count=execution_count,
592 execution_count=execution_count,
610 source=source
593 source=source
611 ))
594 ))
612 nb = v4.new_notebook(cells=cells)
595 nb = v4.new_notebook(cells=cells)
613 with io.open(args.filename, 'w', encoding='utf-8') as f:
596 with io.open(args.filename, 'w', encoding='utf-8') as f:
614 write(nb, f, version=4)
597 write(nb, f, version=4)
@@ -1,517 +1,510 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 from __future__ import absolute_import
14 from __future__ import absolute_import
15
15
16
16
17 import functools
17 import functools
18 import os
18 import os
19 from os.path import join as pjoin
19 from os.path import join as pjoin
20 import random
20 import random
21 import sys
21 import sys
22 import tempfile
22 import tempfile
23 import textwrap
23 import textwrap
24 import unittest
24 import unittest
25
25
26 try:
26 try:
27 from unittest.mock import patch
27 from unittest.mock import patch
28 except ImportError:
28 except ImportError:
29 from mock import patch
29 from mock import patch
30
30
31 import nose.tools as nt
31 import nose.tools as nt
32 from nose import SkipTest
32 from nose import SkipTest
33
33
34 from IPython.testing import decorators as dec
34 from IPython.testing import decorators as dec
35 from IPython.testing import tools as tt
35 from IPython.testing import tools as tt
36 from IPython.utils import py3compat
36 from IPython.utils import py3compat
37 from IPython.utils.io import capture_output
37 from IPython.utils.io import capture_output
38 from IPython.utils.tempdir import TemporaryDirectory
38 from IPython.utils.tempdir import TemporaryDirectory
39 from IPython.core import debugger
39 from IPython.core import debugger
40
40
41
41
42 def doctest_refbug():
42 def doctest_refbug():
43 """Very nasty problem with references held by multiple runs of a script.
43 """Very nasty problem with references held by multiple runs of a script.
44 See: https://github.com/ipython/ipython/issues/141
44 See: https://github.com/ipython/ipython/issues/141
45
45
46 In [1]: _ip.clear_main_mod_cache()
46 In [1]: _ip.clear_main_mod_cache()
47 # random
47 # random
48
48
49 In [2]: %run refbug
49 In [2]: %run refbug
50
50
51 In [3]: call_f()
51 In [3]: call_f()
52 lowercased: hello
52 lowercased: hello
53
53
54 In [4]: %run refbug
54 In [4]: %run refbug
55
55
56 In [5]: call_f()
56 In [5]: call_f()
57 lowercased: hello
57 lowercased: hello
58 lowercased: hello
58 lowercased: hello
59 """
59 """
60
60
61
61
62 def doctest_run_builtins():
62 def doctest_run_builtins():
63 r"""Check that %run doesn't damage __builtins__.
63 r"""Check that %run doesn't damage __builtins__.
64
64
65 In [1]: import tempfile
65 In [1]: import tempfile
66
66
67 In [2]: bid1 = id(__builtins__)
67 In [2]: bid1 = id(__builtins__)
68
68
69 In [3]: fname = tempfile.mkstemp('.py')[1]
69 In [3]: fname = tempfile.mkstemp('.py')[1]
70
70
71 In [3]: f = open(fname,'w')
71 In [3]: f = open(fname,'w')
72
72
73 In [4]: dummy= f.write('pass\n')
73 In [4]: dummy= f.write('pass\n')
74
74
75 In [5]: f.flush()
75 In [5]: f.flush()
76
76
77 In [6]: t1 = type(__builtins__)
77 In [6]: t1 = type(__builtins__)
78
78
79 In [7]: %run $fname
79 In [7]: %run $fname
80
80
81 In [7]: f.close()
81 In [7]: f.close()
82
82
83 In [8]: bid2 = id(__builtins__)
83 In [8]: bid2 = id(__builtins__)
84
84
85 In [9]: t2 = type(__builtins__)
85 In [9]: t2 = type(__builtins__)
86
86
87 In [10]: t1 == t2
87 In [10]: t1 == t2
88 Out[10]: True
88 Out[10]: True
89
89
90 In [10]: bid1 == bid2
90 In [10]: bid1 == bid2
91 Out[10]: True
91 Out[10]: True
92
92
93 In [12]: try:
93 In [12]: try:
94 ....: os.unlink(fname)
94 ....: os.unlink(fname)
95 ....: except:
95 ....: except:
96 ....: pass
96 ....: pass
97 ....:
97 ....:
98 """
98 """
99
99
100
100
101 def doctest_run_option_parser():
101 def doctest_run_option_parser():
102 r"""Test option parser in %run.
102 r"""Test option parser in %run.
103
103
104 In [1]: %run print_argv.py
104 In [1]: %run print_argv.py
105 []
105 []
106
106
107 In [2]: %run print_argv.py print*.py
107 In [2]: %run print_argv.py print*.py
108 ['print_argv.py']
108 ['print_argv.py']
109
109
110 In [3]: %run -G print_argv.py print*.py
110 In [3]: %run -G print_argv.py print*.py
111 ['print*.py']
111 ['print*.py']
112
112
113 """
113 """
114
114
115
115
116 @dec.skip_win32
116 @dec.skip_win32
117 def doctest_run_option_parser_for_posix():
117 def doctest_run_option_parser_for_posix():
118 r"""Test option parser in %run (Linux/OSX specific).
118 r"""Test option parser in %run (Linux/OSX specific).
119
119
120 You need double quote to escape glob in POSIX systems:
120 You need double quote to escape glob in POSIX systems:
121
121
122 In [1]: %run print_argv.py print\\*.py
122 In [1]: %run print_argv.py print\\*.py
123 ['print*.py']
123 ['print*.py']
124
124
125 You can't use quote to escape glob in POSIX systems:
125 You can't use quote to escape glob in POSIX systems:
126
126
127 In [2]: %run print_argv.py 'print*.py'
127 In [2]: %run print_argv.py 'print*.py'
128 ['print_argv.py']
128 ['print_argv.py']
129
129
130 """
130 """
131
131
132
132
133 @dec.skip_if_not_win32
133 @dec.skip_if_not_win32
134 def doctest_run_option_parser_for_windows():
134 def doctest_run_option_parser_for_windows():
135 r"""Test option parser in %run (Windows specific).
135 r"""Test option parser in %run (Windows specific).
136
136
137 In Windows, you can't escape ``*` `by backslash:
137 In Windows, you can't escape ``*` `by backslash:
138
138
139 In [1]: %run print_argv.py print\\*.py
139 In [1]: %run print_argv.py print\\*.py
140 ['print\\*.py']
140 ['print\\*.py']
141
141
142 You can use quote to escape glob:
142 You can use quote to escape glob:
143
143
144 In [2]: %run print_argv.py 'print*.py'
144 In [2]: %run print_argv.py 'print*.py'
145 ['print*.py']
145 ['print*.py']
146
146
147 """
147 """
148
148
149
149
150 @py3compat.doctest_refactor_print
150 @py3compat.doctest_refactor_print
151 def doctest_reset_del():
151 def doctest_reset_del():
152 """Test that resetting doesn't cause errors in __del__ methods.
152 """Test that resetting doesn't cause errors in __del__ methods.
153
153
154 In [2]: class A(object):
154 In [2]: class A(object):
155 ...: def __del__(self):
155 ...: def __del__(self):
156 ...: print str("Hi")
156 ...: print str("Hi")
157 ...:
157 ...:
158
158
159 In [3]: a = A()
159 In [3]: a = A()
160
160
161 In [4]: get_ipython().reset()
161 In [4]: get_ipython().reset()
162 Hi
162 Hi
163
163
164 In [5]: 1+1
164 In [5]: 1+1
165 Out[5]: 2
165 Out[5]: 2
166 """
166 """
167
167
168 # For some tests, it will be handy to organize them in a class with a common
168 # For some tests, it will be handy to organize them in a class with a common
169 # setup that makes a temp file
169 # setup that makes a temp file
170
170
171 class TestMagicRunPass(tt.TempFileMixin):
171 class TestMagicRunPass(tt.TempFileMixin):
172
172
173 def setup(self):
173 def setup(self):
174 """Make a valid python temp file."""
174 """Make a valid python temp file."""
175 self.mktmp('pass\n')
175 self.mktmp('pass\n')
176
176
177 def run_tmpfile(self):
177 def run_tmpfile(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 %s' % self.fname)
181 _ip.magic('run %s' % self.fname)
182
182
183 def run_tmpfile_p(self):
183 def run_tmpfile_p(self):
184 _ip = get_ipython()
184 _ip = get_ipython()
185 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
185 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
186 # See below and ticket https://bugs.launchpad.net/bugs/366353
186 # See below and ticket https://bugs.launchpad.net/bugs/366353
187 _ip.magic('run -p %s' % self.fname)
187 _ip.magic('run -p %s' % self.fname)
188
188
189 def test_builtins_id(self):
189 def test_builtins_id(self):
190 """Check that %run doesn't damage __builtins__ """
190 """Check that %run doesn't damage __builtins__ """
191 _ip = get_ipython()
191 _ip = get_ipython()
192 # Test that the id of __builtins__ is not modified by %run
192 # Test that the id of __builtins__ is not modified by %run
193 bid1 = id(_ip.user_ns['__builtins__'])
193 bid1 = id(_ip.user_ns['__builtins__'])
194 self.run_tmpfile()
194 self.run_tmpfile()
195 bid2 = id(_ip.user_ns['__builtins__'])
195 bid2 = id(_ip.user_ns['__builtins__'])
196 nt.assert_equal(bid1, bid2)
196 nt.assert_equal(bid1, bid2)
197
197
198 def test_builtins_type(self):
198 def test_builtins_type(self):
199 """Check that the type of __builtins__ doesn't change with %run.
199 """Check that the type of __builtins__ doesn't change with %run.
200
200
201 However, the above could pass if __builtins__ was already modified to
201 However, the above could pass if __builtins__ was already modified to
202 be a dict (it should be a module) by a previous use of %run. So we
202 be a dict (it should be a module) by a previous use of %run. So we
203 also check explicitly that it really is a module:
203 also check explicitly that it really is a module:
204 """
204 """
205 _ip = get_ipython()
205 _ip = get_ipython()
206 self.run_tmpfile()
206 self.run_tmpfile()
207 nt.assert_equal(type(_ip.user_ns['__builtins__']),type(sys))
207 nt.assert_equal(type(_ip.user_ns['__builtins__']),type(sys))
208
209 def test_prompts(self):
210 """Test that prompts correctly generate after %run"""
211 self.run_tmpfile()
212 _ip = get_ipython()
213 p2 = _ip.prompt_manager.render('in2').strip()
214 nt.assert_equal(p2[:3], '...')
215
208
216 def test_run_profile( self ):
209 def test_run_profile( self ):
217 """Test that the option -p, which invokes the profiler, do not
210 """Test that the option -p, which invokes the profiler, do not
218 crash by invoking execfile"""
211 crash by invoking execfile"""
219 _ip = get_ipython()
212 _ip = get_ipython()
220 self.run_tmpfile_p()
213 self.run_tmpfile_p()
221
214
222
215
223 class TestMagicRunSimple(tt.TempFileMixin):
216 class TestMagicRunSimple(tt.TempFileMixin):
224
217
225 def test_simpledef(self):
218 def test_simpledef(self):
226 """Test that simple class definitions work."""
219 """Test that simple class definitions work."""
227 src = ("class foo: pass\n"
220 src = ("class foo: pass\n"
228 "def f(): return foo()")
221 "def f(): return foo()")
229 self.mktmp(src)
222 self.mktmp(src)
230 _ip.magic('run %s' % self.fname)
223 _ip.magic('run %s' % self.fname)
231 _ip.run_cell('t = isinstance(f(), foo)')
224 _ip.run_cell('t = isinstance(f(), foo)')
232 nt.assert_true(_ip.user_ns['t'])
225 nt.assert_true(_ip.user_ns['t'])
233
226
234 def test_obj_del(self):
227 def test_obj_del(self):
235 """Test that object's __del__ methods are called on exit."""
228 """Test that object's __del__ methods are called on exit."""
236 if sys.platform == 'win32':
229 if sys.platform == 'win32':
237 try:
230 try:
238 import win32api
231 import win32api
239 except ImportError:
232 except ImportError:
240 raise SkipTest("Test requires pywin32")
233 raise SkipTest("Test requires pywin32")
241 src = ("class A(object):\n"
234 src = ("class A(object):\n"
242 " def __del__(self):\n"
235 " def __del__(self):\n"
243 " print 'object A deleted'\n"
236 " print 'object A deleted'\n"
244 "a = A()\n")
237 "a = A()\n")
245 self.mktmp(py3compat.doctest_refactor_print(src))
238 self.mktmp(py3compat.doctest_refactor_print(src))
246 if dec.module_not_available('sqlite3'):
239 if dec.module_not_available('sqlite3'):
247 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
240 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
248 else:
241 else:
249 err = None
242 err = None
250 tt.ipexec_validate(self.fname, 'object A deleted', err)
243 tt.ipexec_validate(self.fname, 'object A deleted', err)
251
244
252 def test_aggressive_namespace_cleanup(self):
245 def test_aggressive_namespace_cleanup(self):
253 """Test that namespace cleanup is not too aggressive GH-238
246 """Test that namespace cleanup is not too aggressive GH-238
254
247
255 Returning from another run magic deletes the namespace"""
248 Returning from another run magic deletes the namespace"""
256 # see ticket https://github.com/ipython/ipython/issues/238
249 # see ticket https://github.com/ipython/ipython/issues/238
257
250
258 with tt.TempFileMixin() as empty:
251 with tt.TempFileMixin() as empty:
259 empty.mktmp('')
252 empty.mktmp('')
260 # On Windows, the filename will have \users in it, so we need to use the
253 # On Windows, the filename will have \users in it, so we need to use the
261 # repr so that the \u becomes \\u.
254 # repr so that the \u becomes \\u.
262 src = ("ip = get_ipython()\n"
255 src = ("ip = get_ipython()\n"
263 "for i in range(5):\n"
256 "for i in range(5):\n"
264 " try:\n"
257 " try:\n"
265 " ip.magic(%r)\n"
258 " ip.magic(%r)\n"
266 " except NameError as e:\n"
259 " except NameError as e:\n"
267 " print(i)\n"
260 " print(i)\n"
268 " break\n" % ('run ' + empty.fname))
261 " break\n" % ('run ' + empty.fname))
269 self.mktmp(src)
262 self.mktmp(src)
270 _ip.magic('run %s' % self.fname)
263 _ip.magic('run %s' % self.fname)
271 _ip.run_cell('ip == get_ipython()')
264 _ip.run_cell('ip == get_ipython()')
272 nt.assert_equal(_ip.user_ns['i'], 4)
265 nt.assert_equal(_ip.user_ns['i'], 4)
273
266
274 def test_run_second(self):
267 def test_run_second(self):
275 """Test that running a second file doesn't clobber the first, gh-3547
268 """Test that running a second file doesn't clobber the first, gh-3547
276 """
269 """
277 self.mktmp("avar = 1\n"
270 self.mktmp("avar = 1\n"
278 "def afunc():\n"
271 "def afunc():\n"
279 " return avar\n")
272 " return avar\n")
280
273
281 with tt.TempFileMixin() as empty:
274 with tt.TempFileMixin() as empty:
282 empty.mktmp("")
275 empty.mktmp("")
283
276
284 _ip.magic('run %s' % self.fname)
277 _ip.magic('run %s' % self.fname)
285 _ip.magic('run %s' % empty.fname)
278 _ip.magic('run %s' % empty.fname)
286 nt.assert_equal(_ip.user_ns['afunc'](), 1)
279 nt.assert_equal(_ip.user_ns['afunc'](), 1)
287
280
288 @dec.skip_win32
281 @dec.skip_win32
289 def test_tclass(self):
282 def test_tclass(self):
290 mydir = os.path.dirname(__file__)
283 mydir = os.path.dirname(__file__)
291 tc = os.path.join(mydir, 'tclass')
284 tc = os.path.join(mydir, 'tclass')
292 src = ("%%run '%s' C-first\n"
285 src = ("%%run '%s' C-first\n"
293 "%%run '%s' C-second\n"
286 "%%run '%s' C-second\n"
294 "%%run '%s' C-third\n") % (tc, tc, tc)
287 "%%run '%s' C-third\n") % (tc, tc, tc)
295 self.mktmp(src, '.ipy')
288 self.mktmp(src, '.ipy')
296 out = """\
289 out = """\
297 ARGV 1-: ['C-first']
290 ARGV 1-: ['C-first']
298 ARGV 1-: ['C-second']
291 ARGV 1-: ['C-second']
299 tclass.py: deleting object: C-first
292 tclass.py: deleting object: C-first
300 ARGV 1-: ['C-third']
293 ARGV 1-: ['C-third']
301 tclass.py: deleting object: C-second
294 tclass.py: deleting object: C-second
302 tclass.py: deleting object: C-third
295 tclass.py: deleting object: C-third
303 """
296 """
304 if dec.module_not_available('sqlite3'):
297 if dec.module_not_available('sqlite3'):
305 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
298 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
306 else:
299 else:
307 err = None
300 err = None
308 tt.ipexec_validate(self.fname, out, err)
301 tt.ipexec_validate(self.fname, out, err)
309
302
310 def test_run_i_after_reset(self):
303 def test_run_i_after_reset(self):
311 """Check that %run -i still works after %reset (gh-693)"""
304 """Check that %run -i still works after %reset (gh-693)"""
312 src = "yy = zz\n"
305 src = "yy = zz\n"
313 self.mktmp(src)
306 self.mktmp(src)
314 _ip.run_cell("zz = 23")
307 _ip.run_cell("zz = 23")
315 _ip.magic('run -i %s' % self.fname)
308 _ip.magic('run -i %s' % self.fname)
316 nt.assert_equal(_ip.user_ns['yy'], 23)
309 nt.assert_equal(_ip.user_ns['yy'], 23)
317 _ip.magic('reset -f')
310 _ip.magic('reset -f')
318 _ip.run_cell("zz = 23")
311 _ip.run_cell("zz = 23")
319 _ip.magic('run -i %s' % self.fname)
312 _ip.magic('run -i %s' % self.fname)
320 nt.assert_equal(_ip.user_ns['yy'], 23)
313 nt.assert_equal(_ip.user_ns['yy'], 23)
321
314
322 def test_unicode(self):
315 def test_unicode(self):
323 """Check that files in odd encodings are accepted."""
316 """Check that files in odd encodings are accepted."""
324 mydir = os.path.dirname(__file__)
317 mydir = os.path.dirname(__file__)
325 na = os.path.join(mydir, 'nonascii.py')
318 na = os.path.join(mydir, 'nonascii.py')
326 _ip.magic('run "%s"' % na)
319 _ip.magic('run "%s"' % na)
327 nt.assert_equal(_ip.user_ns['u'], u'ΠŽΡ‚β„–Π€')
320 nt.assert_equal(_ip.user_ns['u'], u'ΠŽΡ‚β„–Π€')
328
321
329 def test_run_py_file_attribute(self):
322 def test_run_py_file_attribute(self):
330 """Test handling of `__file__` attribute in `%run <file>.py`."""
323 """Test handling of `__file__` attribute in `%run <file>.py`."""
331 src = "t = __file__\n"
324 src = "t = __file__\n"
332 self.mktmp(src)
325 self.mktmp(src)
333 _missing = object()
326 _missing = object()
334 file1 = _ip.user_ns.get('__file__', _missing)
327 file1 = _ip.user_ns.get('__file__', _missing)
335 _ip.magic('run %s' % self.fname)
328 _ip.magic('run %s' % self.fname)
336 file2 = _ip.user_ns.get('__file__', _missing)
329 file2 = _ip.user_ns.get('__file__', _missing)
337
330
338 # Check that __file__ was equal to the filename in the script's
331 # Check that __file__ was equal to the filename in the script's
339 # namespace.
332 # namespace.
340 nt.assert_equal(_ip.user_ns['t'], self.fname)
333 nt.assert_equal(_ip.user_ns['t'], self.fname)
341
334
342 # Check that __file__ was not leaked back into user_ns.
335 # Check that __file__ was not leaked back into user_ns.
343 nt.assert_equal(file1, file2)
336 nt.assert_equal(file1, file2)
344
337
345 def test_run_ipy_file_attribute(self):
338 def test_run_ipy_file_attribute(self):
346 """Test handling of `__file__` attribute in `%run <file.ipy>`."""
339 """Test handling of `__file__` attribute in `%run <file.ipy>`."""
347 src = "t = __file__\n"
340 src = "t = __file__\n"
348 self.mktmp(src, ext='.ipy')
341 self.mktmp(src, ext='.ipy')
349 _missing = object()
342 _missing = object()
350 file1 = _ip.user_ns.get('__file__', _missing)
343 file1 = _ip.user_ns.get('__file__', _missing)
351 _ip.magic('run %s' % self.fname)
344 _ip.magic('run %s' % self.fname)
352 file2 = _ip.user_ns.get('__file__', _missing)
345 file2 = _ip.user_ns.get('__file__', _missing)
353
346
354 # Check that __file__ was equal to the filename in the script's
347 # Check that __file__ was equal to the filename in the script's
355 # namespace.
348 # namespace.
356 nt.assert_equal(_ip.user_ns['t'], self.fname)
349 nt.assert_equal(_ip.user_ns['t'], self.fname)
357
350
358 # Check that __file__ was not leaked back into user_ns.
351 # Check that __file__ was not leaked back into user_ns.
359 nt.assert_equal(file1, file2)
352 nt.assert_equal(file1, file2)
360
353
361 def test_run_formatting(self):
354 def test_run_formatting(self):
362 """ Test that %run -t -N<N> does not raise a TypeError for N > 1."""
355 """ Test that %run -t -N<N> does not raise a TypeError for N > 1."""
363 src = "pass"
356 src = "pass"
364 self.mktmp(src)
357 self.mktmp(src)
365 _ip.magic('run -t -N 1 %s' % self.fname)
358 _ip.magic('run -t -N 1 %s' % self.fname)
366 _ip.magic('run -t -N 10 %s' % self.fname)
359 _ip.magic('run -t -N 10 %s' % self.fname)
367
360
368 def test_ignore_sys_exit(self):
361 def test_ignore_sys_exit(self):
369 """Test the -e option to ignore sys.exit()"""
362 """Test the -e option to ignore sys.exit()"""
370 src = "import sys; sys.exit(1)"
363 src = "import sys; sys.exit(1)"
371 self.mktmp(src)
364 self.mktmp(src)
372 with tt.AssertPrints('SystemExit'):
365 with tt.AssertPrints('SystemExit'):
373 _ip.magic('run %s' % self.fname)
366 _ip.magic('run %s' % self.fname)
374
367
375 with tt.AssertNotPrints('SystemExit'):
368 with tt.AssertNotPrints('SystemExit'):
376 _ip.magic('run -e %s' % self.fname)
369 _ip.magic('run -e %s' % self.fname)
377
370
378 @dec.skip_without('nbformat') # Requires jsonschema
371 @dec.skip_without('nbformat') # Requires jsonschema
379 def test_run_nb(self):
372 def test_run_nb(self):
380 """Test %run notebook.ipynb"""
373 """Test %run notebook.ipynb"""
381 from nbformat import v4, writes
374 from nbformat import v4, writes
382 nb = v4.new_notebook(
375 nb = v4.new_notebook(
383 cells=[
376 cells=[
384 v4.new_markdown_cell("The Ultimate Question of Everything"),
377 v4.new_markdown_cell("The Ultimate Question of Everything"),
385 v4.new_code_cell("answer=42")
378 v4.new_code_cell("answer=42")
386 ]
379 ]
387 )
380 )
388 src = writes(nb, version=4)
381 src = writes(nb, version=4)
389 self.mktmp(src, ext='.ipynb')
382 self.mktmp(src, ext='.ipynb')
390
383
391 _ip.magic("run %s" % self.fname)
384 _ip.magic("run %s" % self.fname)
392
385
393 nt.assert_equal(_ip.user_ns['answer'], 42)
386 nt.assert_equal(_ip.user_ns['answer'], 42)
394
387
395
388
396
389
397 class TestMagicRunWithPackage(unittest.TestCase):
390 class TestMagicRunWithPackage(unittest.TestCase):
398
391
399 def writefile(self, name, content):
392 def writefile(self, name, content):
400 path = os.path.join(self.tempdir.name, name)
393 path = os.path.join(self.tempdir.name, name)
401 d = os.path.dirname(path)
394 d = os.path.dirname(path)
402 if not os.path.isdir(d):
395 if not os.path.isdir(d):
403 os.makedirs(d)
396 os.makedirs(d)
404 with open(path, 'w') as f:
397 with open(path, 'w') as f:
405 f.write(textwrap.dedent(content))
398 f.write(textwrap.dedent(content))
406
399
407 def setUp(self):
400 def setUp(self):
408 self.package = package = 'tmp{0}'.format(repr(random.random())[2:])
401 self.package = package = 'tmp{0}'.format(repr(random.random())[2:])
409 """Temporary valid python package name."""
402 """Temporary valid python package name."""
410
403
411 self.value = int(random.random() * 10000)
404 self.value = int(random.random() * 10000)
412
405
413 self.tempdir = TemporaryDirectory()
406 self.tempdir = TemporaryDirectory()
414 self.__orig_cwd = py3compat.getcwd()
407 self.__orig_cwd = py3compat.getcwd()
415 sys.path.insert(0, self.tempdir.name)
408 sys.path.insert(0, self.tempdir.name)
416
409
417 self.writefile(os.path.join(package, '__init__.py'), '')
410 self.writefile(os.path.join(package, '__init__.py'), '')
418 self.writefile(os.path.join(package, 'sub.py'), """
411 self.writefile(os.path.join(package, 'sub.py'), """
419 x = {0!r}
412 x = {0!r}
420 """.format(self.value))
413 """.format(self.value))
421 self.writefile(os.path.join(package, 'relative.py'), """
414 self.writefile(os.path.join(package, 'relative.py'), """
422 from .sub import x
415 from .sub import x
423 """)
416 """)
424 self.writefile(os.path.join(package, 'absolute.py'), """
417 self.writefile(os.path.join(package, 'absolute.py'), """
425 from {0}.sub import x
418 from {0}.sub import x
426 """.format(package))
419 """.format(package))
427
420
428 def tearDown(self):
421 def tearDown(self):
429 os.chdir(self.__orig_cwd)
422 os.chdir(self.__orig_cwd)
430 sys.path[:] = [p for p in sys.path if p != self.tempdir.name]
423 sys.path[:] = [p for p in sys.path if p != self.tempdir.name]
431 self.tempdir.cleanup()
424 self.tempdir.cleanup()
432
425
433 def check_run_submodule(self, submodule, opts=''):
426 def check_run_submodule(self, submodule, opts=''):
434 _ip.user_ns.pop('x', None)
427 _ip.user_ns.pop('x', None)
435 _ip.magic('run {2} -m {0}.{1}'.format(self.package, submodule, opts))
428 _ip.magic('run {2} -m {0}.{1}'.format(self.package, submodule, opts))
436 self.assertEqual(_ip.user_ns['x'], self.value,
429 self.assertEqual(_ip.user_ns['x'], self.value,
437 'Variable `x` is not loaded from module `{0}`.'
430 'Variable `x` is not loaded from module `{0}`.'
438 .format(submodule))
431 .format(submodule))
439
432
440 def test_run_submodule_with_absolute_import(self):
433 def test_run_submodule_with_absolute_import(self):
441 self.check_run_submodule('absolute')
434 self.check_run_submodule('absolute')
442
435
443 def test_run_submodule_with_relative_import(self):
436 def test_run_submodule_with_relative_import(self):
444 """Run submodule that has a relative import statement (#2727)."""
437 """Run submodule that has a relative import statement (#2727)."""
445 self.check_run_submodule('relative')
438 self.check_run_submodule('relative')
446
439
447 def test_prun_submodule_with_absolute_import(self):
440 def test_prun_submodule_with_absolute_import(self):
448 self.check_run_submodule('absolute', '-p')
441 self.check_run_submodule('absolute', '-p')
449
442
450 def test_prun_submodule_with_relative_import(self):
443 def test_prun_submodule_with_relative_import(self):
451 self.check_run_submodule('relative', '-p')
444 self.check_run_submodule('relative', '-p')
452
445
453 def with_fake_debugger(func):
446 def with_fake_debugger(func):
454 @functools.wraps(func)
447 @functools.wraps(func)
455 def wrapper(*args, **kwds):
448 def wrapper(*args, **kwds):
456 with patch.object(debugger.Pdb, 'run', staticmethod(eval)):
449 with patch.object(debugger.Pdb, 'run', staticmethod(eval)):
457 return func(*args, **kwds)
450 return func(*args, **kwds)
458 return wrapper
451 return wrapper
459
452
460 @with_fake_debugger
453 @with_fake_debugger
461 def test_debug_run_submodule_with_absolute_import(self):
454 def test_debug_run_submodule_with_absolute_import(self):
462 self.check_run_submodule('absolute', '-d')
455 self.check_run_submodule('absolute', '-d')
463
456
464 @with_fake_debugger
457 @with_fake_debugger
465 def test_debug_run_submodule_with_relative_import(self):
458 def test_debug_run_submodule_with_relative_import(self):
466 self.check_run_submodule('relative', '-d')
459 self.check_run_submodule('relative', '-d')
467
460
468 def test_run__name__():
461 def test_run__name__():
469 with TemporaryDirectory() as td:
462 with TemporaryDirectory() as td:
470 path = pjoin(td, 'foo.py')
463 path = pjoin(td, 'foo.py')
471 with open(path, 'w') as f:
464 with open(path, 'w') as f:
472 f.write("q = __name__")
465 f.write("q = __name__")
473
466
474 _ip.user_ns.pop('q', None)
467 _ip.user_ns.pop('q', None)
475 _ip.magic('run {}'.format(path))
468 _ip.magic('run {}'.format(path))
476 nt.assert_equal(_ip.user_ns.pop('q'), '__main__')
469 nt.assert_equal(_ip.user_ns.pop('q'), '__main__')
477
470
478 _ip.magic('run -n {}'.format(path))
471 _ip.magic('run -n {}'.format(path))
479 nt.assert_equal(_ip.user_ns.pop('q'), 'foo')
472 nt.assert_equal(_ip.user_ns.pop('q'), 'foo')
480
473
481 def test_run_tb():
474 def test_run_tb():
482 """Test traceback offset in %run"""
475 """Test traceback offset in %run"""
483 with TemporaryDirectory() as td:
476 with TemporaryDirectory() as td:
484 path = pjoin(td, 'foo.py')
477 path = pjoin(td, 'foo.py')
485 with open(path, 'w') as f:
478 with open(path, 'w') as f:
486 f.write('\n'.join([
479 f.write('\n'.join([
487 "def foo():",
480 "def foo():",
488 " return bar()",
481 " return bar()",
489 "def bar():",
482 "def bar():",
490 " raise RuntimeError('hello!')",
483 " raise RuntimeError('hello!')",
491 "foo()",
484 "foo()",
492 ]))
485 ]))
493 with capture_output() as io:
486 with capture_output() as io:
494 _ip.magic('run {}'.format(path))
487 _ip.magic('run {}'.format(path))
495 out = io.stdout
488 out = io.stdout
496 nt.assert_not_in("execfile", out)
489 nt.assert_not_in("execfile", out)
497 nt.assert_in("RuntimeError", out)
490 nt.assert_in("RuntimeError", out)
498 nt.assert_equal(out.count("---->"), 3)
491 nt.assert_equal(out.count("---->"), 3)
499
492
500 @dec.knownfailureif(sys.platform == 'win32', "writes to io.stdout aren't captured on Windows")
493 @dec.knownfailureif(sys.platform == 'win32', "writes to io.stdout aren't captured on Windows")
501 def test_script_tb():
494 def test_script_tb():
502 """Test traceback offset in `ipython script.py`"""
495 """Test traceback offset in `ipython script.py`"""
503 with TemporaryDirectory() as td:
496 with TemporaryDirectory() as td:
504 path = pjoin(td, 'foo.py')
497 path = pjoin(td, 'foo.py')
505 with open(path, 'w') as f:
498 with open(path, 'w') as f:
506 f.write('\n'.join([
499 f.write('\n'.join([
507 "def foo():",
500 "def foo():",
508 " return bar()",
501 " return bar()",
509 "def bar():",
502 "def bar():",
510 " raise RuntimeError('hello!')",
503 " raise RuntimeError('hello!')",
511 "foo()",
504 "foo()",
512 ]))
505 ]))
513 out, err = tt.ipexec(path)
506 out, err = tt.ipexec(path)
514 nt.assert_not_in("execfile", out)
507 nt.assert_not_in("execfile", out)
515 nt.assert_in("RuntimeError", out)
508 nt.assert_in("RuntimeError", out)
516 nt.assert_equal(out.count("---->"), 3)
509 nt.assert_equal(out.count("---->"), 3)
517
510
@@ -1,1186 +1,1185 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 Sphinx directive to support embedded IPython code.
3 Sphinx directive to support embedded IPython code.
4
4
5 This directive allows pasting of entire interactive IPython sessions, prompts
5 This directive allows pasting of entire interactive IPython sessions, prompts
6 and all, and their code will actually get re-executed at doc build time, with
6 and all, and their code will actually get re-executed at doc build time, with
7 all prompts renumbered sequentially. It also allows you to input code as a pure
7 all prompts renumbered sequentially. It also allows you to input code as a pure
8 python input by giving the argument python to the directive. The output looks
8 python input by giving the argument python to the directive. The output looks
9 like an interactive ipython section.
9 like an interactive ipython section.
10
10
11 To enable this directive, simply list it in your Sphinx ``conf.py`` file
11 To enable this directive, simply list it in your Sphinx ``conf.py`` file
12 (making sure the directory where you placed it is visible to sphinx, as is
12 (making sure the directory where you placed it is visible to sphinx, as is
13 needed for all Sphinx directives). For example, to enable syntax highlighting
13 needed for all Sphinx directives). For example, to enable syntax highlighting
14 and the IPython directive::
14 and the IPython directive::
15
15
16 extensions = ['IPython.sphinxext.ipython_console_highlighting',
16 extensions = ['IPython.sphinxext.ipython_console_highlighting',
17 'IPython.sphinxext.ipython_directive']
17 'IPython.sphinxext.ipython_directive']
18
18
19 The IPython directive outputs code-blocks with the language 'ipython'. So
19 The IPython directive outputs code-blocks with the language 'ipython'. So
20 if you do not have the syntax highlighting extension enabled as well, then
20 if you do not have the syntax highlighting extension enabled as well, then
21 all rendered code-blocks will be uncolored. By default this directive assumes
21 all rendered code-blocks will be uncolored. By default this directive assumes
22 that your prompts are unchanged IPython ones, but this can be customized.
22 that your prompts are unchanged IPython ones, but this can be customized.
23 The configurable options that can be placed in conf.py are:
23 The configurable options that can be placed in conf.py are:
24
24
25 ipython_savefig_dir:
25 ipython_savefig_dir:
26 The directory in which to save the figures. This is relative to the
26 The directory in which to save the figures. This is relative to the
27 Sphinx source directory. The default is `html_static_path`.
27 Sphinx source directory. The default is `html_static_path`.
28 ipython_rgxin:
28 ipython_rgxin:
29 The compiled regular expression to denote the start of IPython input
29 The compiled regular expression to denote the start of IPython input
30 lines. The default is re.compile('In \[(\d+)\]:\s?(.*)\s*'). You
30 lines. The default is re.compile('In \[(\d+)\]:\s?(.*)\s*'). You
31 shouldn't need to change this.
31 shouldn't need to change this.
32 ipython_rgxout:
32 ipython_rgxout:
33 The compiled regular expression to denote the start of IPython output
33 The compiled regular expression to denote the start of IPython output
34 lines. The default is re.compile('Out\[(\d+)\]:\s?(.*)\s*'). You
34 lines. The default is re.compile('Out\[(\d+)\]:\s?(.*)\s*'). You
35 shouldn't need to change this.
35 shouldn't need to change this.
36 ipython_promptin:
36 ipython_promptin:
37 The string to represent the IPython input prompt in the generated ReST.
37 The string to represent the IPython input prompt in the generated ReST.
38 The default is 'In [%d]:'. This expects that the line numbers are used
38 The default is 'In [%d]:'. This expects that the line numbers are used
39 in the prompt.
39 in the prompt.
40 ipython_promptout:
40 ipython_promptout:
41 The string to represent the IPython prompt in the generated ReST. The
41 The string to represent the IPython prompt in the generated ReST. The
42 default is 'Out [%d]:'. This expects that the line numbers are used
42 default is 'Out [%d]:'. This expects that the line numbers are used
43 in the prompt.
43 in the prompt.
44 ipython_mplbackend:
44 ipython_mplbackend:
45 The string which specifies if the embedded Sphinx shell should import
45 The string which specifies if the embedded Sphinx shell should import
46 Matplotlib and set the backend. The value specifies a backend that is
46 Matplotlib and set the backend. The value specifies a backend that is
47 passed to `matplotlib.use()` before any lines in `ipython_execlines` are
47 passed to `matplotlib.use()` before any lines in `ipython_execlines` are
48 executed. If not specified in conf.py, then the default value of 'agg' is
48 executed. If not specified in conf.py, then the default value of 'agg' is
49 used. To use the IPython directive without matplotlib as a dependency, set
49 used. To use the IPython directive without matplotlib as a dependency, set
50 the value to `None`. It may end up that matplotlib is still imported
50 the value to `None`. It may end up that matplotlib is still imported
51 if the user specifies so in `ipython_execlines` or makes use of the
51 if the user specifies so in `ipython_execlines` or makes use of the
52 @savefig pseudo decorator.
52 @savefig pseudo decorator.
53 ipython_execlines:
53 ipython_execlines:
54 A list of strings to be exec'd in the embedded Sphinx shell. Typical
54 A list of strings to be exec'd in the embedded Sphinx shell. Typical
55 usage is to make certain packages always available. Set this to an empty
55 usage is to make certain packages always available. Set this to an empty
56 list if you wish to have no imports always available. If specified in
56 list if you wish to have no imports always available. If specified in
57 conf.py as `None`, then it has the effect of making no imports available.
57 conf.py as `None`, then it has the effect of making no imports available.
58 If omitted from conf.py altogether, then the default value of
58 If omitted from conf.py altogether, then the default value of
59 ['import numpy as np', 'import matplotlib.pyplot as plt'] is used.
59 ['import numpy as np', 'import matplotlib.pyplot as plt'] is used.
60 ipython_holdcount
60 ipython_holdcount
61 When the @suppress pseudo-decorator is used, the execution count can be
61 When the @suppress pseudo-decorator is used, the execution count can be
62 incremented or not. The default behavior is to hold the execution count,
62 incremented or not. The default behavior is to hold the execution count,
63 corresponding to a value of `True`. Set this to `False` to increment
63 corresponding to a value of `True`. Set this to `False` to increment
64 the execution count after each suppressed command.
64 the execution count after each suppressed command.
65
65
66 As an example, to use the IPython directive when `matplotlib` is not available,
66 As an example, to use the IPython directive when `matplotlib` is not available,
67 one sets the backend to `None`::
67 one sets the backend to `None`::
68
68
69 ipython_mplbackend = None
69 ipython_mplbackend = None
70
70
71 An example usage of the directive is:
71 An example usage of the directive is:
72
72
73 .. code-block:: rst
73 .. code-block:: rst
74
74
75 .. ipython::
75 .. ipython::
76
76
77 In [1]: x = 1
77 In [1]: x = 1
78
78
79 In [2]: y = x**2
79 In [2]: y = x**2
80
80
81 In [3]: print(y)
81 In [3]: print(y)
82
82
83 See http://matplotlib.org/sampledoc/ipython_directive.html for additional
83 See http://matplotlib.org/sampledoc/ipython_directive.html for additional
84 documentation.
84 documentation.
85
85
86 Pseudo-Decorators
86 Pseudo-Decorators
87 =================
87 =================
88
88
89 Note: Only one decorator is supported per input. If more than one decorator
89 Note: Only one decorator is supported per input. If more than one decorator
90 is specified, then only the last one is used.
90 is specified, then only the last one is used.
91
91
92 In addition to the Pseudo-Decorators/options described at the above link,
92 In addition to the Pseudo-Decorators/options described at the above link,
93 several enhancements have been made. The directive will emit a message to the
93 several enhancements have been made. The directive will emit a message to the
94 console at build-time if code-execution resulted in an exception or warning.
94 console at build-time if code-execution resulted in an exception or warning.
95 You can suppress these on a per-block basis by specifying the :okexcept:
95 You can suppress these on a per-block basis by specifying the :okexcept:
96 or :okwarning: options:
96 or :okwarning: options:
97
97
98 .. code-block:: rst
98 .. code-block:: rst
99
99
100 .. ipython::
100 .. ipython::
101 :okexcept:
101 :okexcept:
102 :okwarning:
102 :okwarning:
103
103
104 In [1]: 1/0
104 In [1]: 1/0
105 In [2]: # raise warning.
105 In [2]: # raise warning.
106
106
107 ToDo
107 ToDo
108 ----
108 ----
109
109
110 - Turn the ad-hoc test() function into a real test suite.
110 - Turn the ad-hoc test() function into a real test suite.
111 - Break up ipython-specific functionality from matplotlib stuff into better
111 - Break up ipython-specific functionality from matplotlib stuff into better
112 separated code.
112 separated code.
113
113
114 Authors
114 Authors
115 -------
115 -------
116
116
117 - John D Hunter: orignal author.
117 - John D Hunter: orignal author.
118 - Fernando Perez: refactoring, documentation, cleanups, port to 0.11.
118 - Fernando Perez: refactoring, documentation, cleanups, port to 0.11.
119 - VΓ‘clavΕ milauer <eudoxos-AT-arcig.cz>: Prompt generalizations.
119 - VΓ‘clavΕ milauer <eudoxos-AT-arcig.cz>: Prompt generalizations.
120 - Skipper Seabold, refactoring, cleanups, pure python addition
120 - Skipper Seabold, refactoring, cleanups, pure python addition
121 """
121 """
122 from __future__ import print_function
122 from __future__ import print_function
123
123
124 #-----------------------------------------------------------------------------
124 #-----------------------------------------------------------------------------
125 # Imports
125 # Imports
126 #-----------------------------------------------------------------------------
126 #-----------------------------------------------------------------------------
127
127
128 # Stdlib
128 # Stdlib
129 import atexit
129 import atexit
130 import os
130 import os
131 import re
131 import re
132 import sys
132 import sys
133 import tempfile
133 import tempfile
134 import ast
134 import ast
135 import warnings
135 import warnings
136 import shutil
136 import shutil
137
137
138
138
139 # Third-party
139 # Third-party
140 from docutils.parsers.rst import directives
140 from docutils.parsers.rst import directives
141 from sphinx.util.compat import Directive
141 from sphinx.util.compat import Directive
142
142
143 # Our own
143 # Our own
144 from traitlets.config import Config
144 from traitlets.config import Config
145 from IPython import InteractiveShell
145 from IPython import InteractiveShell
146 from IPython.core.profiledir import ProfileDir
146 from IPython.core.profiledir import ProfileDir
147 from IPython.utils import io
147 from IPython.utils import io
148 from IPython.utils.py3compat import PY3
148 from IPython.utils.py3compat import PY3
149
149
150 if PY3:
150 if PY3:
151 from io import StringIO
151 from io import StringIO
152 else:
152 else:
153 from StringIO import StringIO
153 from StringIO import StringIO
154
154
155 #-----------------------------------------------------------------------------
155 #-----------------------------------------------------------------------------
156 # Globals
156 # Globals
157 #-----------------------------------------------------------------------------
157 #-----------------------------------------------------------------------------
158 # for tokenizing blocks
158 # for tokenizing blocks
159 COMMENT, INPUT, OUTPUT = range(3)
159 COMMENT, INPUT, OUTPUT = range(3)
160
160
161 #-----------------------------------------------------------------------------
161 #-----------------------------------------------------------------------------
162 # Functions and class declarations
162 # Functions and class declarations
163 #-----------------------------------------------------------------------------
163 #-----------------------------------------------------------------------------
164
164
165 def block_parser(part, rgxin, rgxout, fmtin, fmtout):
165 def block_parser(part, rgxin, rgxout, fmtin, fmtout):
166 """
166 """
167 part is a string of ipython text, comprised of at most one
167 part is a string of ipython text, comprised of at most one
168 input, one output, comments, and blank lines. The block parser
168 input, one output, comments, and blank lines. The block parser
169 parses the text into a list of::
169 parses the text into a list of::
170
170
171 blocks = [ (TOKEN0, data0), (TOKEN1, data1), ...]
171 blocks = [ (TOKEN0, data0), (TOKEN1, data1), ...]
172
172
173 where TOKEN is one of [COMMENT | INPUT | OUTPUT ] and
173 where TOKEN is one of [COMMENT | INPUT | OUTPUT ] and
174 data is, depending on the type of token::
174 data is, depending on the type of token::
175
175
176 COMMENT : the comment string
176 COMMENT : the comment string
177
177
178 INPUT: the (DECORATOR, INPUT_LINE, REST) where
178 INPUT: the (DECORATOR, INPUT_LINE, REST) where
179 DECORATOR: the input decorator (or None)
179 DECORATOR: the input decorator (or None)
180 INPUT_LINE: the input as string (possibly multi-line)
180 INPUT_LINE: the input as string (possibly multi-line)
181 REST : any stdout generated by the input line (not OUTPUT)
181 REST : any stdout generated by the input line (not OUTPUT)
182
182
183 OUTPUT: the output string, possibly multi-line
183 OUTPUT: the output string, possibly multi-line
184
184
185 """
185 """
186 block = []
186 block = []
187 lines = part.split('\n')
187 lines = part.split('\n')
188 N = len(lines)
188 N = len(lines)
189 i = 0
189 i = 0
190 decorator = None
190 decorator = None
191 while 1:
191 while 1:
192
192
193 if i==N:
193 if i==N:
194 # nothing left to parse -- the last line
194 # nothing left to parse -- the last line
195 break
195 break
196
196
197 line = lines[i]
197 line = lines[i]
198 i += 1
198 i += 1
199 line_stripped = line.strip()
199 line_stripped = line.strip()
200 if line_stripped.startswith('#'):
200 if line_stripped.startswith('#'):
201 block.append((COMMENT, line))
201 block.append((COMMENT, line))
202 continue
202 continue
203
203
204 if line_stripped.startswith('@'):
204 if line_stripped.startswith('@'):
205 # Here is where we assume there is, at most, one decorator.
205 # Here is where we assume there is, at most, one decorator.
206 # Might need to rethink this.
206 # Might need to rethink this.
207 decorator = line_stripped
207 decorator = line_stripped
208 continue
208 continue
209
209
210 # does this look like an input line?
210 # does this look like an input line?
211 matchin = rgxin.match(line)
211 matchin = rgxin.match(line)
212 if matchin:
212 if matchin:
213 lineno, inputline = int(matchin.group(1)), matchin.group(2)
213 lineno, inputline = int(matchin.group(1)), matchin.group(2)
214
214
215 # the ....: continuation string
215 # the ....: continuation string
216 continuation = ' %s:'%''.join(['.']*(len(str(lineno))+2))
216 continuation = ' %s:'%''.join(['.']*(len(str(lineno))+2))
217 Nc = len(continuation)
217 Nc = len(continuation)
218 # input lines can continue on for more than one line, if
218 # input lines can continue on for more than one line, if
219 # we have a '\' line continuation char or a function call
219 # we have a '\' line continuation char or a function call
220 # echo line 'print'. The input line can only be
220 # echo line 'print'. The input line can only be
221 # terminated by the end of the block or an output line, so
221 # terminated by the end of the block or an output line, so
222 # we parse out the rest of the input line if it is
222 # we parse out the rest of the input line if it is
223 # multiline as well as any echo text
223 # multiline as well as any echo text
224
224
225 rest = []
225 rest = []
226 while i<N:
226 while i<N:
227
227
228 # look ahead; if the next line is blank, or a comment, or
228 # look ahead; if the next line is blank, or a comment, or
229 # an output line, we're done
229 # an output line, we're done
230
230
231 nextline = lines[i]
231 nextline = lines[i]
232 matchout = rgxout.match(nextline)
232 matchout = rgxout.match(nextline)
233 #print "nextline=%s, continuation=%s, starts=%s"%(nextline, continuation, nextline.startswith(continuation))
233 #print "nextline=%s, continuation=%s, starts=%s"%(nextline, continuation, nextline.startswith(continuation))
234 if matchout or nextline.startswith('#'):
234 if matchout or nextline.startswith('#'):
235 break
235 break
236 elif nextline.startswith(continuation):
236 elif nextline.startswith(continuation):
237 # The default ipython_rgx* treat the space following the colon as optional.
237 # The default ipython_rgx* treat the space following the colon as optional.
238 # However, If the space is there we must consume it or code
238 # However, If the space is there we must consume it or code
239 # employing the cython_magic extension will fail to execute.
239 # employing the cython_magic extension will fail to execute.
240 #
240 #
241 # This works with the default ipython_rgx* patterns,
241 # This works with the default ipython_rgx* patterns,
242 # If you modify them, YMMV.
242 # If you modify them, YMMV.
243 nextline = nextline[Nc:]
243 nextline = nextline[Nc:]
244 if nextline and nextline[0] == ' ':
244 if nextline and nextline[0] == ' ':
245 nextline = nextline[1:]
245 nextline = nextline[1:]
246
246
247 inputline += '\n' + nextline
247 inputline += '\n' + nextline
248 else:
248 else:
249 rest.append(nextline)
249 rest.append(nextline)
250 i+= 1
250 i+= 1
251
251
252 block.append((INPUT, (decorator, inputline, '\n'.join(rest))))
252 block.append((INPUT, (decorator, inputline, '\n'.join(rest))))
253 continue
253 continue
254
254
255 # if it looks like an output line grab all the text to the end
255 # if it looks like an output line grab all the text to the end
256 # of the block
256 # of the block
257 matchout = rgxout.match(line)
257 matchout = rgxout.match(line)
258 if matchout:
258 if matchout:
259 lineno, output = int(matchout.group(1)), matchout.group(2)
259 lineno, output = int(matchout.group(1)), matchout.group(2)
260 if i<N-1:
260 if i<N-1:
261 output = '\n'.join([output] + lines[i:])
261 output = '\n'.join([output] + lines[i:])
262
262
263 block.append((OUTPUT, output))
263 block.append((OUTPUT, output))
264 break
264 break
265
265
266 return block
266 return block
267
267
268
268
269 class EmbeddedSphinxShell(object):
269 class EmbeddedSphinxShell(object):
270 """An embedded IPython instance to run inside Sphinx"""
270 """An embedded IPython instance to run inside Sphinx"""
271
271
272 def __init__(self, exec_lines=None):
272 def __init__(self, exec_lines=None):
273
273
274 self.cout = StringIO()
274 self.cout = StringIO()
275
275
276 if exec_lines is None:
276 if exec_lines is None:
277 exec_lines = []
277 exec_lines = []
278
278
279 # Create config object for IPython
279 # Create config object for IPython
280 config = Config()
280 config = Config()
281 config.HistoryManager.hist_file = ':memory:'
281 config.HistoryManager.hist_file = ':memory:'
282 config.InteractiveShell.autocall = False
282 config.InteractiveShell.autocall = False
283 config.InteractiveShell.autoindent = False
283 config.InteractiveShell.autoindent = False
284 config.InteractiveShell.colors = 'NoColor'
284 config.InteractiveShell.colors = 'NoColor'
285
285
286 # create a profile so instance history isn't saved
286 # create a profile so instance history isn't saved
287 tmp_profile_dir = tempfile.mkdtemp(prefix='profile_')
287 tmp_profile_dir = tempfile.mkdtemp(prefix='profile_')
288 profname = 'auto_profile_sphinx_build'
288 profname = 'auto_profile_sphinx_build'
289 pdir = os.path.join(tmp_profile_dir,profname)
289 pdir = os.path.join(tmp_profile_dir,profname)
290 profile = ProfileDir.create_profile_dir(pdir)
290 profile = ProfileDir.create_profile_dir(pdir)
291
291
292 # Create and initialize global ipython, but don't start its mainloop.
292 # Create and initialize global ipython, but don't start its mainloop.
293 # This will persist across different EmbededSphinxShell instances.
293 # This will persist across different EmbededSphinxShell instances.
294 IP = InteractiveShell.instance(config=config, profile_dir=profile)
294 IP = InteractiveShell.instance(config=config, profile_dir=profile)
295 atexit.register(self.cleanup)
295 atexit.register(self.cleanup)
296
296
297 # io.stdout redirect must be done after instantiating InteractiveShell
297 # io.stdout redirect must be done after instantiating InteractiveShell
298 io.stdout = self.cout
298 io.stdout = self.cout
299 io.stderr = self.cout
299 io.stderr = self.cout
300
300
301 # For debugging, so we can see normal output, use this:
301 # For debugging, so we can see normal output, use this:
302 #from IPython.utils.io import Tee
302 #from IPython.utils.io import Tee
303 #io.stdout = Tee(self.cout, channel='stdout') # dbg
303 #io.stdout = Tee(self.cout, channel='stdout') # dbg
304 #io.stderr = Tee(self.cout, channel='stderr') # dbg
304 #io.stderr = Tee(self.cout, channel='stderr') # dbg
305
305
306 # Store a few parts of IPython we'll need.
306 # Store a few parts of IPython we'll need.
307 self.IP = IP
307 self.IP = IP
308 self.user_ns = self.IP.user_ns
308 self.user_ns = self.IP.user_ns
309 self.user_global_ns = self.IP.user_global_ns
309 self.user_global_ns = self.IP.user_global_ns
310
310
311 self.input = ''
311 self.input = ''
312 self.output = ''
312 self.output = ''
313 self.tmp_profile_dir = tmp_profile_dir
313 self.tmp_profile_dir = tmp_profile_dir
314
314
315 self.is_verbatim = False
315 self.is_verbatim = False
316 self.is_doctest = False
316 self.is_doctest = False
317 self.is_suppress = False
317 self.is_suppress = False
318
318
319 # Optionally, provide more detailed information to shell.
319 # Optionally, provide more detailed information to shell.
320 # this is assigned by the SetUp method of IPythonDirective
320 # this is assigned by the SetUp method of IPythonDirective
321 # to point at itself.
321 # to point at itself.
322 #
322 #
323 # So, you can access handy things at self.directive.state
323 # So, you can access handy things at self.directive.state
324 self.directive = None
324 self.directive = None
325
325
326 # on the first call to the savefig decorator, we'll import
326 # on the first call to the savefig decorator, we'll import
327 # pyplot as plt so we can make a call to the plt.gcf().savefig
327 # pyplot as plt so we can make a call to the plt.gcf().savefig
328 self._pyplot_imported = False
328 self._pyplot_imported = False
329
329
330 # Prepopulate the namespace.
330 # Prepopulate the namespace.
331 for line in exec_lines:
331 for line in exec_lines:
332 self.process_input_line(line, store_history=False)
332 self.process_input_line(line, store_history=False)
333
333
334 def cleanup(self):
334 def cleanup(self):
335 shutil.rmtree(self.tmp_profile_dir, ignore_errors=True)
335 shutil.rmtree(self.tmp_profile_dir, ignore_errors=True)
336
336
337 def clear_cout(self):
337 def clear_cout(self):
338 self.cout.seek(0)
338 self.cout.seek(0)
339 self.cout.truncate(0)
339 self.cout.truncate(0)
340
340
341 def process_input_line(self, line, store_history=True):
341 def process_input_line(self, line, store_history=True):
342 """process the input, capturing stdout"""
342 """process the input, capturing stdout"""
343
343
344 stdout = sys.stdout
344 stdout = sys.stdout
345 splitter = self.IP.input_splitter
345 splitter = self.IP.input_splitter
346 try:
346 try:
347 sys.stdout = self.cout
347 sys.stdout = self.cout
348 splitter.push(line)
348 splitter.push(line)
349 more = splitter.push_accepts_more()
349 more = splitter.push_accepts_more()
350 if not more:
350 if not more:
351 source_raw = splitter.raw_reset()
351 source_raw = splitter.raw_reset()
352 self.IP.run_cell(source_raw, store_history=store_history)
352 self.IP.run_cell(source_raw, store_history=store_history)
353 finally:
353 finally:
354 sys.stdout = stdout
354 sys.stdout = stdout
355
355
356 def process_image(self, decorator):
356 def process_image(self, decorator):
357 """
357 """
358 # build out an image directive like
358 # build out an image directive like
359 # .. image:: somefile.png
359 # .. image:: somefile.png
360 # :width 4in
360 # :width 4in
361 #
361 #
362 # from an input like
362 # from an input like
363 # savefig somefile.png width=4in
363 # savefig somefile.png width=4in
364 """
364 """
365 savefig_dir = self.savefig_dir
365 savefig_dir = self.savefig_dir
366 source_dir = self.source_dir
366 source_dir = self.source_dir
367 saveargs = decorator.split(' ')
367 saveargs = decorator.split(' ')
368 filename = saveargs[1]
368 filename = saveargs[1]
369 # insert relative path to image file in source
369 # insert relative path to image file in source
370 outfile = os.path.relpath(os.path.join(savefig_dir,filename),
370 outfile = os.path.relpath(os.path.join(savefig_dir,filename),
371 source_dir)
371 source_dir)
372
372
373 imagerows = ['.. image:: %s'%outfile]
373 imagerows = ['.. image:: %s'%outfile]
374
374
375 for kwarg in saveargs[2:]:
375 for kwarg in saveargs[2:]:
376 arg, val = kwarg.split('=')
376 arg, val = kwarg.split('=')
377 arg = arg.strip()
377 arg = arg.strip()
378 val = val.strip()
378 val = val.strip()
379 imagerows.append(' :%s: %s'%(arg, val))
379 imagerows.append(' :%s: %s'%(arg, val))
380
380
381 image_file = os.path.basename(outfile) # only return file name
381 image_file = os.path.basename(outfile) # only return file name
382 image_directive = '\n'.join(imagerows)
382 image_directive = '\n'.join(imagerows)
383 return image_file, image_directive
383 return image_file, image_directive
384
384
385 # Callbacks for each type of token
385 # Callbacks for each type of token
386 def process_input(self, data, input_prompt, lineno):
386 def process_input(self, data, input_prompt, lineno):
387 """
387 """
388 Process data block for INPUT token.
388 Process data block for INPUT token.
389
389
390 """
390 """
391 decorator, input, rest = data
391 decorator, input, rest = data
392 image_file = None
392 image_file = None
393 image_directive = None
393 image_directive = None
394
394
395 is_verbatim = decorator=='@verbatim' or self.is_verbatim
395 is_verbatim = decorator=='@verbatim' or self.is_verbatim
396 is_doctest = (decorator is not None and \
396 is_doctest = (decorator is not None and \
397 decorator.startswith('@doctest')) or self.is_doctest
397 decorator.startswith('@doctest')) or self.is_doctest
398 is_suppress = decorator=='@suppress' or self.is_suppress
398 is_suppress = decorator=='@suppress' or self.is_suppress
399 is_okexcept = decorator=='@okexcept' or self.is_okexcept
399 is_okexcept = decorator=='@okexcept' or self.is_okexcept
400 is_okwarning = decorator=='@okwarning' or self.is_okwarning
400 is_okwarning = decorator=='@okwarning' or self.is_okwarning
401 is_savefig = decorator is not None and \
401 is_savefig = decorator is not None and \
402 decorator.startswith('@savefig')
402 decorator.startswith('@savefig')
403
403
404 input_lines = input.split('\n')
404 input_lines = input.split('\n')
405 if len(input_lines) > 1:
405 if len(input_lines) > 1:
406 if input_lines[-1] != "":
406 if input_lines[-1] != "":
407 input_lines.append('') # make sure there's a blank line
407 input_lines.append('') # make sure there's a blank line
408 # so splitter buffer gets reset
408 # so splitter buffer gets reset
409
409
410 continuation = ' %s:'%''.join(['.']*(len(str(lineno))+2))
410 continuation = ' %s:'%''.join(['.']*(len(str(lineno))+2))
411
411
412 if is_savefig:
412 if is_savefig:
413 image_file, image_directive = self.process_image(decorator)
413 image_file, image_directive = self.process_image(decorator)
414
414
415 ret = []
415 ret = []
416 is_semicolon = False
416 is_semicolon = False
417
417
418 # Hold the execution count, if requested to do so.
418 # Hold the execution count, if requested to do so.
419 if is_suppress and self.hold_count:
419 if is_suppress and self.hold_count:
420 store_history = False
420 store_history = False
421 else:
421 else:
422 store_history = True
422 store_history = True
423
423
424 # Note: catch_warnings is not thread safe
424 # Note: catch_warnings is not thread safe
425 with warnings.catch_warnings(record=True) as ws:
425 with warnings.catch_warnings(record=True) as ws:
426 for i, line in enumerate(input_lines):
426 for i, line in enumerate(input_lines):
427 if line.endswith(';'):
427 if line.endswith(';'):
428 is_semicolon = True
428 is_semicolon = True
429
429
430 if i == 0:
430 if i == 0:
431 # process the first input line
431 # process the first input line
432 if is_verbatim:
432 if is_verbatim:
433 self.process_input_line('')
433 self.process_input_line('')
434 self.IP.execution_count += 1 # increment it anyway
434 self.IP.execution_count += 1 # increment it anyway
435 else:
435 else:
436 # only submit the line in non-verbatim mode
436 # only submit the line in non-verbatim mode
437 self.process_input_line(line, store_history=store_history)
437 self.process_input_line(line, store_history=store_history)
438 formatted_line = '%s %s'%(input_prompt, line)
438 formatted_line = '%s %s'%(input_prompt, line)
439 else:
439 else:
440 # process a continuation line
440 # process a continuation line
441 if not is_verbatim:
441 if not is_verbatim:
442 self.process_input_line(line, store_history=store_history)
442 self.process_input_line(line, store_history=store_history)
443
443
444 formatted_line = '%s %s'%(continuation, line)
444 formatted_line = '%s %s'%(continuation, line)
445
445
446 if not is_suppress:
446 if not is_suppress:
447 ret.append(formatted_line)
447 ret.append(formatted_line)
448
448
449 if not is_suppress and len(rest.strip()) and is_verbatim:
449 if not is_suppress and len(rest.strip()) and is_verbatim:
450 # The "rest" is the standard output of the input. This needs to be
450 # The "rest" is the standard output of the input. This needs to be
451 # added when in verbatim mode. If there is no "rest", then we don't
451 # added when in verbatim mode. If there is no "rest", then we don't
452 # add it, as the new line will be added by the processed output.
452 # add it, as the new line will be added by the processed output.
453 ret.append(rest)
453 ret.append(rest)
454
454
455 # Fetch the processed output. (This is not the submitted output.)
455 # Fetch the processed output. (This is not the submitted output.)
456 self.cout.seek(0)
456 self.cout.seek(0)
457 processed_output = self.cout.read()
457 processed_output = self.cout.read()
458 if not is_suppress and not is_semicolon:
458 if not is_suppress and not is_semicolon:
459 #
459 #
460 # In IPythonDirective.run, the elements of `ret` are eventually
460 # In IPythonDirective.run, the elements of `ret` are eventually
461 # combined such that '' entries correspond to newlines. So if
461 # combined such that '' entries correspond to newlines. So if
462 # `processed_output` is equal to '', then the adding it to `ret`
462 # `processed_output` is equal to '', then the adding it to `ret`
463 # ensures that there is a blank line between consecutive inputs
463 # ensures that there is a blank line between consecutive inputs
464 # that have no outputs, as in:
464 # that have no outputs, as in:
465 #
465 #
466 # In [1]: x = 4
466 # In [1]: x = 4
467 #
467 #
468 # In [2]: x = 5
468 # In [2]: x = 5
469 #
469 #
470 # When there is processed output, it has a '\n' at the tail end. So
470 # When there is processed output, it has a '\n' at the tail end. So
471 # adding the output to `ret` will provide the necessary spacing
471 # adding the output to `ret` will provide the necessary spacing
472 # between consecutive input/output blocks, as in:
472 # between consecutive input/output blocks, as in:
473 #
473 #
474 # In [1]: x
474 # In [1]: x
475 # Out[1]: 5
475 # Out[1]: 5
476 #
476 #
477 # In [2]: x
477 # In [2]: x
478 # Out[2]: 5
478 # Out[2]: 5
479 #
479 #
480 # When there is stdout from the input, it also has a '\n' at the
480 # When there is stdout from the input, it also has a '\n' at the
481 # tail end, and so this ensures proper spacing as well. E.g.:
481 # tail end, and so this ensures proper spacing as well. E.g.:
482 #
482 #
483 # In [1]: print x
483 # In [1]: print x
484 # 5
484 # 5
485 #
485 #
486 # In [2]: x = 5
486 # In [2]: x = 5
487 #
487 #
488 # When in verbatim mode, `processed_output` is empty (because
488 # When in verbatim mode, `processed_output` is empty (because
489 # nothing was passed to IP. Sometimes the submitted code block has
489 # nothing was passed to IP. Sometimes the submitted code block has
490 # an Out[] portion and sometimes it does not. When it does not, we
490 # an Out[] portion and sometimes it does not. When it does not, we
491 # need to ensure proper spacing, so we have to add '' to `ret`.
491 # need to ensure proper spacing, so we have to add '' to `ret`.
492 # However, if there is an Out[] in the submitted code, then we do
492 # However, if there is an Out[] in the submitted code, then we do
493 # not want to add a newline as `process_output` has stuff to add.
493 # not want to add a newline as `process_output` has stuff to add.
494 # The difficulty is that `process_input` doesn't know if
494 # The difficulty is that `process_input` doesn't know if
495 # `process_output` will be called---so it doesn't know if there is
495 # `process_output` will be called---so it doesn't know if there is
496 # Out[] in the code block. The requires that we include a hack in
496 # Out[] in the code block. The requires that we include a hack in
497 # `process_block`. See the comments there.
497 # `process_block`. See the comments there.
498 #
498 #
499 ret.append(processed_output)
499 ret.append(processed_output)
500 elif is_semicolon:
500 elif is_semicolon:
501 # Make sure there is a newline after the semicolon.
501 # Make sure there is a newline after the semicolon.
502 ret.append('')
502 ret.append('')
503
503
504 # context information
504 # context information
505 filename = "Unknown"
505 filename = "Unknown"
506 lineno = 0
506 lineno = 0
507 if self.directive.state:
507 if self.directive.state:
508 filename = self.directive.state.document.current_source
508 filename = self.directive.state.document.current_source
509 lineno = self.directive.state.document.current_line
509 lineno = self.directive.state.document.current_line
510
510
511 # output any exceptions raised during execution to stdout
511 # output any exceptions raised during execution to stdout
512 # unless :okexcept: has been specified.
512 # unless :okexcept: has been specified.
513 if not is_okexcept and "Traceback" in processed_output:
513 if not is_okexcept and "Traceback" in processed_output:
514 s = "\nException in %s at block ending on line %s\n" % (filename, lineno)
514 s = "\nException in %s at block ending on line %s\n" % (filename, lineno)
515 s += "Specify :okexcept: as an option in the ipython:: block to suppress this message\n"
515 s += "Specify :okexcept: as an option in the ipython:: block to suppress this message\n"
516 sys.stdout.write('\n\n>>>' + ('-' * 73))
516 sys.stdout.write('\n\n>>>' + ('-' * 73))
517 sys.stdout.write(s)
517 sys.stdout.write(s)
518 sys.stdout.write(processed_output)
518 sys.stdout.write(processed_output)
519 sys.stdout.write('<<<' + ('-' * 73) + '\n\n')
519 sys.stdout.write('<<<' + ('-' * 73) + '\n\n')
520
520
521 # output any warning raised during execution to stdout
521 # output any warning raised during execution to stdout
522 # unless :okwarning: has been specified.
522 # unless :okwarning: has been specified.
523 if not is_okwarning:
523 if not is_okwarning:
524 for w in ws:
524 for w in ws:
525 s = "\nWarning in %s at block ending on line %s\n" % (filename, lineno)
525 s = "\nWarning in %s at block ending on line %s\n" % (filename, lineno)
526 s += "Specify :okwarning: as an option in the ipython:: block to suppress this message\n"
526 s += "Specify :okwarning: as an option in the ipython:: block to suppress this message\n"
527 sys.stdout.write('\n\n>>>' + ('-' * 73))
527 sys.stdout.write('\n\n>>>' + ('-' * 73))
528 sys.stdout.write(s)
528 sys.stdout.write(s)
529 sys.stdout.write(('-' * 76) + '\n')
529 sys.stdout.write(('-' * 76) + '\n')
530 s=warnings.formatwarning(w.message, w.category,
530 s=warnings.formatwarning(w.message, w.category,
531 w.filename, w.lineno, w.line)
531 w.filename, w.lineno, w.line)
532 sys.stdout.write(s)
532 sys.stdout.write(s)
533 sys.stdout.write('<<<' + ('-' * 73) + '\n')
533 sys.stdout.write('<<<' + ('-' * 73) + '\n')
534
534
535 self.cout.truncate(0)
535 self.cout.truncate(0)
536
536
537 return (ret, input_lines, processed_output,
537 return (ret, input_lines, processed_output,
538 is_doctest, decorator, image_file, image_directive)
538 is_doctest, decorator, image_file, image_directive)
539
539
540
540
541 def process_output(self, data, output_prompt, input_lines, output,
541 def process_output(self, data, output_prompt, input_lines, output,
542 is_doctest, decorator, image_file):
542 is_doctest, decorator, image_file):
543 """
543 """
544 Process data block for OUTPUT token.
544 Process data block for OUTPUT token.
545
545
546 """
546 """
547 # Recall: `data` is the submitted output, and `output` is the processed
547 # Recall: `data` is the submitted output, and `output` is the processed
548 # output from `input_lines`.
548 # output from `input_lines`.
549
549
550 TAB = ' ' * 4
550 TAB = ' ' * 4
551
551
552 if is_doctest and output is not None:
552 if is_doctest and output is not None:
553
553
554 found = output # This is the processed output
554 found = output # This is the processed output
555 found = found.strip()
555 found = found.strip()
556 submitted = data.strip()
556 submitted = data.strip()
557
557
558 if self.directive is None:
558 if self.directive is None:
559 source = 'Unavailable'
559 source = 'Unavailable'
560 content = 'Unavailable'
560 content = 'Unavailable'
561 else:
561 else:
562 source = self.directive.state.document.current_source
562 source = self.directive.state.document.current_source
563 content = self.directive.content
563 content = self.directive.content
564 # Add tabs and join into a single string.
564 # Add tabs and join into a single string.
565 content = '\n'.join([TAB + line for line in content])
565 content = '\n'.join([TAB + line for line in content])
566
566
567 # Make sure the output contains the output prompt.
567 # Make sure the output contains the output prompt.
568 ind = found.find(output_prompt)
568 ind = found.find(output_prompt)
569 if ind < 0:
569 if ind < 0:
570 e = ('output does not contain output prompt\n\n'
570 e = ('output does not contain output prompt\n\n'
571 'Document source: {0}\n\n'
571 'Document source: {0}\n\n'
572 'Raw content: \n{1}\n\n'
572 'Raw content: \n{1}\n\n'
573 'Input line(s):\n{TAB}{2}\n\n'
573 'Input line(s):\n{TAB}{2}\n\n'
574 'Output line(s):\n{TAB}{3}\n\n')
574 'Output line(s):\n{TAB}{3}\n\n')
575 e = e.format(source, content, '\n'.join(input_lines),
575 e = e.format(source, content, '\n'.join(input_lines),
576 repr(found), TAB=TAB)
576 repr(found), TAB=TAB)
577 raise RuntimeError(e)
577 raise RuntimeError(e)
578 found = found[len(output_prompt):].strip()
578 found = found[len(output_prompt):].strip()
579
579
580 # Handle the actual doctest comparison.
580 # Handle the actual doctest comparison.
581 if decorator.strip() == '@doctest':
581 if decorator.strip() == '@doctest':
582 # Standard doctest
582 # Standard doctest
583 if found != submitted:
583 if found != submitted:
584 e = ('doctest failure\n\n'
584 e = ('doctest failure\n\n'
585 'Document source: {0}\n\n'
585 'Document source: {0}\n\n'
586 'Raw content: \n{1}\n\n'
586 'Raw content: \n{1}\n\n'
587 'On input line(s):\n{TAB}{2}\n\n'
587 'On input line(s):\n{TAB}{2}\n\n'
588 'we found output:\n{TAB}{3}\n\n'
588 'we found output:\n{TAB}{3}\n\n'
589 'instead of the expected:\n{TAB}{4}\n\n')
589 'instead of the expected:\n{TAB}{4}\n\n')
590 e = e.format(source, content, '\n'.join(input_lines),
590 e = e.format(source, content, '\n'.join(input_lines),
591 repr(found), repr(submitted), TAB=TAB)
591 repr(found), repr(submitted), TAB=TAB)
592 raise RuntimeError(e)
592 raise RuntimeError(e)
593 else:
593 else:
594 self.custom_doctest(decorator, input_lines, found, submitted)
594 self.custom_doctest(decorator, input_lines, found, submitted)
595
595
596 # When in verbatim mode, this holds additional submitted output
596 # When in verbatim mode, this holds additional submitted output
597 # to be written in the final Sphinx output.
597 # to be written in the final Sphinx output.
598 # https://github.com/ipython/ipython/issues/5776
598 # https://github.com/ipython/ipython/issues/5776
599 out_data = []
599 out_data = []
600
600
601 is_verbatim = decorator=='@verbatim' or self.is_verbatim
601 is_verbatim = decorator=='@verbatim' or self.is_verbatim
602 if is_verbatim and data.strip():
602 if is_verbatim and data.strip():
603 # Note that `ret` in `process_block` has '' as its last element if
603 # Note that `ret` in `process_block` has '' as its last element if
604 # the code block was in verbatim mode. So if there is no submitted
604 # the code block was in verbatim mode. So if there is no submitted
605 # output, then we will have proper spacing only if we do not add
605 # output, then we will have proper spacing only if we do not add
606 # an additional '' to `out_data`. This is why we condition on
606 # an additional '' to `out_data`. This is why we condition on
607 # `and data.strip()`.
607 # `and data.strip()`.
608
608
609 # The submitted output has no output prompt. If we want the
609 # The submitted output has no output prompt. If we want the
610 # prompt and the code to appear, we need to join them now
610 # prompt and the code to appear, we need to join them now
611 # instead of adding them separately---as this would create an
611 # instead of adding them separately---as this would create an
612 # undesired newline. How we do this ultimately depends on the
612 # undesired newline. How we do this ultimately depends on the
613 # format of the output regex. I'll do what works for the default
613 # format of the output regex. I'll do what works for the default
614 # prompt for now, and we might have to adjust if it doesn't work
614 # prompt for now, and we might have to adjust if it doesn't work
615 # in other cases. Finally, the submitted output does not have
615 # in other cases. Finally, the submitted output does not have
616 # a trailing newline, so we must add it manually.
616 # a trailing newline, so we must add it manually.
617 out_data.append("{0} {1}\n".format(output_prompt, data))
617 out_data.append("{0} {1}\n".format(output_prompt, data))
618
618
619 return out_data
619 return out_data
620
620
621 def process_comment(self, data):
621 def process_comment(self, data):
622 """Process data fPblock for COMMENT token."""
622 """Process data fPblock for COMMENT token."""
623 if not self.is_suppress:
623 if not self.is_suppress:
624 return [data]
624 return [data]
625
625
626 def save_image(self, image_file):
626 def save_image(self, image_file):
627 """
627 """
628 Saves the image file to disk.
628 Saves the image file to disk.
629 """
629 """
630 self.ensure_pyplot()
630 self.ensure_pyplot()
631 command = 'plt.gcf().savefig("%s")'%image_file
631 command = 'plt.gcf().savefig("%s")'%image_file
632 #print 'SAVEFIG', command # dbg
632 #print 'SAVEFIG', command # dbg
633 self.process_input_line('bookmark ipy_thisdir', store_history=False)
633 self.process_input_line('bookmark ipy_thisdir', store_history=False)
634 self.process_input_line('cd -b ipy_savedir', store_history=False)
634 self.process_input_line('cd -b ipy_savedir', store_history=False)
635 self.process_input_line(command, store_history=False)
635 self.process_input_line(command, store_history=False)
636 self.process_input_line('cd -b ipy_thisdir', store_history=False)
636 self.process_input_line('cd -b ipy_thisdir', store_history=False)
637 self.process_input_line('bookmark -d ipy_thisdir', store_history=False)
637 self.process_input_line('bookmark -d ipy_thisdir', store_history=False)
638 self.clear_cout()
638 self.clear_cout()
639
639
640 def process_block(self, block):
640 def process_block(self, block):
641 """
641 """
642 process block from the block_parser and return a list of processed lines
642 process block from the block_parser and return a list of processed lines
643 """
643 """
644 ret = []
644 ret = []
645 output = None
645 output = None
646 input_lines = None
646 input_lines = None
647 lineno = self.IP.execution_count
647 lineno = self.IP.execution_count
648
648
649 input_prompt = self.promptin % lineno
649 input_prompt = self.promptin % lineno
650 output_prompt = self.promptout % lineno
650 output_prompt = self.promptout % lineno
651 image_file = None
651 image_file = None
652 image_directive = None
652 image_directive = None
653
653
654 found_input = False
654 found_input = False
655 for token, data in block:
655 for token, data in block:
656 if token == COMMENT:
656 if token == COMMENT:
657 out_data = self.process_comment(data)
657 out_data = self.process_comment(data)
658 elif token == INPUT:
658 elif token == INPUT:
659 found_input = True
659 found_input = True
660 (out_data, input_lines, output, is_doctest,
660 (out_data, input_lines, output, is_doctest,
661 decorator, image_file, image_directive) = \
661 decorator, image_file, image_directive) = \
662 self.process_input(data, input_prompt, lineno)
662 self.process_input(data, input_prompt, lineno)
663 elif token == OUTPUT:
663 elif token == OUTPUT:
664 if not found_input:
664 if not found_input:
665
665
666 TAB = ' ' * 4
666 TAB = ' ' * 4
667 linenumber = 0
667 linenumber = 0
668 source = 'Unavailable'
668 source = 'Unavailable'
669 content = 'Unavailable'
669 content = 'Unavailable'
670 if self.directive:
670 if self.directive:
671 linenumber = self.directive.state.document.current_line
671 linenumber = self.directive.state.document.current_line
672 source = self.directive.state.document.current_source
672 source = self.directive.state.document.current_source
673 content = self.directive.content
673 content = self.directive.content
674 # Add tabs and join into a single string.
674 # Add tabs and join into a single string.
675 content = '\n'.join([TAB + line for line in content])
675 content = '\n'.join([TAB + line for line in content])
676
676
677 e = ('\n\nInvalid block: Block contains an output prompt '
677 e = ('\n\nInvalid block: Block contains an output prompt '
678 'without an input prompt.\n\n'
678 'without an input prompt.\n\n'
679 'Document source: {0}\n\n'
679 'Document source: {0}\n\n'
680 'Content begins at line {1}: \n\n{2}\n\n'
680 'Content begins at line {1}: \n\n{2}\n\n'
681 'Problematic block within content: \n\n{TAB}{3}\n\n')
681 'Problematic block within content: \n\n{TAB}{3}\n\n')
682 e = e.format(source, linenumber, content, block, TAB=TAB)
682 e = e.format(source, linenumber, content, block, TAB=TAB)
683
683
684 # Write, rather than include in exception, since Sphinx
684 # Write, rather than include in exception, since Sphinx
685 # will truncate tracebacks.
685 # will truncate tracebacks.
686 sys.stdout.write(e)
686 sys.stdout.write(e)
687 raise RuntimeError('An invalid block was detected.')
687 raise RuntimeError('An invalid block was detected.')
688
688
689 out_data = \
689 out_data = \
690 self.process_output(data, output_prompt, input_lines,
690 self.process_output(data, output_prompt, input_lines,
691 output, is_doctest, decorator,
691 output, is_doctest, decorator,
692 image_file)
692 image_file)
693 if out_data:
693 if out_data:
694 # Then there was user submitted output in verbatim mode.
694 # Then there was user submitted output in verbatim mode.
695 # We need to remove the last element of `ret` that was
695 # We need to remove the last element of `ret` that was
696 # added in `process_input`, as it is '' and would introduce
696 # added in `process_input`, as it is '' and would introduce
697 # an undesirable newline.
697 # an undesirable newline.
698 assert(ret[-1] == '')
698 assert(ret[-1] == '')
699 del ret[-1]
699 del ret[-1]
700
700
701 if out_data:
701 if out_data:
702 ret.extend(out_data)
702 ret.extend(out_data)
703
703
704 # save the image files
704 # save the image files
705 if image_file is not None:
705 if image_file is not None:
706 self.save_image(image_file)
706 self.save_image(image_file)
707
707
708 return ret, image_directive
708 return ret, image_directive
709
709
710 def ensure_pyplot(self):
710 def ensure_pyplot(self):
711 """
711 """
712 Ensures that pyplot has been imported into the embedded IPython shell.
712 Ensures that pyplot has been imported into the embedded IPython shell.
713
713
714 Also, makes sure to set the backend appropriately if not set already.
714 Also, makes sure to set the backend appropriately if not set already.
715
715
716 """
716 """
717 # We are here if the @figure pseudo decorator was used. Thus, it's
717 # We are here if the @figure pseudo decorator was used. Thus, it's
718 # possible that we could be here even if python_mplbackend were set to
718 # possible that we could be here even if python_mplbackend were set to
719 # `None`. That's also strange and perhaps worthy of raising an
719 # `None`. That's also strange and perhaps worthy of raising an
720 # exception, but for now, we just set the backend to 'agg'.
720 # exception, but for now, we just set the backend to 'agg'.
721
721
722 if not self._pyplot_imported:
722 if not self._pyplot_imported:
723 if 'matplotlib.backends' not in sys.modules:
723 if 'matplotlib.backends' not in sys.modules:
724 # Then ipython_matplotlib was set to None but there was a
724 # Then ipython_matplotlib was set to None but there was a
725 # call to the @figure decorator (and ipython_execlines did
725 # call to the @figure decorator (and ipython_execlines did
726 # not set a backend).
726 # not set a backend).
727 #raise Exception("No backend was set, but @figure was used!")
727 #raise Exception("No backend was set, but @figure was used!")
728 import matplotlib
728 import matplotlib
729 matplotlib.use('agg')
729 matplotlib.use('agg')
730
730
731 # Always import pyplot into embedded shell.
731 # Always import pyplot into embedded shell.
732 self.process_input_line('import matplotlib.pyplot as plt',
732 self.process_input_line('import matplotlib.pyplot as plt',
733 store_history=False)
733 store_history=False)
734 self._pyplot_imported = True
734 self._pyplot_imported = True
735
735
736 def process_pure_python(self, content):
736 def process_pure_python(self, content):
737 """
737 """
738 content is a list of strings. it is unedited directive content
738 content is a list of strings. it is unedited directive content
739
739
740 This runs it line by line in the InteractiveShell, prepends
740 This runs it line by line in the InteractiveShell, prepends
741 prompts as needed capturing stderr and stdout, then returns
741 prompts as needed capturing stderr and stdout, then returns
742 the content as a list as if it were ipython code
742 the content as a list as if it were ipython code
743 """
743 """
744 output = []
744 output = []
745 savefig = False # keep up with this to clear figure
745 savefig = False # keep up with this to clear figure
746 multiline = False # to handle line continuation
746 multiline = False # to handle line continuation
747 multiline_start = None
747 multiline_start = None
748 fmtin = self.promptin
748 fmtin = self.promptin
749
749
750 ct = 0
750 ct = 0
751
751
752 for lineno, line in enumerate(content):
752 for lineno, line in enumerate(content):
753
753
754 line_stripped = line.strip()
754 line_stripped = line.strip()
755 if not len(line):
755 if not len(line):
756 output.append(line)
756 output.append(line)
757 continue
757 continue
758
758
759 # handle decorators
759 # handle decorators
760 if line_stripped.startswith('@'):
760 if line_stripped.startswith('@'):
761 output.extend([line])
761 output.extend([line])
762 if 'savefig' in line:
762 if 'savefig' in line:
763 savefig = True # and need to clear figure
763 savefig = True # and need to clear figure
764 continue
764 continue
765
765
766 # handle comments
766 # handle comments
767 if line_stripped.startswith('#'):
767 if line_stripped.startswith('#'):
768 output.extend([line])
768 output.extend([line])
769 continue
769 continue
770
770
771 # deal with lines checking for multiline
771 # deal with lines checking for multiline
772 continuation = u' %s:'% ''.join(['.']*(len(str(ct))+2))
772 continuation = u' %s:'% ''.join(['.']*(len(str(ct))+2))
773 if not multiline:
773 if not multiline:
774 modified = u"%s %s" % (fmtin % ct, line_stripped)
774 modified = u"%s %s" % (fmtin % ct, line_stripped)
775 output.append(modified)
775 output.append(modified)
776 ct += 1
776 ct += 1
777 try:
777 try:
778 ast.parse(line_stripped)
778 ast.parse(line_stripped)
779 output.append(u'')
779 output.append(u'')
780 except Exception: # on a multiline
780 except Exception: # on a multiline
781 multiline = True
781 multiline = True
782 multiline_start = lineno
782 multiline_start = lineno
783 else: # still on a multiline
783 else: # still on a multiline
784 modified = u'%s %s' % (continuation, line)
784 modified = u'%s %s' % (continuation, line)
785 output.append(modified)
785 output.append(modified)
786
786
787 # if the next line is indented, it should be part of multiline
787 # if the next line is indented, it should be part of multiline
788 if len(content) > lineno + 1:
788 if len(content) > lineno + 1:
789 nextline = content[lineno + 1]
789 nextline = content[lineno + 1]
790 if len(nextline) - len(nextline.lstrip()) > 3:
790 if len(nextline) - len(nextline.lstrip()) > 3:
791 continue
791 continue
792 try:
792 try:
793 mod = ast.parse(
793 mod = ast.parse(
794 '\n'.join(content[multiline_start:lineno+1]))
794 '\n'.join(content[multiline_start:lineno+1]))
795 if isinstance(mod.body[0], ast.FunctionDef):
795 if isinstance(mod.body[0], ast.FunctionDef):
796 # check to see if we have the whole function
796 # check to see if we have the whole function
797 for element in mod.body[0].body:
797 for element in mod.body[0].body:
798 if isinstance(element, ast.Return):
798 if isinstance(element, ast.Return):
799 multiline = False
799 multiline = False
800 else:
800 else:
801 output.append(u'')
801 output.append(u'')
802 multiline = False
802 multiline = False
803 except Exception:
803 except Exception:
804 pass
804 pass
805
805
806 if savefig: # clear figure if plotted
806 if savefig: # clear figure if plotted
807 self.ensure_pyplot()
807 self.ensure_pyplot()
808 self.process_input_line('plt.clf()', store_history=False)
808 self.process_input_line('plt.clf()', store_history=False)
809 self.clear_cout()
809 self.clear_cout()
810 savefig = False
810 savefig = False
811
811
812 return output
812 return output
813
813
814 def custom_doctest(self, decorator, input_lines, found, submitted):
814 def custom_doctest(self, decorator, input_lines, found, submitted):
815 """
815 """
816 Perform a specialized doctest.
816 Perform a specialized doctest.
817
817
818 """
818 """
819 from .custom_doctests import doctests
819 from .custom_doctests import doctests
820
820
821 args = decorator.split()
821 args = decorator.split()
822 doctest_type = args[1]
822 doctest_type = args[1]
823 if doctest_type in doctests:
823 if doctest_type in doctests:
824 doctests[doctest_type](self, args, input_lines, found, submitted)
824 doctests[doctest_type](self, args, input_lines, found, submitted)
825 else:
825 else:
826 e = "Invalid option to @doctest: {0}".format(doctest_type)
826 e = "Invalid option to @doctest: {0}".format(doctest_type)
827 raise Exception(e)
827 raise Exception(e)
828
828
829
829
830 class IPythonDirective(Directive):
830 class IPythonDirective(Directive):
831
831
832 has_content = True
832 has_content = True
833 required_arguments = 0
833 required_arguments = 0
834 optional_arguments = 4 # python, suppress, verbatim, doctest
834 optional_arguments = 4 # python, suppress, verbatim, doctest
835 final_argumuent_whitespace = True
835 final_argumuent_whitespace = True
836 option_spec = { 'python': directives.unchanged,
836 option_spec = { 'python': directives.unchanged,
837 'suppress' : directives.flag,
837 'suppress' : directives.flag,
838 'verbatim' : directives.flag,
838 'verbatim' : directives.flag,
839 'doctest' : directives.flag,
839 'doctest' : directives.flag,
840 'okexcept': directives.flag,
840 'okexcept': directives.flag,
841 'okwarning': directives.flag
841 'okwarning': directives.flag
842 }
842 }
843
843
844 shell = None
844 shell = None
845
845
846 seen_docs = set()
846 seen_docs = set()
847
847
848 def get_config_options(self):
848 def get_config_options(self):
849 # contains sphinx configuration variables
849 # contains sphinx configuration variables
850 config = self.state.document.settings.env.config
850 config = self.state.document.settings.env.config
851
851
852 # get config variables to set figure output directory
852 # get config variables to set figure output directory
853 outdir = self.state.document.settings.env.app.outdir
853 outdir = self.state.document.settings.env.app.outdir
854 savefig_dir = config.ipython_savefig_dir
854 savefig_dir = config.ipython_savefig_dir
855 source_dir = os.path.dirname(self.state.document.current_source)
855 source_dir = os.path.dirname(self.state.document.current_source)
856 if savefig_dir is None:
856 if savefig_dir is None:
857 savefig_dir = config.html_static_path or '_static'
857 savefig_dir = config.html_static_path or '_static'
858 if isinstance(savefig_dir, list):
858 if isinstance(savefig_dir, list):
859 savefig_dir = os.path.join(*savefig_dir)
859 savefig_dir = os.path.join(*savefig_dir)
860 savefig_dir = os.path.join(outdir, savefig_dir)
860 savefig_dir = os.path.join(outdir, savefig_dir)
861
861
862 # get regex and prompt stuff
862 # get regex and prompt stuff
863 rgxin = config.ipython_rgxin
863 rgxin = config.ipython_rgxin
864 rgxout = config.ipython_rgxout
864 rgxout = config.ipython_rgxout
865 promptin = config.ipython_promptin
865 promptin = config.ipython_promptin
866 promptout = config.ipython_promptout
866 promptout = config.ipython_promptout
867 mplbackend = config.ipython_mplbackend
867 mplbackend = config.ipython_mplbackend
868 exec_lines = config.ipython_execlines
868 exec_lines = config.ipython_execlines
869 hold_count = config.ipython_holdcount
869 hold_count = config.ipython_holdcount
870
870
871 return (savefig_dir, source_dir, rgxin, rgxout,
871 return (savefig_dir, source_dir, rgxin, rgxout,
872 promptin, promptout, mplbackend, exec_lines, hold_count)
872 promptin, promptout, mplbackend, exec_lines, hold_count)
873
873
874 def setup(self):
874 def setup(self):
875 # Get configuration values.
875 # Get configuration values.
876 (savefig_dir, source_dir, rgxin, rgxout, promptin, promptout,
876 (savefig_dir, source_dir, rgxin, rgxout, promptin, promptout,
877 mplbackend, exec_lines, hold_count) = self.get_config_options()
877 mplbackend, exec_lines, hold_count) = self.get_config_options()
878
878
879 if self.shell is None:
879 if self.shell is None:
880 # We will be here many times. However, when the
880 # We will be here many times. However, when the
881 # EmbeddedSphinxShell is created, its interactive shell member
881 # EmbeddedSphinxShell is created, its interactive shell member
882 # is the same for each instance.
882 # is the same for each instance.
883
883
884 if mplbackend and 'matplotlib.backends' not in sys.modules:
884 if mplbackend and 'matplotlib.backends' not in sys.modules:
885 import matplotlib
885 import matplotlib
886 matplotlib.use(mplbackend)
886 matplotlib.use(mplbackend)
887
887
888 # Must be called after (potentially) importing matplotlib and
888 # Must be called after (potentially) importing matplotlib and
889 # setting its backend since exec_lines might import pylab.
889 # setting its backend since exec_lines might import pylab.
890 self.shell = EmbeddedSphinxShell(exec_lines)
890 self.shell = EmbeddedSphinxShell(exec_lines)
891
891
892 # Store IPython directive to enable better error messages
892 # Store IPython directive to enable better error messages
893 self.shell.directive = self
893 self.shell.directive = self
894
894
895 # reset the execution count if we haven't processed this doc
895 # reset the execution count if we haven't processed this doc
896 #NOTE: this may be borked if there are multiple seen_doc tmp files
896 #NOTE: this may be borked if there are multiple seen_doc tmp files
897 #check time stamp?
897 #check time stamp?
898 if not self.state.document.current_source in self.seen_docs:
898 if not self.state.document.current_source in self.seen_docs:
899 self.shell.IP.history_manager.reset()
899 self.shell.IP.history_manager.reset()
900 self.shell.IP.execution_count = 1
900 self.shell.IP.execution_count = 1
901 self.shell.IP.prompt_manager.width = 0
902 self.seen_docs.add(self.state.document.current_source)
901 self.seen_docs.add(self.state.document.current_source)
903
902
904 # and attach to shell so we don't have to pass them around
903 # and attach to shell so we don't have to pass them around
905 self.shell.rgxin = rgxin
904 self.shell.rgxin = rgxin
906 self.shell.rgxout = rgxout
905 self.shell.rgxout = rgxout
907 self.shell.promptin = promptin
906 self.shell.promptin = promptin
908 self.shell.promptout = promptout
907 self.shell.promptout = promptout
909 self.shell.savefig_dir = savefig_dir
908 self.shell.savefig_dir = savefig_dir
910 self.shell.source_dir = source_dir
909 self.shell.source_dir = source_dir
911 self.shell.hold_count = hold_count
910 self.shell.hold_count = hold_count
912
911
913 # setup bookmark for saving figures directory
912 # setup bookmark for saving figures directory
914 self.shell.process_input_line('bookmark ipy_savedir %s'%savefig_dir,
913 self.shell.process_input_line('bookmark ipy_savedir %s'%savefig_dir,
915 store_history=False)
914 store_history=False)
916 self.shell.clear_cout()
915 self.shell.clear_cout()
917
916
918 return rgxin, rgxout, promptin, promptout
917 return rgxin, rgxout, promptin, promptout
919
918
920 def teardown(self):
919 def teardown(self):
921 # delete last bookmark
920 # delete last bookmark
922 self.shell.process_input_line('bookmark -d ipy_savedir',
921 self.shell.process_input_line('bookmark -d ipy_savedir',
923 store_history=False)
922 store_history=False)
924 self.shell.clear_cout()
923 self.shell.clear_cout()
925
924
926 def run(self):
925 def run(self):
927 debug = False
926 debug = False
928
927
929 #TODO, any reason block_parser can't be a method of embeddable shell
928 #TODO, any reason block_parser can't be a method of embeddable shell
930 # then we wouldn't have to carry these around
929 # then we wouldn't have to carry these around
931 rgxin, rgxout, promptin, promptout = self.setup()
930 rgxin, rgxout, promptin, promptout = self.setup()
932
931
933 options = self.options
932 options = self.options
934 self.shell.is_suppress = 'suppress' in options
933 self.shell.is_suppress = 'suppress' in options
935 self.shell.is_doctest = 'doctest' in options
934 self.shell.is_doctest = 'doctest' in options
936 self.shell.is_verbatim = 'verbatim' in options
935 self.shell.is_verbatim = 'verbatim' in options
937 self.shell.is_okexcept = 'okexcept' in options
936 self.shell.is_okexcept = 'okexcept' in options
938 self.shell.is_okwarning = 'okwarning' in options
937 self.shell.is_okwarning = 'okwarning' in options
939
938
940 # handle pure python code
939 # handle pure python code
941 if 'python' in self.arguments:
940 if 'python' in self.arguments:
942 content = self.content
941 content = self.content
943 self.content = self.shell.process_pure_python(content)
942 self.content = self.shell.process_pure_python(content)
944
943
945 # parts consists of all text within the ipython-block.
944 # parts consists of all text within the ipython-block.
946 # Each part is an input/output block.
945 # Each part is an input/output block.
947 parts = '\n'.join(self.content).split('\n\n')
946 parts = '\n'.join(self.content).split('\n\n')
948
947
949 lines = ['.. code-block:: ipython', '']
948 lines = ['.. code-block:: ipython', '']
950 figures = []
949 figures = []
951
950
952 for part in parts:
951 for part in parts:
953 block = block_parser(part, rgxin, rgxout, promptin, promptout)
952 block = block_parser(part, rgxin, rgxout, promptin, promptout)
954 if len(block):
953 if len(block):
955 rows, figure = self.shell.process_block(block)
954 rows, figure = self.shell.process_block(block)
956 for row in rows:
955 for row in rows:
957 lines.extend([' {0}'.format(line)
956 lines.extend([' {0}'.format(line)
958 for line in row.split('\n')])
957 for line in row.split('\n')])
959
958
960 if figure is not None:
959 if figure is not None:
961 figures.append(figure)
960 figures.append(figure)
962
961
963 for figure in figures:
962 for figure in figures:
964 lines.append('')
963 lines.append('')
965 lines.extend(figure.split('\n'))
964 lines.extend(figure.split('\n'))
966 lines.append('')
965 lines.append('')
967
966
968 if len(lines) > 2:
967 if len(lines) > 2:
969 if debug:
968 if debug:
970 print('\n'.join(lines))
969 print('\n'.join(lines))
971 else:
970 else:
972 # This has to do with input, not output. But if we comment
971 # This has to do with input, not output. But if we comment
973 # these lines out, then no IPython code will appear in the
972 # these lines out, then no IPython code will appear in the
974 # final output.
973 # final output.
975 self.state_machine.insert_input(
974 self.state_machine.insert_input(
976 lines, self.state_machine.input_lines.source(0))
975 lines, self.state_machine.input_lines.source(0))
977
976
978 # cleanup
977 # cleanup
979 self.teardown()
978 self.teardown()
980
979
981 return []
980 return []
982
981
983 # Enable as a proper Sphinx directive
982 # Enable as a proper Sphinx directive
984 def setup(app):
983 def setup(app):
985 setup.app = app
984 setup.app = app
986
985
987 app.add_directive('ipython', IPythonDirective)
986 app.add_directive('ipython', IPythonDirective)
988 app.add_config_value('ipython_savefig_dir', None, 'env')
987 app.add_config_value('ipython_savefig_dir', None, 'env')
989 app.add_config_value('ipython_rgxin',
988 app.add_config_value('ipython_rgxin',
990 re.compile('In \[(\d+)\]:\s?(.*)\s*'), 'env')
989 re.compile('In \[(\d+)\]:\s?(.*)\s*'), 'env')
991 app.add_config_value('ipython_rgxout',
990 app.add_config_value('ipython_rgxout',
992 re.compile('Out\[(\d+)\]:\s?(.*)\s*'), 'env')
991 re.compile('Out\[(\d+)\]:\s?(.*)\s*'), 'env')
993 app.add_config_value('ipython_promptin', 'In [%d]:', 'env')
992 app.add_config_value('ipython_promptin', 'In [%d]:', 'env')
994 app.add_config_value('ipython_promptout', 'Out[%d]:', 'env')
993 app.add_config_value('ipython_promptout', 'Out[%d]:', 'env')
995
994
996 # We could just let matplotlib pick whatever is specified as the default
995 # We could just let matplotlib pick whatever is specified as the default
997 # backend in the matplotlibrc file, but this would cause issues if the
996 # backend in the matplotlibrc file, but this would cause issues if the
998 # backend didn't work in headless environments. For this reason, 'agg'
997 # backend didn't work in headless environments. For this reason, 'agg'
999 # is a good default backend choice.
998 # is a good default backend choice.
1000 app.add_config_value('ipython_mplbackend', 'agg', 'env')
999 app.add_config_value('ipython_mplbackend', 'agg', 'env')
1001
1000
1002 # If the user sets this config value to `None`, then EmbeddedSphinxShell's
1001 # If the user sets this config value to `None`, then EmbeddedSphinxShell's
1003 # __init__ method will treat it as [].
1002 # __init__ method will treat it as [].
1004 execlines = ['import numpy as np', 'import matplotlib.pyplot as plt']
1003 execlines = ['import numpy as np', 'import matplotlib.pyplot as plt']
1005 app.add_config_value('ipython_execlines', execlines, 'env')
1004 app.add_config_value('ipython_execlines', execlines, 'env')
1006
1005
1007 app.add_config_value('ipython_holdcount', True, 'env')
1006 app.add_config_value('ipython_holdcount', True, 'env')
1008
1007
1009 metadata = {'parallel_read_safe': True, 'parallel_write_safe': True}
1008 metadata = {'parallel_read_safe': True, 'parallel_write_safe': True}
1010 return metadata
1009 return metadata
1011
1010
1012 # Simple smoke test, needs to be converted to a proper automatic test.
1011 # Simple smoke test, needs to be converted to a proper automatic test.
1013 def test():
1012 def test():
1014
1013
1015 examples = [
1014 examples = [
1016 r"""
1015 r"""
1017 In [9]: pwd
1016 In [9]: pwd
1018 Out[9]: '/home/jdhunter/py4science/book'
1017 Out[9]: '/home/jdhunter/py4science/book'
1019
1018
1020 In [10]: cd bookdata/
1019 In [10]: cd bookdata/
1021 /home/jdhunter/py4science/book/bookdata
1020 /home/jdhunter/py4science/book/bookdata
1022
1021
1023 In [2]: from pylab import *
1022 In [2]: from pylab import *
1024
1023
1025 In [2]: ion()
1024 In [2]: ion()
1026
1025
1027 In [3]: im = imread('stinkbug.png')
1026 In [3]: im = imread('stinkbug.png')
1028
1027
1029 @savefig mystinkbug.png width=4in
1028 @savefig mystinkbug.png width=4in
1030 In [4]: imshow(im)
1029 In [4]: imshow(im)
1031 Out[4]: <matplotlib.image.AxesImage object at 0x39ea850>
1030 Out[4]: <matplotlib.image.AxesImage object at 0x39ea850>
1032
1031
1033 """,
1032 """,
1034 r"""
1033 r"""
1035
1034
1036 In [1]: x = 'hello world'
1035 In [1]: x = 'hello world'
1037
1036
1038 # string methods can be
1037 # string methods can be
1039 # used to alter the string
1038 # used to alter the string
1040 @doctest
1039 @doctest
1041 In [2]: x.upper()
1040 In [2]: x.upper()
1042 Out[2]: 'HELLO WORLD'
1041 Out[2]: 'HELLO WORLD'
1043
1042
1044 @verbatim
1043 @verbatim
1045 In [3]: x.st<TAB>
1044 In [3]: x.st<TAB>
1046 x.startswith x.strip
1045 x.startswith x.strip
1047 """,
1046 """,
1048 r"""
1047 r"""
1049
1048
1050 In [130]: url = 'http://ichart.finance.yahoo.com/table.csv?s=CROX\
1049 In [130]: url = 'http://ichart.finance.yahoo.com/table.csv?s=CROX\
1051 .....: &d=9&e=22&f=2009&g=d&a=1&br=8&c=2006&ignore=.csv'
1050 .....: &d=9&e=22&f=2009&g=d&a=1&br=8&c=2006&ignore=.csv'
1052
1051
1053 In [131]: print url.split('&')
1052 In [131]: print url.split('&')
1054 ['http://ichart.finance.yahoo.com/table.csv?s=CROX', 'd=9', 'e=22', 'f=2009', 'g=d', 'a=1', 'b=8', 'c=2006', 'ignore=.csv']
1053 ['http://ichart.finance.yahoo.com/table.csv?s=CROX', 'd=9', 'e=22', 'f=2009', 'g=d', 'a=1', 'b=8', 'c=2006', 'ignore=.csv']
1055
1054
1056 In [60]: import urllib
1055 In [60]: import urllib
1057
1056
1058 """,
1057 """,
1059 r"""\
1058 r"""\
1060
1059
1061 In [133]: import numpy.random
1060 In [133]: import numpy.random
1062
1061
1063 @suppress
1062 @suppress
1064 In [134]: numpy.random.seed(2358)
1063 In [134]: numpy.random.seed(2358)
1065
1064
1066 @doctest
1065 @doctest
1067 In [135]: numpy.random.rand(10,2)
1066 In [135]: numpy.random.rand(10,2)
1068 Out[135]:
1067 Out[135]:
1069 array([[ 0.64524308, 0.59943846],
1068 array([[ 0.64524308, 0.59943846],
1070 [ 0.47102322, 0.8715456 ],
1069 [ 0.47102322, 0.8715456 ],
1071 [ 0.29370834, 0.74776844],
1070 [ 0.29370834, 0.74776844],
1072 [ 0.99539577, 0.1313423 ],
1071 [ 0.99539577, 0.1313423 ],
1073 [ 0.16250302, 0.21103583],
1072 [ 0.16250302, 0.21103583],
1074 [ 0.81626524, 0.1312433 ],
1073 [ 0.81626524, 0.1312433 ],
1075 [ 0.67338089, 0.72302393],
1074 [ 0.67338089, 0.72302393],
1076 [ 0.7566368 , 0.07033696],
1075 [ 0.7566368 , 0.07033696],
1077 [ 0.22591016, 0.77731835],
1076 [ 0.22591016, 0.77731835],
1078 [ 0.0072729 , 0.34273127]])
1077 [ 0.0072729 , 0.34273127]])
1079
1078
1080 """,
1079 """,
1081
1080
1082 r"""
1081 r"""
1083 In [106]: print x
1082 In [106]: print x
1084 jdh
1083 jdh
1085
1084
1086 In [109]: for i in range(10):
1085 In [109]: for i in range(10):
1087 .....: print i
1086 .....: print i
1088 .....:
1087 .....:
1089 .....:
1088 .....:
1090 0
1089 0
1091 1
1090 1
1092 2
1091 2
1093 3
1092 3
1094 4
1093 4
1095 5
1094 5
1096 6
1095 6
1097 7
1096 7
1098 8
1097 8
1099 9
1098 9
1100 """,
1099 """,
1101
1100
1102 r"""
1101 r"""
1103
1102
1104 In [144]: from pylab import *
1103 In [144]: from pylab import *
1105
1104
1106 In [145]: ion()
1105 In [145]: ion()
1107
1106
1108 # use a semicolon to suppress the output
1107 # use a semicolon to suppress the output
1109 @savefig test_hist.png width=4in
1108 @savefig test_hist.png width=4in
1110 In [151]: hist(np.random.randn(10000), 100);
1109 In [151]: hist(np.random.randn(10000), 100);
1111
1110
1112
1111
1113 @savefig test_plot.png width=4in
1112 @savefig test_plot.png width=4in
1114 In [151]: plot(np.random.randn(10000), 'o');
1113 In [151]: plot(np.random.randn(10000), 'o');
1115 """,
1114 """,
1116
1115
1117 r"""
1116 r"""
1118 # use a semicolon to suppress the output
1117 # use a semicolon to suppress the output
1119 In [151]: plt.clf()
1118 In [151]: plt.clf()
1120
1119
1121 @savefig plot_simple.png width=4in
1120 @savefig plot_simple.png width=4in
1122 In [151]: plot([1,2,3])
1121 In [151]: plot([1,2,3])
1123
1122
1124 @savefig hist_simple.png width=4in
1123 @savefig hist_simple.png width=4in
1125 In [151]: hist(np.random.randn(10000), 100);
1124 In [151]: hist(np.random.randn(10000), 100);
1126
1125
1127 """,
1126 """,
1128 r"""
1127 r"""
1129 # update the current fig
1128 # update the current fig
1130 In [151]: ylabel('number')
1129 In [151]: ylabel('number')
1131
1130
1132 In [152]: title('normal distribution')
1131 In [152]: title('normal distribution')
1133
1132
1134
1133
1135 @savefig hist_with_text.png
1134 @savefig hist_with_text.png
1136 In [153]: grid(True)
1135 In [153]: grid(True)
1137
1136
1138 @doctest float
1137 @doctest float
1139 In [154]: 0.1 + 0.2
1138 In [154]: 0.1 + 0.2
1140 Out[154]: 0.3
1139 Out[154]: 0.3
1141
1140
1142 @doctest float
1141 @doctest float
1143 In [155]: np.arange(16).reshape(4,4)
1142 In [155]: np.arange(16).reshape(4,4)
1144 Out[155]:
1143 Out[155]:
1145 array([[ 0, 1, 2, 3],
1144 array([[ 0, 1, 2, 3],
1146 [ 4, 5, 6, 7],
1145 [ 4, 5, 6, 7],
1147 [ 8, 9, 10, 11],
1146 [ 8, 9, 10, 11],
1148 [12, 13, 14, 15]])
1147 [12, 13, 14, 15]])
1149
1148
1150 In [1]: x = np.arange(16, dtype=float).reshape(4,4)
1149 In [1]: x = np.arange(16, dtype=float).reshape(4,4)
1151
1150
1152 In [2]: x[0,0] = np.inf
1151 In [2]: x[0,0] = np.inf
1153
1152
1154 In [3]: x[0,1] = np.nan
1153 In [3]: x[0,1] = np.nan
1155
1154
1156 @doctest float
1155 @doctest float
1157 In [4]: x
1156 In [4]: x
1158 Out[4]:
1157 Out[4]:
1159 array([[ inf, nan, 2., 3.],
1158 array([[ inf, nan, 2., 3.],
1160 [ 4., 5., 6., 7.],
1159 [ 4., 5., 6., 7.],
1161 [ 8., 9., 10., 11.],
1160 [ 8., 9., 10., 11.],
1162 [ 12., 13., 14., 15.]])
1161 [ 12., 13., 14., 15.]])
1163
1162
1164
1163
1165 """,
1164 """,
1166 ]
1165 ]
1167 # skip local-file depending first example:
1166 # skip local-file depending first example:
1168 examples = examples[1:]
1167 examples = examples[1:]
1169
1168
1170 #ipython_directive.DEBUG = True # dbg
1169 #ipython_directive.DEBUG = True # dbg
1171 #options = dict(suppress=True) # dbg
1170 #options = dict(suppress=True) # dbg
1172 options = dict()
1171 options = dict()
1173 for example in examples:
1172 for example in examples:
1174 content = example.split('\n')
1173 content = example.split('\n')
1175 IPythonDirective('debug', arguments=None, options=options,
1174 IPythonDirective('debug', arguments=None, options=options,
1176 content=content, lineno=0,
1175 content=content, lineno=0,
1177 content_offset=None, block_text=None,
1176 content_offset=None, block_text=None,
1178 state=None, state_machine=None,
1177 state=None, state_machine=None,
1179 )
1178 )
1180
1179
1181 # Run test suite as a script
1180 # Run test suite as a script
1182 if __name__=='__main__':
1181 if __name__=='__main__':
1183 if not os.path.isdir('_static'):
1182 if not os.path.isdir('_static'):
1184 os.mkdir('_static')
1183 os.mkdir('_static')
1185 test()
1184 test()
1186 print('All OK? Check figures in _static/')
1185 print('All OK? Check figures in _static/')
@@ -1,810 +1,810 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Subclass of InteractiveShell for terminal based frontends."""
2 """Subclass of InteractiveShell for terminal based frontends."""
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 from __future__ import print_function
7 from __future__ import print_function
8
8
9 import bdb
9 import bdb
10 import os
10 import os
11 import sys
11 import sys
12
12
13 from IPython.core.error import TryNext, UsageError
13 from IPython.core.error import TryNext, UsageError
14 from IPython.core.usage import interactive_usage
14 from IPython.core.usage import interactive_usage
15 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC
15 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC
16 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
16 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
17 from IPython.core.magic import Magics, magics_class, line_magic
17 from IPython.core.magic import Magics, magics_class, line_magic
18 from IPython.lib.clipboard import ClipboardEmpty
18 from IPython.lib.clipboard import ClipboardEmpty
19 from IPython.utils.contexts import NoOpContext
19 from IPython.utils.contexts import NoOpContext
20 from IPython.utils.decorators import undoc
20 from IPython.utils.decorators import undoc
21 from IPython.utils.encoding import get_stream_enc
21 from IPython.utils.encoding import get_stream_enc
22 from IPython.utils import py3compat
22 from IPython.utils import py3compat
23 from IPython.utils.terminal import toggle_set_term_title, set_term_title
23 from IPython.utils.terminal import toggle_set_term_title, set_term_title
24 from IPython.utils.process import abbrev_cwd
24 from IPython.utils.process import abbrev_cwd
25 from warnings import warn
25 from warnings import warn
26 from logging import error
26 from logging import error
27 from IPython.utils.text import num_ini_spaces, SList, strip_email_quotes
27 from IPython.utils.text import num_ini_spaces, SList, strip_email_quotes
28 from traitlets import Integer, CBool, Unicode
28 from traitlets import Integer, CBool, Unicode
29
29
30
30
31 def get_default_editor():
31 def get_default_editor():
32 try:
32 try:
33 ed = os.environ['EDITOR']
33 ed = os.environ['EDITOR']
34 if not py3compat.PY3:
34 if not py3compat.PY3:
35 ed = ed.decode()
35 ed = ed.decode()
36 return ed
36 return ed
37 except KeyError:
37 except KeyError:
38 pass
38 pass
39 except UnicodeError:
39 except UnicodeError:
40 warn("$EDITOR environment variable is not pure ASCII. Using platform "
40 warn("$EDITOR environment variable is not pure ASCII. Using platform "
41 "default editor.")
41 "default editor.")
42
42
43 if os.name == 'posix':
43 if os.name == 'posix':
44 return 'vi' # the only one guaranteed to be there!
44 return 'vi' # the only one guaranteed to be there!
45 else:
45 else:
46 return 'notepad' # same in Windows!
46 return 'notepad' # same in Windows!
47
47
48 def get_pasted_lines(sentinel, l_input=py3compat.input, quiet=False):
48 def get_pasted_lines(sentinel, l_input=py3compat.input, quiet=False):
49 """ Yield pasted lines until the user enters the given sentinel value.
49 """ Yield pasted lines until the user enters the given sentinel value.
50 """
50 """
51 if not quiet:
51 if not quiet:
52 print("Pasting code; enter '%s' alone on the line to stop or use Ctrl-D." \
52 print("Pasting code; enter '%s' alone on the line to stop or use Ctrl-D." \
53 % sentinel)
53 % sentinel)
54 prompt = ":"
54 prompt = ":"
55 else:
55 else:
56 prompt = ""
56 prompt = ""
57 while True:
57 while True:
58 try:
58 try:
59 l = py3compat.str_to_unicode(l_input(prompt))
59 l = py3compat.str_to_unicode(l_input(prompt))
60 if l == sentinel:
60 if l == sentinel:
61 return
61 return
62 else:
62 else:
63 yield l
63 yield l
64 except EOFError:
64 except EOFError:
65 print('<EOF>')
65 print('<EOF>')
66 return
66 return
67
67
68 @undoc
68 @undoc
69 def no_op(*a, **kw): pass
69 def no_op(*a, **kw): pass
70
70
71
71
72 class ReadlineNoRecord(object):
72 class ReadlineNoRecord(object):
73 """Context manager to execute some code, then reload readline history
73 """Context manager to execute some code, then reload readline history
74 so that interactive input to the code doesn't appear when pressing up."""
74 so that interactive input to the code doesn't appear when pressing up."""
75 def __init__(self, shell):
75 def __init__(self, shell):
76 self.shell = shell
76 self.shell = shell
77 self._nested_level = 0
77 self._nested_level = 0
78
78
79 def __enter__(self):
79 def __enter__(self):
80 if self._nested_level == 0:
80 if self._nested_level == 0:
81 try:
81 try:
82 self.orig_length = self.current_length()
82 self.orig_length = self.current_length()
83 self.readline_tail = self.get_readline_tail()
83 self.readline_tail = self.get_readline_tail()
84 except (AttributeError, IndexError): # Can fail with pyreadline
84 except (AttributeError, IndexError): # Can fail with pyreadline
85 self.orig_length, self.readline_tail = 999999, []
85 self.orig_length, self.readline_tail = 999999, []
86 self._nested_level += 1
86 self._nested_level += 1
87
87
88 def __exit__(self, type, value, traceback):
88 def __exit__(self, type, value, traceback):
89 self._nested_level -= 1
89 self._nested_level -= 1
90 if self._nested_level == 0:
90 if self._nested_level == 0:
91 # Try clipping the end if it's got longer
91 # Try clipping the end if it's got longer
92 try:
92 try:
93 e = self.current_length() - self.orig_length
93 e = self.current_length() - self.orig_length
94 if e > 0:
94 if e > 0:
95 for _ in range(e):
95 for _ in range(e):
96 self.shell.readline.remove_history_item(self.orig_length)
96 self.shell.readline.remove_history_item(self.orig_length)
97
97
98 # If it still doesn't match, just reload readline history.
98 # If it still doesn't match, just reload readline history.
99 if self.current_length() != self.orig_length \
99 if self.current_length() != self.orig_length \
100 or self.get_readline_tail() != self.readline_tail:
100 or self.get_readline_tail() != self.readline_tail:
101 self.shell.refill_readline_hist()
101 self.shell.refill_readline_hist()
102 except (AttributeError, IndexError):
102 except (AttributeError, IndexError):
103 pass
103 pass
104 # Returning False will cause exceptions to propagate
104 # Returning False will cause exceptions to propagate
105 return False
105 return False
106
106
107 def current_length(self):
107 def current_length(self):
108 return self.shell.readline.get_current_history_length()
108 return self.shell.readline.get_current_history_length()
109
109
110 def get_readline_tail(self, n=10):
110 def get_readline_tail(self, n=10):
111 """Get the last n items in readline history."""
111 """Get the last n items in readline history."""
112 end = self.shell.readline.get_current_history_length() + 1
112 end = self.shell.readline.get_current_history_length() + 1
113 start = max(end-n, 1)
113 start = max(end-n, 1)
114 ghi = self.shell.readline.get_history_item
114 ghi = self.shell.readline.get_history_item
115 return [ghi(x) for x in range(start, end)]
115 return [ghi(x) for x in range(start, end)]
116
116
117
117
118 @magics_class
118 @magics_class
119 class TerminalMagics(Magics):
119 class TerminalMagics(Magics):
120 def __init__(self, shell):
120 def __init__(self, shell):
121 super(TerminalMagics, self).__init__(shell)
121 super(TerminalMagics, self).__init__(shell)
122 self.input_splitter = IPythonInputSplitter()
122 self.input_splitter = IPythonInputSplitter()
123
123
124 def store_or_execute(self, block, name):
124 def store_or_execute(self, block, name):
125 """ Execute a block, or store it in a variable, per the user's request.
125 """ Execute a block, or store it in a variable, per the user's request.
126 """
126 """
127 if name:
127 if name:
128 # If storing it for further editing
128 # If storing it for further editing
129 self.shell.user_ns[name] = SList(block.splitlines())
129 self.shell.user_ns[name] = SList(block.splitlines())
130 print("Block assigned to '%s'" % name)
130 print("Block assigned to '%s'" % name)
131 else:
131 else:
132 b = self.preclean_input(block)
132 b = self.preclean_input(block)
133 self.shell.user_ns['pasted_block'] = b
133 self.shell.user_ns['pasted_block'] = b
134 self.shell.using_paste_magics = True
134 self.shell.using_paste_magics = True
135 try:
135 try:
136 self.shell.run_cell(b)
136 self.shell.run_cell(b)
137 finally:
137 finally:
138 self.shell.using_paste_magics = False
138 self.shell.using_paste_magics = False
139
139
140 def preclean_input(self, block):
140 def preclean_input(self, block):
141 lines = block.splitlines()
141 lines = block.splitlines()
142 while lines and not lines[0].strip():
142 while lines and not lines[0].strip():
143 lines = lines[1:]
143 lines = lines[1:]
144 return strip_email_quotes('\n'.join(lines))
144 return strip_email_quotes('\n'.join(lines))
145
145
146 def rerun_pasted(self, name='pasted_block'):
146 def rerun_pasted(self, name='pasted_block'):
147 """ Rerun a previously pasted command.
147 """ Rerun a previously pasted command.
148 """
148 """
149 b = self.shell.user_ns.get(name)
149 b = self.shell.user_ns.get(name)
150
150
151 # Sanity checks
151 # Sanity checks
152 if b is None:
152 if b is None:
153 raise UsageError('No previous pasted block available')
153 raise UsageError('No previous pasted block available')
154 if not isinstance(b, py3compat.string_types):
154 if not isinstance(b, py3compat.string_types):
155 raise UsageError(
155 raise UsageError(
156 "Variable 'pasted_block' is not a string, can't execute")
156 "Variable 'pasted_block' is not a string, can't execute")
157
157
158 print("Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b)))
158 print("Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b)))
159 self.shell.run_cell(b)
159 self.shell.run_cell(b)
160
160
161 @line_magic
161 @line_magic
162 def autoindent(self, parameter_s = ''):
162 def autoindent(self, parameter_s = ''):
163 """Toggle autoindent on/off (if available)."""
163 """Toggle autoindent on/off (if available)."""
164
164
165 self.shell.set_autoindent()
165 self.shell.set_autoindent()
166 print("Automatic indentation is:",['OFF','ON'][self.shell.autoindent])
166 print("Automatic indentation is:",['OFF','ON'][self.shell.autoindent])
167
167
168 @line_magic
168 @line_magic
169 def cpaste(self, parameter_s=''):
169 def cpaste(self, parameter_s=''):
170 """Paste & execute a pre-formatted code block from clipboard.
170 """Paste & execute a pre-formatted code block from clipboard.
171
171
172 You must terminate the block with '--' (two minus-signs) or Ctrl-D
172 You must terminate the block with '--' (two minus-signs) or Ctrl-D
173 alone on the line. You can also provide your own sentinel with '%paste
173 alone on the line. You can also provide your own sentinel with '%paste
174 -s %%' ('%%' is the new sentinel for this operation).
174 -s %%' ('%%' is the new sentinel for this operation).
175
175
176 The block is dedented prior to execution to enable execution of method
176 The block is dedented prior to execution to enable execution of method
177 definitions. '>' and '+' characters at the beginning of a line are
177 definitions. '>' and '+' characters at the beginning of a line are
178 ignored, to allow pasting directly from e-mails, diff files and
178 ignored, to allow pasting directly from e-mails, diff files and
179 doctests (the '...' continuation prompt is also stripped). The
179 doctests (the '...' continuation prompt is also stripped). The
180 executed block is also assigned to variable named 'pasted_block' for
180 executed block is also assigned to variable named 'pasted_block' for
181 later editing with '%edit pasted_block'.
181 later editing with '%edit pasted_block'.
182
182
183 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
183 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
184 This assigns the pasted block to variable 'foo' as string, without
184 This assigns the pasted block to variable 'foo' as string, without
185 dedenting or executing it (preceding >>> and + is still stripped)
185 dedenting or executing it (preceding >>> and + is still stripped)
186
186
187 '%cpaste -r' re-executes the block previously entered by cpaste.
187 '%cpaste -r' re-executes the block previously entered by cpaste.
188 '%cpaste -q' suppresses any additional output messages.
188 '%cpaste -q' suppresses any additional output messages.
189
189
190 Do not be alarmed by garbled output on Windows (it's a readline bug).
190 Do not be alarmed by garbled output on Windows (it's a readline bug).
191 Just press enter and type -- (and press enter again) and the block
191 Just press enter and type -- (and press enter again) and the block
192 will be what was just pasted.
192 will be what was just pasted.
193
193
194 IPython statements (magics, shell escapes) are not supported (yet).
194 IPython statements (magics, shell escapes) are not supported (yet).
195
195
196 See also
196 See also
197 --------
197 --------
198 paste: automatically pull code from clipboard.
198 paste: automatically pull code from clipboard.
199
199
200 Examples
200 Examples
201 --------
201 --------
202 ::
202 ::
203
203
204 In [8]: %cpaste
204 In [8]: %cpaste
205 Pasting code; enter '--' alone on the line to stop.
205 Pasting code; enter '--' alone on the line to stop.
206 :>>> a = ["world!", "Hello"]
206 :>>> a = ["world!", "Hello"]
207 :>>> print " ".join(sorted(a))
207 :>>> print " ".join(sorted(a))
208 :--
208 :--
209 Hello world!
209 Hello world!
210 """
210 """
211 opts, name = self.parse_options(parameter_s, 'rqs:', mode='string')
211 opts, name = self.parse_options(parameter_s, 'rqs:', mode='string')
212 if 'r' in opts:
212 if 'r' in opts:
213 self.rerun_pasted()
213 self.rerun_pasted()
214 return
214 return
215
215
216 quiet = ('q' in opts)
216 quiet = ('q' in opts)
217
217
218 sentinel = opts.get('s', u'--')
218 sentinel = opts.get('s', u'--')
219 block = '\n'.join(get_pasted_lines(sentinel, quiet=quiet))
219 block = '\n'.join(get_pasted_lines(sentinel, quiet=quiet))
220 self.store_or_execute(block, name)
220 self.store_or_execute(block, name)
221
221
222 @line_magic
222 @line_magic
223 def paste(self, parameter_s=''):
223 def paste(self, parameter_s=''):
224 """Paste & execute a pre-formatted code block from clipboard.
224 """Paste & execute a pre-formatted code block from clipboard.
225
225
226 The text is pulled directly from the clipboard without user
226 The text is pulled directly from the clipboard without user
227 intervention and printed back on the screen before execution (unless
227 intervention and printed back on the screen before execution (unless
228 the -q flag is given to force quiet mode).
228 the -q flag is given to force quiet mode).
229
229
230 The block is dedented prior to execution to enable execution of method
230 The block is dedented prior to execution to enable execution of method
231 definitions. '>' and '+' characters at the beginning of a line are
231 definitions. '>' and '+' characters at the beginning of a line are
232 ignored, to allow pasting directly from e-mails, diff files and
232 ignored, to allow pasting directly from e-mails, diff files and
233 doctests (the '...' continuation prompt is also stripped). The
233 doctests (the '...' continuation prompt is also stripped). The
234 executed block is also assigned to variable named 'pasted_block' for
234 executed block is also assigned to variable named 'pasted_block' for
235 later editing with '%edit pasted_block'.
235 later editing with '%edit pasted_block'.
236
236
237 You can also pass a variable name as an argument, e.g. '%paste foo'.
237 You can also pass a variable name as an argument, e.g. '%paste foo'.
238 This assigns the pasted block to variable 'foo' as string, without
238 This assigns the pasted block to variable 'foo' as string, without
239 executing it (preceding >>> and + is still stripped).
239 executing it (preceding >>> and + is still stripped).
240
240
241 Options:
241 Options:
242
242
243 -r: re-executes the block previously entered by cpaste.
243 -r: re-executes the block previously entered by cpaste.
244
244
245 -q: quiet mode: do not echo the pasted text back to the terminal.
245 -q: quiet mode: do not echo the pasted text back to the terminal.
246
246
247 IPython statements (magics, shell escapes) are not supported (yet).
247 IPython statements (magics, shell escapes) are not supported (yet).
248
248
249 See also
249 See also
250 --------
250 --------
251 cpaste: manually paste code into terminal until you mark its end.
251 cpaste: manually paste code into terminal until you mark its end.
252 """
252 """
253 opts, name = self.parse_options(parameter_s, 'rq', mode='string')
253 opts, name = self.parse_options(parameter_s, 'rq', mode='string')
254 if 'r' in opts:
254 if 'r' in opts:
255 self.rerun_pasted()
255 self.rerun_pasted()
256 return
256 return
257 try:
257 try:
258 block = self.shell.hooks.clipboard_get()
258 block = self.shell.hooks.clipboard_get()
259 except TryNext as clipboard_exc:
259 except TryNext as clipboard_exc:
260 message = getattr(clipboard_exc, 'args')
260 message = getattr(clipboard_exc, 'args')
261 if message:
261 if message:
262 error(message[0])
262 error(message[0])
263 else:
263 else:
264 error('Could not get text from the clipboard.')
264 error('Could not get text from the clipboard.')
265 return
265 return
266 except ClipboardEmpty:
266 except ClipboardEmpty:
267 raise UsageError("The clipboard appears to be empty")
267 raise UsageError("The clipboard appears to be empty")
268
268
269 # By default, echo back to terminal unless quiet mode is requested
269 # By default, echo back to terminal unless quiet mode is requested
270 if 'q' not in opts:
270 if 'q' not in opts:
271 write = self.shell.write
271 write = self.shell.write
272 write(self.shell.pycolorize(block))
272 write(self.shell.pycolorize(block))
273 if not block.endswith('\n'):
273 if not block.endswith('\n'):
274 write('\n')
274 write('\n')
275 write("## -- End pasted text --\n")
275 write("## -- End pasted text --\n")
276
276
277 self.store_or_execute(block, name)
277 self.store_or_execute(block, name)
278
278
279 # Class-level: add a '%cls' magic only on Windows
279 # Class-level: add a '%cls' magic only on Windows
280 if sys.platform == 'win32':
280 if sys.platform == 'win32':
281 @line_magic
281 @line_magic
282 def cls(self, s):
282 def cls(self, s):
283 """Clear screen.
283 """Clear screen.
284 """
284 """
285 os.system("cls")
285 os.system("cls")
286
286
287
287
288 class TerminalInteractiveShell(InteractiveShell):
288 class TerminalInteractiveShell(InteractiveShell):
289
289
290 autoedit_syntax = CBool(False, config=True,
290 autoedit_syntax = CBool(False, config=True,
291 help="auto editing of files with syntax errors.")
291 help="auto editing of files with syntax errors.")
292 confirm_exit = CBool(True, config=True,
292 confirm_exit = CBool(True, config=True,
293 help="""
293 help="""
294 Set to confirm when you try to exit IPython with an EOF (Control-D
294 Set to confirm when you try to exit IPython with an EOF (Control-D
295 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
295 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
296 you can force a direct exit without any confirmation.""",
296 you can force a direct exit without any confirmation.""",
297 )
297 )
298 # This display_banner only controls whether or not self.show_banner()
298 # This display_banner only controls whether or not self.show_banner()
299 # is called when mainloop/interact are called. The default is False
299 # is called when mainloop/interact are called. The default is False
300 # because for the terminal based application, the banner behavior
300 # because for the terminal based application, the banner behavior
301 # is controlled by the application.
301 # is controlled by the application.
302 display_banner = CBool(False) # This isn't configurable!
302 display_banner = CBool(False) # This isn't configurable!
303 embedded = CBool(False)
303 embedded = CBool(False)
304 embedded_active = CBool(False)
304 embedded_active = CBool(False)
305 editor = Unicode(get_default_editor(), config=True,
305 editor = Unicode(get_default_editor(), config=True,
306 help="Set the editor used by IPython (default to $EDITOR/vi/notepad)."
306 help="Set the editor used by IPython (default to $EDITOR/vi/notepad)."
307 )
307 )
308 pager = Unicode('less', config=True,
308 pager = Unicode('less', config=True,
309 help="The shell program to be used for paging.")
309 help="The shell program to be used for paging.")
310
310
311 screen_length = Integer(0, config=True,
311 screen_length = Integer(0, config=True,
312 help=
312 help=
313 """Number of lines of your screen, used to control printing of very
313 """Number of lines of your screen, used to control printing of very
314 long strings. Strings longer than this number of lines will be sent
314 long strings. Strings longer than this number of lines will be sent
315 through a pager instead of directly printed. The default value for
315 through a pager instead of directly printed. The default value for
316 this is 0, which means IPython will auto-detect your screen size every
316 this is 0, which means IPython will auto-detect your screen size every
317 time it needs to print certain potentially long strings (this doesn't
317 time it needs to print certain potentially long strings (this doesn't
318 change the behavior of the 'print' keyword, it's only triggered
318 change the behavior of the 'print' keyword, it's only triggered
319 internally). If for some reason this isn't working well (it needs
319 internally). If for some reason this isn't working well (it needs
320 curses support), specify it yourself. Otherwise don't change the
320 curses support), specify it yourself. Otherwise don't change the
321 default.""",
321 default.""",
322 )
322 )
323 term_title = CBool(False, config=True,
323 term_title = CBool(False, config=True,
324 help="Enable auto setting the terminal title."
324 help="Enable auto setting the terminal title."
325 )
325 )
326 usage = Unicode(interactive_usage)
326 usage = Unicode(interactive_usage)
327
327
328 # This `using_paste_magics` is used to detect whether the code is being
328 # This `using_paste_magics` is used to detect whether the code is being
329 # executed via paste magics functions
329 # executed via paste magics functions
330 using_paste_magics = CBool(False)
330 using_paste_magics = CBool(False)
331
331
332 # In the terminal, GUI control is done via PyOS_InputHook
332 # In the terminal, GUI control is done via PyOS_InputHook
333 @staticmethod
333 @staticmethod
334 def enable_gui(gui=None, app=None):
334 def enable_gui(gui=None, app=None):
335 """Switch amongst GUI input hooks by name.
335 """Switch amongst GUI input hooks by name.
336 """
336 """
337 # Deferred import
337 # Deferred import
338 from IPython.lib.inputhook import enable_gui as real_enable_gui
338 from IPython.lib.inputhook import enable_gui as real_enable_gui
339 try:
339 try:
340 return real_enable_gui(gui, app)
340 return real_enable_gui(gui, app)
341 except ValueError as e:
341 except ValueError as e:
342 raise UsageError("%s" % e)
342 raise UsageError("%s" % e)
343
343
344 system = InteractiveShell.system_raw
344 system = InteractiveShell.system_raw
345
345
346 #-------------------------------------------------------------------------
346 #-------------------------------------------------------------------------
347 # Overrides of init stages
347 # Overrides of init stages
348 #-------------------------------------------------------------------------
348 #-------------------------------------------------------------------------
349
349
350 def init_display_formatter(self):
350 def init_display_formatter(self):
351 super(TerminalInteractiveShell, self).init_display_formatter()
351 super(TerminalInteractiveShell, self).init_display_formatter()
352 # terminal only supports plaintext
352 # terminal only supports plaintext
353 self.display_formatter.active_types = ['text/plain']
353 self.display_formatter.active_types = ['text/plain']
354
354
355 #-------------------------------------------------------------------------
355 #-------------------------------------------------------------------------
356 # Things related to readline
356 # Things related to readline
357 #-------------------------------------------------------------------------
357 #-------------------------------------------------------------------------
358
358
359 def init_readline(self):
359 def init_readline(self):
360 """Command history completion/saving/reloading."""
360 """Command history completion/saving/reloading."""
361
361
362 if self.readline_use:
362 if self.readline_use:
363 import IPython.utils.rlineimpl as readline
363 import IPython.utils.rlineimpl as readline
364
364
365 self.rl_next_input = None
365 self.rl_next_input = None
366 self.rl_do_indent = False
366 self.rl_do_indent = False
367
367
368 if not self.readline_use or not readline.have_readline:
368 if not self.readline_use or not readline.have_readline:
369 self.readline = None
369 self.readline = None
370 # Set a number of methods that depend on readline to be no-op
370 # Set a number of methods that depend on readline to be no-op
371 self.readline_no_record = NoOpContext()
371 self.readline_no_record = NoOpContext()
372 self.set_readline_completer = no_op
372 self.set_readline_completer = no_op
373 self.set_custom_completer = no_op
373 self.set_custom_completer = no_op
374 if self.readline_use:
374 if self.readline_use:
375 warn('Readline services not available or not loaded.')
375 warn('Readline services not available or not loaded.')
376 else:
376 else:
377 self.has_readline = True
377 self.has_readline = True
378 self.readline = readline
378 self.readline = readline
379 sys.modules['readline'] = readline
379 sys.modules['readline'] = readline
380
380
381 # Platform-specific configuration
381 # Platform-specific configuration
382 if os.name == 'nt':
382 if os.name == 'nt':
383 # FIXME - check with Frederick to see if we can harmonize
383 # FIXME - check with Frederick to see if we can harmonize
384 # naming conventions with pyreadline to avoid this
384 # naming conventions with pyreadline to avoid this
385 # platform-dependent check
385 # platform-dependent check
386 self.readline_startup_hook = readline.set_pre_input_hook
386 self.readline_startup_hook = readline.set_pre_input_hook
387 else:
387 else:
388 self.readline_startup_hook = readline.set_startup_hook
388 self.readline_startup_hook = readline.set_startup_hook
389
389
390 # Readline config order:
390 # Readline config order:
391 # - IPython config (default value)
391 # - IPython config (default value)
392 # - custom inputrc
392 # - custom inputrc
393 # - IPython config (user customized)
393 # - IPython config (user customized)
394
394
395 # load IPython config before inputrc if default
395 # load IPython config before inputrc if default
396 # skip if libedit because parse_and_bind syntax is different
396 # skip if libedit because parse_and_bind syntax is different
397 if not self._custom_readline_config and not readline.uses_libedit:
397 if not self._custom_readline_config and not readline.uses_libedit:
398 for rlcommand in self.readline_parse_and_bind:
398 for rlcommand in self.readline_parse_and_bind:
399 readline.parse_and_bind(rlcommand)
399 readline.parse_and_bind(rlcommand)
400
400
401 # Load user's initrc file (readline config)
401 # Load user's initrc file (readline config)
402 # Or if libedit is used, load editrc.
402 # Or if libedit is used, load editrc.
403 inputrc_name = os.environ.get('INPUTRC')
403 inputrc_name = os.environ.get('INPUTRC')
404 if inputrc_name is None:
404 if inputrc_name is None:
405 inputrc_name = '.inputrc'
405 inputrc_name = '.inputrc'
406 if readline.uses_libedit:
406 if readline.uses_libedit:
407 inputrc_name = '.editrc'
407 inputrc_name = '.editrc'
408 inputrc_name = os.path.join(self.home_dir, inputrc_name)
408 inputrc_name = os.path.join(self.home_dir, inputrc_name)
409 if os.path.isfile(inputrc_name):
409 if os.path.isfile(inputrc_name):
410 try:
410 try:
411 readline.read_init_file(inputrc_name)
411 readline.read_init_file(inputrc_name)
412 except:
412 except:
413 warn('Problems reading readline initialization file <%s>'
413 warn('Problems reading readline initialization file <%s>'
414 % inputrc_name)
414 % inputrc_name)
415
415
416 # load IPython config after inputrc if user has customized
416 # load IPython config after inputrc if user has customized
417 if self._custom_readline_config:
417 if self._custom_readline_config:
418 for rlcommand in self.readline_parse_and_bind:
418 for rlcommand in self.readline_parse_and_bind:
419 readline.parse_and_bind(rlcommand)
419 readline.parse_and_bind(rlcommand)
420
420
421 # Remove some chars from the delimiters list. If we encounter
421 # Remove some chars from the delimiters list. If we encounter
422 # unicode chars, discard them.
422 # unicode chars, discard them.
423 delims = readline.get_completer_delims()
423 delims = readline.get_completer_delims()
424 if not py3compat.PY3:
424 if not py3compat.PY3:
425 delims = delims.encode("ascii", "ignore")
425 delims = delims.encode("ascii", "ignore")
426 for d in self.readline_remove_delims:
426 for d in self.readline_remove_delims:
427 delims = delims.replace(d, "")
427 delims = delims.replace(d, "")
428 delims = delims.replace(ESC_MAGIC, '')
428 delims = delims.replace(ESC_MAGIC, '')
429 readline.set_completer_delims(delims)
429 readline.set_completer_delims(delims)
430 # Store these so we can restore them if something like rpy2 modifies
430 # Store these so we can restore them if something like rpy2 modifies
431 # them.
431 # them.
432 self.readline_delims = delims
432 self.readline_delims = delims
433 # otherwise we end up with a monster history after a while:
433 # otherwise we end up with a monster history after a while:
434 readline.set_history_length(self.history_length)
434 readline.set_history_length(self.history_length)
435
435
436 self.refill_readline_hist()
436 self.refill_readline_hist()
437 self.readline_no_record = ReadlineNoRecord(self)
437 self.readline_no_record = ReadlineNoRecord(self)
438
438
439 # Configure auto-indent for all platforms
439 # Configure auto-indent for all platforms
440 self.set_autoindent(self.autoindent)
440 self.set_autoindent(self.autoindent)
441
441
442 def init_completer(self):
442 def init_completer(self):
443 super(TerminalInteractiveShell, self).init_completer()
443 super(TerminalInteractiveShell, self).init_completer()
444
444
445 # Only configure readline if we truly are using readline.
445 # Only configure readline if we truly are using readline.
446 if self.has_readline:
446 if self.has_readline:
447 self.set_readline_completer()
447 self.set_readline_completer()
448
448
449 def set_readline_completer(self):
449 def set_readline_completer(self):
450 """Reset readline's completer to be our own."""
450 """Reset readline's completer to be our own."""
451 self.readline.set_completer(self.Completer.rlcomplete)
451 self.readline.set_completer(self.Completer.rlcomplete)
452
452
453
453
454 def pre_readline(self):
454 def pre_readline(self):
455 """readline hook to be used at the start of each line.
455 """readline hook to be used at the start of each line.
456
456
457 It handles auto-indent and text from set_next_input."""
457 It handles auto-indent and text from set_next_input."""
458
458
459 if self.rl_do_indent:
459 if self.rl_do_indent:
460 self.readline.insert_text(self._indent_current_str())
460 self.readline.insert_text(self._indent_current_str())
461 if self.rl_next_input is not None:
461 if self.rl_next_input is not None:
462 self.readline.insert_text(self.rl_next_input)
462 self.readline.insert_text(self.rl_next_input)
463 self.rl_next_input = None
463 self.rl_next_input = None
464
464
465 def refill_readline_hist(self):
465 def refill_readline_hist(self):
466 # Load the last 1000 lines from history
466 # Load the last 1000 lines from history
467 self.readline.clear_history()
467 self.readline.clear_history()
468 stdin_encoding = sys.stdin.encoding or "utf-8"
468 stdin_encoding = sys.stdin.encoding or "utf-8"
469 last_cell = u""
469 last_cell = u""
470 for _, _, cell in self.history_manager.get_tail(self.history_load_length,
470 for _, _, cell in self.history_manager.get_tail(self.history_load_length,
471 include_latest=True):
471 include_latest=True):
472 # Ignore blank lines and consecutive duplicates
472 # Ignore blank lines and consecutive duplicates
473 cell = cell.rstrip()
473 cell = cell.rstrip()
474 if cell and (cell != last_cell):
474 if cell and (cell != last_cell):
475 try:
475 try:
476 if self.multiline_history:
476 if self.multiline_history:
477 self.readline.add_history(py3compat.unicode_to_str(cell,
477 self.readline.add_history(py3compat.unicode_to_str(cell,
478 stdin_encoding))
478 stdin_encoding))
479 else:
479 else:
480 for line in cell.splitlines():
480 for line in cell.splitlines():
481 self.readline.add_history(py3compat.unicode_to_str(line,
481 self.readline.add_history(py3compat.unicode_to_str(line,
482 stdin_encoding))
482 stdin_encoding))
483 last_cell = cell
483 last_cell = cell
484
484
485 except (TypeError, ValueError) as e:
485 except (TypeError, ValueError) as e:
486 # The history DB can get corrupted so it returns strings
486 # The history DB can get corrupted so it returns strings
487 # containing null bytes, which readline objects to.
487 # containing null bytes, which readline objects to.
488 warn(("Failed to add string to readline history.\n"
488 warn(("Failed to add string to readline history.\n"
489 "Error: {}\n"
489 "Error: {}\n"
490 "Cell: {!r}").format(e, cell))
490 "Cell: {!r}").format(e, cell))
491
491
492 #-------------------------------------------------------------------------
492 #-------------------------------------------------------------------------
493 # Things related to the terminal
493 # Things related to the terminal
494 #-------------------------------------------------------------------------
494 #-------------------------------------------------------------------------
495
495
496 @property
496 @property
497 def usable_screen_length(self):
497 def usable_screen_length(self):
498 if self.screen_length == 0:
498 if self.screen_length == 0:
499 return 0
499 return 0
500 else:
500 else:
501 num_lines_bot = self.separate_in.count('\n')+1
501 num_lines_bot = self.separate_in.count('\n')+1
502 return self.screen_length - num_lines_bot
502 return self.screen_length - num_lines_bot
503
503
504 def _term_title_changed(self, name, new_value):
504 def _term_title_changed(self, name, new_value):
505 self.init_term_title()
505 self.init_term_title()
506
506
507 def init_term_title(self):
507 def init_term_title(self):
508 # Enable or disable the terminal title.
508 # Enable or disable the terminal title.
509 if self.term_title:
509 if self.term_title:
510 toggle_set_term_title(True)
510 toggle_set_term_title(True)
511 set_term_title('IPython: ' + abbrev_cwd())
511 set_term_title('IPython: ' + abbrev_cwd())
512 else:
512 else:
513 toggle_set_term_title(False)
513 toggle_set_term_title(False)
514
514
515 #-------------------------------------------------------------------------
515 #-------------------------------------------------------------------------
516 # Things related to aliases
516 # Things related to aliases
517 #-------------------------------------------------------------------------
517 #-------------------------------------------------------------------------
518
518
519 def init_alias(self):
519 def init_alias(self):
520 # The parent class defines aliases that can be safely used with any
520 # The parent class defines aliases that can be safely used with any
521 # frontend.
521 # frontend.
522 super(TerminalInteractiveShell, self).init_alias()
522 super(TerminalInteractiveShell, self).init_alias()
523
523
524 # Now define aliases that only make sense on the terminal, because they
524 # Now define aliases that only make sense on the terminal, because they
525 # need direct access to the console in a way that we can't emulate in
525 # need direct access to the console in a way that we can't emulate in
526 # GUI or web frontend
526 # GUI or web frontend
527 if os.name == 'posix':
527 if os.name == 'posix':
528 aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
528 aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
529 ('man', 'man')]
529 ('man', 'man')]
530 else :
530 else :
531 aliases = []
531 aliases = []
532
532
533 for name, cmd in aliases:
533 for name, cmd in aliases:
534 self.alias_manager.soft_define_alias(name, cmd)
534 self.alias_manager.soft_define_alias(name, cmd)
535
535
536 #-------------------------------------------------------------------------
536 #-------------------------------------------------------------------------
537 # Mainloop and code execution logic
537 # Mainloop and code execution logic
538 #-------------------------------------------------------------------------
538 #-------------------------------------------------------------------------
539
539
540 def mainloop(self, display_banner=None):
540 def mainloop(self, display_banner=None):
541 """Start the mainloop.
541 """Start the mainloop.
542
542
543 If an optional banner argument is given, it will override the
543 If an optional banner argument is given, it will override the
544 internally created default banner.
544 internally created default banner.
545 """
545 """
546
546
547 with self.builtin_trap, self.display_trap:
547 with self.builtin_trap, self.display_trap:
548
548
549 while 1:
549 while 1:
550 try:
550 try:
551 self.interact(display_banner=display_banner)
551 self.interact(display_banner=display_banner)
552 #self.interact_with_readline()
552 #self.interact_with_readline()
553 # XXX for testing of a readline-decoupled repl loop, call
553 # XXX for testing of a readline-decoupled repl loop, call
554 # interact_with_readline above
554 # interact_with_readline above
555 break
555 break
556 except KeyboardInterrupt:
556 except KeyboardInterrupt:
557 # this should not be necessary, but KeyboardInterrupt
557 # this should not be necessary, but KeyboardInterrupt
558 # handling seems rather unpredictable...
558 # handling seems rather unpredictable...
559 self.write("\nKeyboardInterrupt in interact()\n")
559 self.write("\nKeyboardInterrupt in interact()\n")
560
560
561 def _replace_rlhist_multiline(self, source_raw, hlen_before_cell):
561 def _replace_rlhist_multiline(self, source_raw, hlen_before_cell):
562 """Store multiple lines as a single entry in history"""
562 """Store multiple lines as a single entry in history"""
563
563
564 # do nothing without readline or disabled multiline
564 # do nothing without readline or disabled multiline
565 if not self.has_readline or not self.multiline_history:
565 if not self.has_readline or not self.multiline_history:
566 return hlen_before_cell
566 return hlen_before_cell
567
567
568 # windows rl has no remove_history_item
568 # windows rl has no remove_history_item
569 if not hasattr(self.readline, "remove_history_item"):
569 if not hasattr(self.readline, "remove_history_item"):
570 return hlen_before_cell
570 return hlen_before_cell
571
571
572 # skip empty cells
572 # skip empty cells
573 if not source_raw.rstrip():
573 if not source_raw.rstrip():
574 return hlen_before_cell
574 return hlen_before_cell
575
575
576 # nothing changed do nothing, e.g. when rl removes consecutive dups
576 # nothing changed do nothing, e.g. when rl removes consecutive dups
577 hlen = self.readline.get_current_history_length()
577 hlen = self.readline.get_current_history_length()
578 if hlen == hlen_before_cell:
578 if hlen == hlen_before_cell:
579 return hlen_before_cell
579 return hlen_before_cell
580
580
581 for i in range(hlen - hlen_before_cell):
581 for i in range(hlen - hlen_before_cell):
582 self.readline.remove_history_item(hlen - i - 1)
582 self.readline.remove_history_item(hlen - i - 1)
583 stdin_encoding = get_stream_enc(sys.stdin, 'utf-8')
583 stdin_encoding = get_stream_enc(sys.stdin, 'utf-8')
584 self.readline.add_history(py3compat.unicode_to_str(source_raw.rstrip(),
584 self.readline.add_history(py3compat.unicode_to_str(source_raw.rstrip(),
585 stdin_encoding))
585 stdin_encoding))
586 return self.readline.get_current_history_length()
586 return self.readline.get_current_history_length()
587
587
588 def interact(self, display_banner=None):
588 def interact(self, display_banner=None):
589 """Closely emulate the interactive Python console."""
589 """Closely emulate the interactive Python console."""
590
590
591 # batch run -> do not interact
591 # batch run -> do not interact
592 if self.exit_now:
592 if self.exit_now:
593 return
593 return
594
594
595 if display_banner is None:
595 if display_banner is None:
596 display_banner = self.display_banner
596 display_banner = self.display_banner
597
597
598 if isinstance(display_banner, py3compat.string_types):
598 if isinstance(display_banner, py3compat.string_types):
599 self.show_banner(display_banner)
599 self.show_banner(display_banner)
600 elif display_banner:
600 elif display_banner:
601 self.show_banner()
601 self.show_banner()
602
602
603 more = False
603 more = False
604
604
605 if self.has_readline:
605 if self.has_readline:
606 self.readline_startup_hook(self.pre_readline)
606 self.readline_startup_hook(self.pre_readline)
607 hlen_b4_cell = self.readline.get_current_history_length()
607 hlen_b4_cell = self.readline.get_current_history_length()
608 else:
608 else:
609 hlen_b4_cell = 0
609 hlen_b4_cell = 0
610 # exit_now is set by a call to %Exit or %Quit, through the
610 # exit_now is set by a call to %Exit or %Quit, through the
611 # ask_exit callback.
611 # ask_exit callback.
612
612
613 while not self.exit_now:
613 while not self.exit_now:
614 self.hooks.pre_prompt_hook()
614 self.hooks.pre_prompt_hook()
615 if more:
615 if more:
616 try:
616 try:
617 prompt = self.prompt_manager.render('in2')
617 prompt = ' ...: '
618 except:
618 except:
619 self.showtraceback()
619 self.showtraceback()
620 if self.autoindent:
620 if self.autoindent:
621 self.rl_do_indent = True
621 self.rl_do_indent = True
622
622
623 else:
623 else:
624 try:
624 try:
625 prompt = self.separate_in + self.prompt_manager.render('in')
625 prompt = self.separate_in + 'In [{}]: '.format(self.execution_count)
626 except:
626 except:
627 self.showtraceback()
627 self.showtraceback()
628 try:
628 try:
629 line = self.raw_input(prompt)
629 line = self.raw_input(prompt)
630 if self.exit_now:
630 if self.exit_now:
631 # quick exit on sys.std[in|out] close
631 # quick exit on sys.std[in|out] close
632 break
632 break
633 if self.autoindent:
633 if self.autoindent:
634 self.rl_do_indent = False
634 self.rl_do_indent = False
635
635
636 except KeyboardInterrupt:
636 except KeyboardInterrupt:
637 #double-guard against keyboardinterrupts during kbdint handling
637 #double-guard against keyboardinterrupts during kbdint handling
638 try:
638 try:
639 self.write('\n' + self.get_exception_only())
639 self.write('\n' + self.get_exception_only())
640 source_raw = self.input_splitter.raw_reset()
640 source_raw = self.input_splitter.raw_reset()
641 hlen_b4_cell = \
641 hlen_b4_cell = \
642 self._replace_rlhist_multiline(source_raw, hlen_b4_cell)
642 self._replace_rlhist_multiline(source_raw, hlen_b4_cell)
643 more = False
643 more = False
644 except KeyboardInterrupt:
644 except KeyboardInterrupt:
645 pass
645 pass
646 except EOFError:
646 except EOFError:
647 if self.autoindent:
647 if self.autoindent:
648 self.rl_do_indent = False
648 self.rl_do_indent = False
649 if self.has_readline:
649 if self.has_readline:
650 self.readline_startup_hook(None)
650 self.readline_startup_hook(None)
651 self.write('\n')
651 self.write('\n')
652 self.exit()
652 self.exit()
653 except bdb.BdbQuit:
653 except bdb.BdbQuit:
654 warn('The Python debugger has exited with a BdbQuit exception.\n'
654 warn('The Python debugger has exited with a BdbQuit exception.\n'
655 'Because of how pdb handles the stack, it is impossible\n'
655 'Because of how pdb handles the stack, it is impossible\n'
656 'for IPython to properly format this particular exception.\n'
656 'for IPython to properly format this particular exception.\n'
657 'IPython will resume normal operation.')
657 'IPython will resume normal operation.')
658 except:
658 except:
659 # exceptions here are VERY RARE, but they can be triggered
659 # exceptions here are VERY RARE, but they can be triggered
660 # asynchronously by signal handlers, for example.
660 # asynchronously by signal handlers, for example.
661 self.showtraceback()
661 self.showtraceback()
662 else:
662 else:
663 try:
663 try:
664 self.input_splitter.push(line)
664 self.input_splitter.push(line)
665 more = self.input_splitter.push_accepts_more()
665 more = self.input_splitter.push_accepts_more()
666 except SyntaxError:
666 except SyntaxError:
667 # Run the code directly - run_cell takes care of displaying
667 # Run the code directly - run_cell takes care of displaying
668 # the exception.
668 # the exception.
669 more = False
669 more = False
670 if (self.SyntaxTB.last_syntax_error and
670 if (self.SyntaxTB.last_syntax_error and
671 self.autoedit_syntax):
671 self.autoedit_syntax):
672 self.edit_syntax_error()
672 self.edit_syntax_error()
673 if not more:
673 if not more:
674 source_raw = self.input_splitter.raw_reset()
674 source_raw = self.input_splitter.raw_reset()
675 self.run_cell(source_raw, store_history=True)
675 self.run_cell(source_raw, store_history=True)
676 hlen_b4_cell = \
676 hlen_b4_cell = \
677 self._replace_rlhist_multiline(source_raw, hlen_b4_cell)
677 self._replace_rlhist_multiline(source_raw, hlen_b4_cell)
678
678
679 # Turn off the exit flag, so the mainloop can be restarted if desired
679 # Turn off the exit flag, so the mainloop can be restarted if desired
680 self.exit_now = False
680 self.exit_now = False
681
681
682 def raw_input(self, prompt=''):
682 def raw_input(self, prompt=''):
683 """Write a prompt and read a line.
683 """Write a prompt and read a line.
684
684
685 The returned line does not include the trailing newline.
685 The returned line does not include the trailing newline.
686 When the user enters the EOF key sequence, EOFError is raised.
686 When the user enters the EOF key sequence, EOFError is raised.
687
687
688 Parameters
688 Parameters
689 ----------
689 ----------
690
690
691 prompt : str, optional
691 prompt : str, optional
692 A string to be printed to prompt the user.
692 A string to be printed to prompt the user.
693 """
693 """
694 # raw_input expects str, but we pass it unicode sometimes
694 # raw_input expects str, but we pass it unicode sometimes
695 prompt = py3compat.cast_bytes_py2(prompt)
695 prompt = py3compat.cast_bytes_py2(prompt)
696
696
697 try:
697 try:
698 line = py3compat.cast_unicode_py2(self.raw_input_original(prompt))
698 line = py3compat.cast_unicode_py2(self.raw_input_original(prompt))
699 except ValueError:
699 except ValueError:
700 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
700 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
701 " or sys.stdout.close()!\nExiting IPython!\n")
701 " or sys.stdout.close()!\nExiting IPython!\n")
702 self.ask_exit()
702 self.ask_exit()
703 return ""
703 return ""
704
704
705 # Try to be reasonably smart about not re-indenting pasted input more
705 # Try to be reasonably smart about not re-indenting pasted input more
706 # than necessary. We do this by trimming out the auto-indent initial
706 # than necessary. We do this by trimming out the auto-indent initial
707 # spaces, if the user's actual input started itself with whitespace.
707 # spaces, if the user's actual input started itself with whitespace.
708 if self.autoindent:
708 if self.autoindent:
709 if num_ini_spaces(line) > self.indent_current_nsp:
709 if num_ini_spaces(line) > self.indent_current_nsp:
710 line = line[self.indent_current_nsp:]
710 line = line[self.indent_current_nsp:]
711 self.indent_current_nsp = 0
711 self.indent_current_nsp = 0
712
712
713 return line
713 return line
714
714
715 #-------------------------------------------------------------------------
715 #-------------------------------------------------------------------------
716 # Methods to support auto-editing of SyntaxErrors.
716 # Methods to support auto-editing of SyntaxErrors.
717 #-------------------------------------------------------------------------
717 #-------------------------------------------------------------------------
718
718
719 def edit_syntax_error(self):
719 def edit_syntax_error(self):
720 """The bottom half of the syntax error handler called in the main loop.
720 """The bottom half of the syntax error handler called in the main loop.
721
721
722 Loop until syntax error is fixed or user cancels.
722 Loop until syntax error is fixed or user cancels.
723 """
723 """
724
724
725 while self.SyntaxTB.last_syntax_error:
725 while self.SyntaxTB.last_syntax_error:
726 # copy and clear last_syntax_error
726 # copy and clear last_syntax_error
727 err = self.SyntaxTB.clear_err_state()
727 err = self.SyntaxTB.clear_err_state()
728 if not self._should_recompile(err):
728 if not self._should_recompile(err):
729 return
729 return
730 try:
730 try:
731 # may set last_syntax_error again if a SyntaxError is raised
731 # may set last_syntax_error again if a SyntaxError is raised
732 self.safe_execfile(err.filename,self.user_ns)
732 self.safe_execfile(err.filename,self.user_ns)
733 except:
733 except:
734 self.showtraceback()
734 self.showtraceback()
735 else:
735 else:
736 try:
736 try:
737 f = open(err.filename)
737 f = open(err.filename)
738 try:
738 try:
739 # This should be inside a display_trap block and I
739 # This should be inside a display_trap block and I
740 # think it is.
740 # think it is.
741 sys.displayhook(f.read())
741 sys.displayhook(f.read())
742 finally:
742 finally:
743 f.close()
743 f.close()
744 except:
744 except:
745 self.showtraceback()
745 self.showtraceback()
746
746
747 def _should_recompile(self,e):
747 def _should_recompile(self,e):
748 """Utility routine for edit_syntax_error"""
748 """Utility routine for edit_syntax_error"""
749
749
750 if e.filename in ('<ipython console>','<input>','<string>',
750 if e.filename in ('<ipython console>','<input>','<string>',
751 '<console>','<BackgroundJob compilation>',
751 '<console>','<BackgroundJob compilation>',
752 None):
752 None):
753
753
754 return False
754 return False
755 try:
755 try:
756 if (self.autoedit_syntax and
756 if (self.autoedit_syntax and
757 not self.ask_yes_no('Return to editor to correct syntax error? '
757 not self.ask_yes_no('Return to editor to correct syntax error? '
758 '[Y/n] ','y')):
758 '[Y/n] ','y')):
759 return False
759 return False
760 except EOFError:
760 except EOFError:
761 return False
761 return False
762
762
763 def int0(x):
763 def int0(x):
764 try:
764 try:
765 return int(x)
765 return int(x)
766 except TypeError:
766 except TypeError:
767 return 0
767 return 0
768 # always pass integer line and offset values to editor hook
768 # always pass integer line and offset values to editor hook
769 try:
769 try:
770 self.hooks.fix_error_editor(e.filename,
770 self.hooks.fix_error_editor(e.filename,
771 int0(e.lineno),int0(e.offset),e.msg)
771 int0(e.lineno),int0(e.offset),e.msg)
772 except TryNext:
772 except TryNext:
773 warn('Could not open editor')
773 warn('Could not open editor')
774 return False
774 return False
775 return True
775 return True
776
776
777 #-------------------------------------------------------------------------
777 #-------------------------------------------------------------------------
778 # Things related to exiting
778 # Things related to exiting
779 #-------------------------------------------------------------------------
779 #-------------------------------------------------------------------------
780
780
781 def ask_exit(self):
781 def ask_exit(self):
782 """ Ask the shell to exit. Can be overiden and used as a callback. """
782 """ Ask the shell to exit. Can be overiden and used as a callback. """
783 self.exit_now = True
783 self.exit_now = True
784
784
785 def exit(self):
785 def exit(self):
786 """Handle interactive exit.
786 """Handle interactive exit.
787
787
788 This method calls the ask_exit callback."""
788 This method calls the ask_exit callback."""
789 if self.confirm_exit:
789 if self.confirm_exit:
790 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y','n'):
790 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y','n'):
791 self.ask_exit()
791 self.ask_exit()
792 else:
792 else:
793 self.ask_exit()
793 self.ask_exit()
794
794
795 #-------------------------------------------------------------------------
795 #-------------------------------------------------------------------------
796 # Things related to magics
796 # Things related to magics
797 #-------------------------------------------------------------------------
797 #-------------------------------------------------------------------------
798
798
799 def init_magics(self):
799 def init_magics(self):
800 super(TerminalInteractiveShell, self).init_magics()
800 super(TerminalInteractiveShell, self).init_magics()
801 self.register_magics(TerminalMagics)
801 self.register_magics(TerminalMagics)
802
802
803 def showindentationerror(self):
803 def showindentationerror(self):
804 super(TerminalInteractiveShell, self).showindentationerror()
804 super(TerminalInteractiveShell, self).showindentationerror()
805 if not self.using_paste_magics:
805 if not self.using_paste_magics:
806 print("If you want to paste code into IPython, try the "
806 print("If you want to paste code into IPython, try the "
807 "%paste and %cpaste magic functions.")
807 "%paste and %cpaste magic functions.")
808
808
809
809
810 InteractiveShellABC.register(TerminalInteractiveShell)
810 InteractiveShellABC.register(TerminalInteractiveShell)
@@ -1,376 +1,374 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3 """
3 """
4 The :class:`~IPython.core.application.Application` object for the command
4 The :class:`~IPython.core.application.Application` object for the command
5 line :command:`ipython` program.
5 line :command:`ipython` program.
6 """
6 """
7
7
8 # Copyright (c) IPython Development Team.
8 # Copyright (c) IPython Development Team.
9 # Distributed under the terms of the Modified BSD License.
9 # Distributed under the terms of the Modified BSD License.
10
10
11 from __future__ import absolute_import
11 from __future__ import absolute_import
12 from __future__ import print_function
12 from __future__ import print_function
13
13
14 import logging
14 import logging
15 import os
15 import os
16 import sys
16 import sys
17 import warnings
17 import warnings
18
18
19 from traitlets.config.loader import Config
19 from traitlets.config.loader import Config
20 from traitlets.config.application import boolean_flag, catch_config_error, Application
20 from traitlets.config.application import boolean_flag, catch_config_error, Application
21 from IPython.core import release
21 from IPython.core import release
22 from IPython.core import usage
22 from IPython.core import usage
23 from IPython.core.completer import IPCompleter
23 from IPython.core.completer import IPCompleter
24 from IPython.core.crashhandler import CrashHandler
24 from IPython.core.crashhandler import CrashHandler
25 from IPython.core.formatters import PlainTextFormatter
25 from IPython.core.formatters import PlainTextFormatter
26 from IPython.core.history import HistoryManager
26 from IPython.core.history import HistoryManager
27 from IPython.core.prompts import PromptManager
28 from IPython.core.application import (
27 from IPython.core.application import (
29 ProfileDir, BaseIPythonApplication, base_flags, base_aliases
28 ProfileDir, BaseIPythonApplication, base_flags, base_aliases
30 )
29 )
31 from IPython.core.magics import ScriptMagics
30 from IPython.core.magics import ScriptMagics
32 from IPython.core.shellapp import (
31 from IPython.core.shellapp import (
33 InteractiveShellApp, shell_flags, shell_aliases
32 InteractiveShellApp, shell_flags, shell_aliases
34 )
33 )
35 from IPython.extensions.storemagic import StoreMagics
34 from IPython.extensions.storemagic import StoreMagics
36 from .ptshell import TerminalInteractiveShell
35 from .ptshell import TerminalInteractiveShell
37 from IPython.paths import get_ipython_dir
36 from IPython.paths import get_ipython_dir
38 from traitlets import (
37 from traitlets import (
39 Bool, List, Dict, default, observe,
38 Bool, List, Dict, default, observe,
40 )
39 )
41
40
42 #-----------------------------------------------------------------------------
41 #-----------------------------------------------------------------------------
43 # Globals, utilities and helpers
42 # Globals, utilities and helpers
44 #-----------------------------------------------------------------------------
43 #-----------------------------------------------------------------------------
45
44
46 _examples = """
45 _examples = """
47 ipython --matplotlib # enable matplotlib integration
46 ipython --matplotlib # enable matplotlib integration
48 ipython --matplotlib=qt # enable matplotlib integration with qt4 backend
47 ipython --matplotlib=qt # enable matplotlib integration with qt4 backend
49
48
50 ipython --log-level=DEBUG # set logging to DEBUG
49 ipython --log-level=DEBUG # set logging to DEBUG
51 ipython --profile=foo # start with profile foo
50 ipython --profile=foo # start with profile foo
52
51
53 ipython profile create foo # create profile foo w/ default config files
52 ipython profile create foo # create profile foo w/ default config files
54 ipython help profile # show the help for the profile subcmd
53 ipython help profile # show the help for the profile subcmd
55
54
56 ipython locate # print the path to the IPython directory
55 ipython locate # print the path to the IPython directory
57 ipython locate profile foo # print the path to the directory for profile `foo`
56 ipython locate profile foo # print the path to the directory for profile `foo`
58 """
57 """
59
58
60 #-----------------------------------------------------------------------------
59 #-----------------------------------------------------------------------------
61 # Crash handler for this application
60 # Crash handler for this application
62 #-----------------------------------------------------------------------------
61 #-----------------------------------------------------------------------------
63
62
64 class IPAppCrashHandler(CrashHandler):
63 class IPAppCrashHandler(CrashHandler):
65 """sys.excepthook for IPython itself, leaves a detailed report on disk."""
64 """sys.excepthook for IPython itself, leaves a detailed report on disk."""
66
65
67 def __init__(self, app):
66 def __init__(self, app):
68 contact_name = release.author
67 contact_name = release.author
69 contact_email = release.author_email
68 contact_email = release.author_email
70 bug_tracker = 'https://github.com/ipython/ipython/issues'
69 bug_tracker = 'https://github.com/ipython/ipython/issues'
71 super(IPAppCrashHandler,self).__init__(
70 super(IPAppCrashHandler,self).__init__(
72 app, contact_name, contact_email, bug_tracker
71 app, contact_name, contact_email, bug_tracker
73 )
72 )
74
73
75 def make_report(self,traceback):
74 def make_report(self,traceback):
76 """Return a string containing a crash report."""
75 """Return a string containing a crash report."""
77
76
78 sec_sep = self.section_sep
77 sec_sep = self.section_sep
79 # Start with parent report
78 # Start with parent report
80 report = [super(IPAppCrashHandler, self).make_report(traceback)]
79 report = [super(IPAppCrashHandler, self).make_report(traceback)]
81 # Add interactive-specific info we may have
80 # Add interactive-specific info we may have
82 rpt_add = report.append
81 rpt_add = report.append
83 try:
82 try:
84 rpt_add(sec_sep+"History of session input:")
83 rpt_add(sec_sep+"History of session input:")
85 for line in self.app.shell.user_ns['_ih']:
84 for line in self.app.shell.user_ns['_ih']:
86 rpt_add(line)
85 rpt_add(line)
87 rpt_add('\n*** Last line of input (may not be in above history):\n')
86 rpt_add('\n*** Last line of input (may not be in above history):\n')
88 rpt_add(self.app.shell._last_input_line+'\n')
87 rpt_add(self.app.shell._last_input_line+'\n')
89 except:
88 except:
90 pass
89 pass
91
90
92 return ''.join(report)
91 return ''.join(report)
93
92
94 #-----------------------------------------------------------------------------
93 #-----------------------------------------------------------------------------
95 # Aliases and Flags
94 # Aliases and Flags
96 #-----------------------------------------------------------------------------
95 #-----------------------------------------------------------------------------
97 flags = dict(base_flags)
96 flags = dict(base_flags)
98 flags.update(shell_flags)
97 flags.update(shell_flags)
99 frontend_flags = {}
98 frontend_flags = {}
100 addflag = lambda *args: frontend_flags.update(boolean_flag(*args))
99 addflag = lambda *args: frontend_flags.update(boolean_flag(*args))
101 addflag('autoedit-syntax', 'TerminalInteractiveShell.autoedit_syntax',
100 addflag('autoedit-syntax', 'TerminalInteractiveShell.autoedit_syntax',
102 'Turn on auto editing of files with syntax errors.',
101 'Turn on auto editing of files with syntax errors.',
103 'Turn off auto editing of files with syntax errors.'
102 'Turn off auto editing of files with syntax errors.'
104 )
103 )
105 addflag('simple-prompt', 'TerminalInteractiveShell.simple_prompt',
104 addflag('simple-prompt', 'TerminalInteractiveShell.simple_prompt',
106 "Force simple minimal prompt using `raw_input`",
105 "Force simple minimal prompt using `raw_input`",
107 "Use a rich interactive prompt with prompt_toolkit",
106 "Use a rich interactive prompt with prompt_toolkit",
108 )
107 )
109
108
110 addflag('banner', 'TerminalIPythonApp.display_banner',
109 addflag('banner', 'TerminalIPythonApp.display_banner',
111 "Display a banner upon starting IPython.",
110 "Display a banner upon starting IPython.",
112 "Don't display a banner upon starting IPython."
111 "Don't display a banner upon starting IPython."
113 )
112 )
114 addflag('confirm-exit', 'TerminalInteractiveShell.confirm_exit',
113 addflag('confirm-exit', 'TerminalInteractiveShell.confirm_exit',
115 """Set to confirm when you try to exit IPython with an EOF (Control-D
114 """Set to confirm when you try to exit IPython with an EOF (Control-D
116 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
115 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
117 you can force a direct exit without any confirmation.""",
116 you can force a direct exit without any confirmation.""",
118 "Don't prompt the user when exiting."
117 "Don't prompt the user when exiting."
119 )
118 )
120 addflag('term-title', 'TerminalInteractiveShell.term_title',
119 addflag('term-title', 'TerminalInteractiveShell.term_title',
121 "Enable auto setting the terminal title.",
120 "Enable auto setting the terminal title.",
122 "Disable auto setting the terminal title."
121 "Disable auto setting the terminal title."
123 )
122 )
124 classic_config = Config()
123 classic_config = Config()
125 classic_config.InteractiveShell.cache_size = 0
124 classic_config.InteractiveShell.cache_size = 0
126 classic_config.PlainTextFormatter.pprint = False
125 classic_config.PlainTextFormatter.pprint = False
127 classic_config.PromptManager.in_template = '>>> '
126 classic_config.PromptManager.in_template = '>>> '
128 classic_config.PromptManager.in2_template = '... '
127 classic_config.PromptManager.in2_template = '... '
129 classic_config.PromptManager.out_template = ''
128 classic_config.PromptManager.out_template = ''
130 classic_config.InteractiveShell.separate_in = ''
129 classic_config.InteractiveShell.separate_in = ''
131 classic_config.InteractiveShell.separate_out = ''
130 classic_config.InteractiveShell.separate_out = ''
132 classic_config.InteractiveShell.separate_out2 = ''
131 classic_config.InteractiveShell.separate_out2 = ''
133 classic_config.InteractiveShell.colors = 'NoColor'
132 classic_config.InteractiveShell.colors = 'NoColor'
134 classic_config.InteractiveShell.xmode = 'Plain'
133 classic_config.InteractiveShell.xmode = 'Plain'
135
134
136 frontend_flags['classic']=(
135 frontend_flags['classic']=(
137 classic_config,
136 classic_config,
138 "Gives IPython a similar feel to the classic Python prompt."
137 "Gives IPython a similar feel to the classic Python prompt."
139 )
138 )
140 # # log doesn't make so much sense this way anymore
139 # # log doesn't make so much sense this way anymore
141 # paa('--log','-l',
140 # paa('--log','-l',
142 # action='store_true', dest='InteractiveShell.logstart',
141 # action='store_true', dest='InteractiveShell.logstart',
143 # help="Start logging to the default log file (./ipython_log.py).")
142 # help="Start logging to the default log file (./ipython_log.py).")
144 #
143 #
145 # # quick is harder to implement
144 # # quick is harder to implement
146 frontend_flags['quick']=(
145 frontend_flags['quick']=(
147 {'TerminalIPythonApp' : {'quick' : True}},
146 {'TerminalIPythonApp' : {'quick' : True}},
148 "Enable quick startup with no config files."
147 "Enable quick startup with no config files."
149 )
148 )
150
149
151 frontend_flags['i'] = (
150 frontend_flags['i'] = (
152 {'TerminalIPythonApp' : {'force_interact' : True}},
151 {'TerminalIPythonApp' : {'force_interact' : True}},
153 """If running code from the command line, become interactive afterwards.
152 """If running code from the command line, become interactive afterwards.
154 It is often useful to follow this with `--` to treat remaining flags as
153 It is often useful to follow this with `--` to treat remaining flags as
155 script arguments.
154 script arguments.
156 """
155 """
157 )
156 )
158 flags.update(frontend_flags)
157 flags.update(frontend_flags)
159
158
160 aliases = dict(base_aliases)
159 aliases = dict(base_aliases)
161 aliases.update(shell_aliases)
160 aliases.update(shell_aliases)
162
161
163 #-----------------------------------------------------------------------------
162 #-----------------------------------------------------------------------------
164 # Main classes and functions
163 # Main classes and functions
165 #-----------------------------------------------------------------------------
164 #-----------------------------------------------------------------------------
166
165
167
166
168 class LocateIPythonApp(BaseIPythonApplication):
167 class LocateIPythonApp(BaseIPythonApplication):
169 description = """print the path to the IPython dir"""
168 description = """print the path to the IPython dir"""
170 subcommands = Dict(dict(
169 subcommands = Dict(dict(
171 profile=('IPython.core.profileapp.ProfileLocate',
170 profile=('IPython.core.profileapp.ProfileLocate',
172 "print the path to an IPython profile directory",
171 "print the path to an IPython profile directory",
173 ),
172 ),
174 ))
173 ))
175 def start(self):
174 def start(self):
176 if self.subapp is not None:
175 if self.subapp is not None:
177 return self.subapp.start()
176 return self.subapp.start()
178 else:
177 else:
179 print(self.ipython_dir)
178 print(self.ipython_dir)
180
179
181
180
182 class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):
181 class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):
183 name = u'ipython'
182 name = u'ipython'
184 description = usage.cl_usage
183 description = usage.cl_usage
185 crash_handler_class = IPAppCrashHandler
184 crash_handler_class = IPAppCrashHandler
186 examples = _examples
185 examples = _examples
187
186
188 flags = Dict(flags)
187 flags = Dict(flags)
189 aliases = Dict(aliases)
188 aliases = Dict(aliases)
190 classes = List()
189 classes = List()
191 @default('classes')
190 @default('classes')
192 def _classes_default(self):
191 def _classes_default(self):
193 """This has to be in a method, for TerminalIPythonApp to be available."""
192 """This has to be in a method, for TerminalIPythonApp to be available."""
194 return [
193 return [
195 InteractiveShellApp, # ShellApp comes before TerminalApp, because
194 InteractiveShellApp, # ShellApp comes before TerminalApp, because
196 self.__class__, # it will also affect subclasses (e.g. QtConsole)
195 self.__class__, # it will also affect subclasses (e.g. QtConsole)
197 TerminalInteractiveShell,
196 TerminalInteractiveShell,
198 PromptManager,
199 HistoryManager,
197 HistoryManager,
200 ProfileDir,
198 ProfileDir,
201 PlainTextFormatter,
199 PlainTextFormatter,
202 IPCompleter,
200 IPCompleter,
203 ScriptMagics,
201 ScriptMagics,
204 StoreMagics,
202 StoreMagics,
205 ]
203 ]
206
204
207 deprecated_subcommands = dict(
205 deprecated_subcommands = dict(
208 qtconsole=('qtconsole.qtconsoleapp.JupyterQtConsoleApp',
206 qtconsole=('qtconsole.qtconsoleapp.JupyterQtConsoleApp',
209 """DEPRECATED, Will be removed in IPython 6.0 : Launch the Jupyter Qt Console."""
207 """DEPRECATED, Will be removed in IPython 6.0 : Launch the Jupyter Qt Console."""
210 ),
208 ),
211 notebook=('notebook.notebookapp.NotebookApp',
209 notebook=('notebook.notebookapp.NotebookApp',
212 """DEPRECATED, Will be removed in IPython 6.0 : Launch the Jupyter HTML Notebook Server."""
210 """DEPRECATED, Will be removed in IPython 6.0 : Launch the Jupyter HTML Notebook Server."""
213 ),
211 ),
214 console=('jupyter_console.app.ZMQTerminalIPythonApp',
212 console=('jupyter_console.app.ZMQTerminalIPythonApp',
215 """DEPRECATED, Will be removed in IPython 6.0 : Launch the Jupyter terminal-based Console."""
213 """DEPRECATED, Will be removed in IPython 6.0 : Launch the Jupyter terminal-based Console."""
216 ),
214 ),
217 nbconvert=('nbconvert.nbconvertapp.NbConvertApp',
215 nbconvert=('nbconvert.nbconvertapp.NbConvertApp',
218 "DEPRECATED, Will be removed in IPython 6.0 : Convert notebooks to/from other formats."
216 "DEPRECATED, Will be removed in IPython 6.0 : Convert notebooks to/from other formats."
219 ),
217 ),
220 trust=('nbformat.sign.TrustNotebookApp',
218 trust=('nbformat.sign.TrustNotebookApp',
221 "DEPRECATED, Will be removed in IPython 6.0 : Sign notebooks to trust their potentially unsafe contents at load."
219 "DEPRECATED, Will be removed in IPython 6.0 : Sign notebooks to trust their potentially unsafe contents at load."
222 ),
220 ),
223 kernelspec=('jupyter_client.kernelspecapp.KernelSpecApp',
221 kernelspec=('jupyter_client.kernelspecapp.KernelSpecApp',
224 "DEPRECATED, Will be removed in IPython 6.0 : Manage Jupyter kernel specifications."
222 "DEPRECATED, Will be removed in IPython 6.0 : Manage Jupyter kernel specifications."
225 ),
223 ),
226 )
224 )
227 subcommands = dict(
225 subcommands = dict(
228 profile = ("IPython.core.profileapp.ProfileApp",
226 profile = ("IPython.core.profileapp.ProfileApp",
229 "Create and manage IPython profiles."
227 "Create and manage IPython profiles."
230 ),
228 ),
231 kernel = ("ipykernel.kernelapp.IPKernelApp",
229 kernel = ("ipykernel.kernelapp.IPKernelApp",
232 "Start a kernel without an attached frontend."
230 "Start a kernel without an attached frontend."
233 ),
231 ),
234 locate=('IPython.terminal.ipapp.LocateIPythonApp',
232 locate=('IPython.terminal.ipapp.LocateIPythonApp',
235 LocateIPythonApp.description
233 LocateIPythonApp.description
236 ),
234 ),
237 history=('IPython.core.historyapp.HistoryApp',
235 history=('IPython.core.historyapp.HistoryApp',
238 "Manage the IPython history database."
236 "Manage the IPython history database."
239 ),
237 ),
240 )
238 )
241 deprecated_subcommands['install-nbextension'] = (
239 deprecated_subcommands['install-nbextension'] = (
242 "notebook.nbextensions.InstallNBExtensionApp",
240 "notebook.nbextensions.InstallNBExtensionApp",
243 "DEPRECATED, Will be removed in IPython 6.0 : Install Jupyter notebook extension files"
241 "DEPRECATED, Will be removed in IPython 6.0 : Install Jupyter notebook extension files"
244 )
242 )
245 subcommands.update(deprecated_subcommands)
243 subcommands.update(deprecated_subcommands)
246
244
247 # *do* autocreate requested profile, but don't create the config file.
245 # *do* autocreate requested profile, but don't create the config file.
248 auto_create=Bool(True)
246 auto_create=Bool(True)
249 # configurables
247 # configurables
250 quick = Bool(False,
248 quick = Bool(False,
251 help="""Start IPython quickly by skipping the loading of config files."""
249 help="""Start IPython quickly by skipping the loading of config files."""
252 ).tag(config=True)
250 ).tag(config=True)
253 @observe('quick')
251 @observe('quick')
254 def _quick_changed(self, change):
252 def _quick_changed(self, change):
255 if change['new']:
253 if change['new']:
256 self.load_config_file = lambda *a, **kw: None
254 self.load_config_file = lambda *a, **kw: None
257
255
258 display_banner = Bool(True,
256 display_banner = Bool(True,
259 help="Whether to display a banner upon starting IPython."
257 help="Whether to display a banner upon starting IPython."
260 ).tag(config=True)
258 ).tag(config=True)
261
259
262 # if there is code of files to run from the cmd line, don't interact
260 # if there is code of files to run from the cmd line, don't interact
263 # unless the --i flag (App.force_interact) is true.
261 # unless the --i flag (App.force_interact) is true.
264 force_interact = Bool(False,
262 force_interact = Bool(False,
265 help="""If a command or file is given via the command-line,
263 help="""If a command or file is given via the command-line,
266 e.g. 'ipython foo.py', start an interactive shell after executing the
264 e.g. 'ipython foo.py', start an interactive shell after executing the
267 file or command."""
265 file or command."""
268 ).tag(config=True)
266 ).tag(config=True)
269 @observe('force_interact')
267 @observe('force_interact')
270 def _force_interact_changed(self, change):
268 def _force_interact_changed(self, change):
271 if change['new']:
269 if change['new']:
272 self.interact = True
270 self.interact = True
273
271
274 @observe('file_to_run', 'code_to_run', 'module_to_run')
272 @observe('file_to_run', 'code_to_run', 'module_to_run')
275 def _file_to_run_changed(self, change):
273 def _file_to_run_changed(self, change):
276 new = change['new']
274 new = change['new']
277 if new:
275 if new:
278 self.something_to_run = True
276 self.something_to_run = True
279 if new and not self.force_interact:
277 if new and not self.force_interact:
280 self.interact = False
278 self.interact = False
281
279
282 # internal, not-configurable
280 # internal, not-configurable
283 something_to_run=Bool(False)
281 something_to_run=Bool(False)
284
282
285 def parse_command_line(self, argv=None):
283 def parse_command_line(self, argv=None):
286 """override to allow old '-pylab' flag with deprecation warning"""
284 """override to allow old '-pylab' flag with deprecation warning"""
287
285
288 argv = sys.argv[1:] if argv is None else argv
286 argv = sys.argv[1:] if argv is None else argv
289
287
290 if '-pylab' in argv:
288 if '-pylab' in argv:
291 # deprecated `-pylab` given,
289 # deprecated `-pylab` given,
292 # warn and transform into current syntax
290 # warn and transform into current syntax
293 argv = argv[:] # copy, don't clobber
291 argv = argv[:] # copy, don't clobber
294 idx = argv.index('-pylab')
292 idx = argv.index('-pylab')
295 warnings.warn("`-pylab` flag has been deprecated.\n"
293 warnings.warn("`-pylab` flag has been deprecated.\n"
296 " Use `--matplotlib <backend>` and import pylab manually.")
294 " Use `--matplotlib <backend>` and import pylab manually.")
297 argv[idx] = '--pylab'
295 argv[idx] = '--pylab'
298
296
299 return super(TerminalIPythonApp, self).parse_command_line(argv)
297 return super(TerminalIPythonApp, self).parse_command_line(argv)
300
298
301 @catch_config_error
299 @catch_config_error
302 def initialize(self, argv=None):
300 def initialize(self, argv=None):
303 """Do actions after construct, but before starting the app."""
301 """Do actions after construct, but before starting the app."""
304 super(TerminalIPythonApp, self).initialize(argv)
302 super(TerminalIPythonApp, self).initialize(argv)
305 if self.subapp is not None:
303 if self.subapp is not None:
306 # don't bother initializing further, starting subapp
304 # don't bother initializing further, starting subapp
307 return
305 return
308 # print self.extra_args
306 # print self.extra_args
309 if self.extra_args and not self.something_to_run:
307 if self.extra_args and not self.something_to_run:
310 self.file_to_run = self.extra_args[0]
308 self.file_to_run = self.extra_args[0]
311 self.init_path()
309 self.init_path()
312 # create the shell
310 # create the shell
313 self.init_shell()
311 self.init_shell()
314 # and draw the banner
312 # and draw the banner
315 self.init_banner()
313 self.init_banner()
316 # Now a variety of things that happen after the banner is printed.
314 # Now a variety of things that happen after the banner is printed.
317 self.init_gui_pylab()
315 self.init_gui_pylab()
318 self.init_extensions()
316 self.init_extensions()
319 self.init_code()
317 self.init_code()
320
318
321 def init_shell(self):
319 def init_shell(self):
322 """initialize the InteractiveShell instance"""
320 """initialize the InteractiveShell instance"""
323 # Create an InteractiveShell instance.
321 # Create an InteractiveShell instance.
324 # shell.display_banner should always be False for the terminal
322 # shell.display_banner should always be False for the terminal
325 # based app, because we call shell.show_banner() by hand below
323 # based app, because we call shell.show_banner() by hand below
326 # so the banner shows *before* all extension loading stuff.
324 # so the banner shows *before* all extension loading stuff.
327 self.shell = TerminalInteractiveShell.instance(parent=self,
325 self.shell = TerminalInteractiveShell.instance(parent=self,
328 profile_dir=self.profile_dir,
326 profile_dir=self.profile_dir,
329 ipython_dir=self.ipython_dir, user_ns=self.user_ns)
327 ipython_dir=self.ipython_dir, user_ns=self.user_ns)
330 self.shell.configurables.append(self)
328 self.shell.configurables.append(self)
331
329
332 def init_banner(self):
330 def init_banner(self):
333 """optionally display the banner"""
331 """optionally display the banner"""
334 if self.display_banner and self.interact:
332 if self.display_banner and self.interact:
335 self.shell.show_banner()
333 self.shell.show_banner()
336 # Make sure there is a space below the banner.
334 # Make sure there is a space below the banner.
337 if self.log_level <= logging.INFO: print()
335 if self.log_level <= logging.INFO: print()
338
336
339 def _pylab_changed(self, name, old, new):
337 def _pylab_changed(self, name, old, new):
340 """Replace --pylab='inline' with --pylab='auto'"""
338 """Replace --pylab='inline' with --pylab='auto'"""
341 if new == 'inline':
339 if new == 'inline':
342 warnings.warn("'inline' not available as pylab backend, "
340 warnings.warn("'inline' not available as pylab backend, "
343 "using 'auto' instead.")
341 "using 'auto' instead.")
344 self.pylab = 'auto'
342 self.pylab = 'auto'
345
343
346 def start(self):
344 def start(self):
347 if self.subapp is not None:
345 if self.subapp is not None:
348 return self.subapp.start()
346 return self.subapp.start()
349 # perform any prexec steps:
347 # perform any prexec steps:
350 if self.interact:
348 if self.interact:
351 self.log.debug("Starting IPython's mainloop...")
349 self.log.debug("Starting IPython's mainloop...")
352 self.shell.mainloop()
350 self.shell.mainloop()
353 else:
351 else:
354 self.log.debug("IPython not interactive...")
352 self.log.debug("IPython not interactive...")
355
353
356 def load_default_config(ipython_dir=None):
354 def load_default_config(ipython_dir=None):
357 """Load the default config file from the default ipython_dir.
355 """Load the default config file from the default ipython_dir.
358
356
359 This is useful for embedded shells.
357 This is useful for embedded shells.
360 """
358 """
361 if ipython_dir is None:
359 if ipython_dir is None:
362 ipython_dir = get_ipython_dir()
360 ipython_dir = get_ipython_dir()
363
361
364 profile_dir = os.path.join(ipython_dir, 'profile_default')
362 profile_dir = os.path.join(ipython_dir, 'profile_default')
365
363
366 config = Config()
364 config = Config()
367 for cf in Application._load_config_files("ipython_config", path=profile_dir):
365 for cf in Application._load_config_files("ipython_config", path=profile_dir):
368 config.update(cf)
366 config.update(cf)
369
367
370 return config
368 return config
371
369
372 launch_new_instance = TerminalIPythonApp.launch_instance
370 launch_new_instance = TerminalIPythonApp.launch_instance
373
371
374
372
375 if __name__ == '__main__':
373 if __name__ == '__main__':
376 launch_new_instance()
374 launch_new_instance()
General Comments 0
You need to be logged in to leave comments. Login now