##// END OF EJS Templates
Merge pull request #3568 from minrk/pylab-no-import...
Paul Ivanov -
r11487:9e253ecd merge
parent child Browse files
Show More
@@ -1,3088 +1,3133 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 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 from __future__ import absolute_import
17 from __future__ import absolute_import
18 from __future__ import print_function
18 from __future__ import print_function
19
19
20 import __builtin__ as builtin_mod
20 import __builtin__ as builtin_mod
21 import __future__
21 import __future__
22 import abc
22 import abc
23 import ast
23 import ast
24 import atexit
24 import atexit
25 import os
25 import os
26 import re
26 import re
27 import runpy
27 import runpy
28 import sys
28 import sys
29 import tempfile
29 import tempfile
30 import types
30 import types
31 from io import open as io_open
31 from io import open as io_open
32
32
33 from IPython.config.configurable import SingletonConfigurable
33 from IPython.config.configurable import SingletonConfigurable
34 from IPython.core import debugger, oinspect
34 from IPython.core import debugger, 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 AliasManager, AliasError
40 from IPython.core.alias import AliasManager, AliasError
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.compilerop import CachingCompiler, check_linecache_ipython
43 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
44 from IPython.core.display_trap import DisplayTrap
44 from IPython.core.display_trap import DisplayTrap
45 from IPython.core.displayhook import DisplayHook
45 from IPython.core.displayhook import DisplayHook
46 from IPython.core.displaypub import DisplayPublisher
46 from IPython.core.displaypub import DisplayPublisher
47 from IPython.core.error import UsageError
47 from IPython.core.error import UsageError
48 from IPython.core.extensions import ExtensionManager
48 from IPython.core.extensions import ExtensionManager
49 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
49 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
50 from IPython.core.formatters import DisplayFormatter
50 from IPython.core.formatters import DisplayFormatter
51 from IPython.core.history import HistoryManager
51 from IPython.core.history import HistoryManager
52 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
52 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
53 from IPython.core.logger import Logger
53 from IPython.core.logger import Logger
54 from IPython.core.macro import Macro
54 from IPython.core.macro import Macro
55 from IPython.core.payload import PayloadManager
55 from IPython.core.payload import PayloadManager
56 from IPython.core.prefilter import PrefilterManager
56 from IPython.core.prefilter import PrefilterManager
57 from IPython.core.profiledir import ProfileDir
57 from IPython.core.profiledir import ProfileDir
58 from IPython.core.pylabtools import pylab_activate
59 from IPython.core.prompts import PromptManager
58 from IPython.core.prompts import PromptManager
60 from IPython.lib.latextools import LaTeXTool
59 from IPython.lib.latextools import LaTeXTool
61 from IPython.testing.skipdoctest import skip_doctest
60 from IPython.testing.skipdoctest import 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.decorators import undoc
65 from IPython.utils.decorators import undoc
67 from IPython.utils.io import ask_yes_no
66 from IPython.utils.io import ask_yes_no
68 from IPython.utils.ipstruct import Struct
67 from IPython.utils.ipstruct import Struct
69 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename
68 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename
70 from IPython.utils.pickleshare import PickleShareDB
69 from IPython.utils.pickleshare import PickleShareDB
71 from IPython.utils.process import system, getoutput
70 from IPython.utils.process import system, getoutput
72 from IPython.utils.strdispatch import StrDispatch
71 from IPython.utils.strdispatch import StrDispatch
73 from IPython.utils.syspathcontext import prepended_to_syspath
72 from IPython.utils.syspathcontext import prepended_to_syspath
74 from IPython.utils.text import (format_screen, LSString, SList,
73 from IPython.utils.text import (format_screen, LSString, SList,
75 DollarFormatter)
74 DollarFormatter)
76 from IPython.utils.traitlets import (Integer, CBool, CaselessStrEnum, Enum,
75 from IPython.utils.traitlets import (Integer, CBool, CaselessStrEnum, Enum,
77 List, Unicode, Instance, Type)
76 List, Unicode, Instance, Type)
78 from IPython.utils.warn import warn, error
77 from IPython.utils.warn import warn, error
79 import IPython.core.hooks
78 import IPython.core.hooks
80
79
81 #-----------------------------------------------------------------------------
80 #-----------------------------------------------------------------------------
82 # Globals
81 # Globals
83 #-----------------------------------------------------------------------------
82 #-----------------------------------------------------------------------------
84
83
85 # compiled regexps for autoindent management
84 # compiled regexps for autoindent management
86 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
85 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
87
86
88 #-----------------------------------------------------------------------------
87 #-----------------------------------------------------------------------------
89 # Utilities
88 # Utilities
90 #-----------------------------------------------------------------------------
89 #-----------------------------------------------------------------------------
91
90
92 @undoc
91 @undoc
93 def softspace(file, newvalue):
92 def softspace(file, newvalue):
94 """Copied from code.py, to remove the dependency"""
93 """Copied from code.py, to remove the dependency"""
95
94
96 oldvalue = 0
95 oldvalue = 0
97 try:
96 try:
98 oldvalue = file.softspace
97 oldvalue = file.softspace
99 except AttributeError:
98 except AttributeError:
100 pass
99 pass
101 try:
100 try:
102 file.softspace = newvalue
101 file.softspace = newvalue
103 except (AttributeError, TypeError):
102 except (AttributeError, TypeError):
104 # "attribute-less object" or "read-only attributes"
103 # "attribute-less object" or "read-only attributes"
105 pass
104 pass
106 return oldvalue
105 return oldvalue
107
106
108 @undoc
107 @undoc
109 def no_op(*a, **kw): pass
108 def no_op(*a, **kw): pass
110
109
111 @undoc
110 @undoc
112 class NoOpContext(object):
111 class NoOpContext(object):
113 def __enter__(self): pass
112 def __enter__(self): pass
114 def __exit__(self, type, value, traceback): pass
113 def __exit__(self, type, value, traceback): pass
115 no_op_context = NoOpContext()
114 no_op_context = NoOpContext()
116
115
117 class SpaceInInput(Exception): pass
116 class SpaceInInput(Exception): pass
118
117
119 @undoc
118 @undoc
120 class Bunch: pass
119 class Bunch: pass
121
120
122
121
123 def get_default_colors():
122 def get_default_colors():
124 if sys.platform=='darwin':
123 if sys.platform=='darwin':
125 return "LightBG"
124 return "LightBG"
126 elif os.name=='nt':
125 elif os.name=='nt':
127 return 'Linux'
126 return 'Linux'
128 else:
127 else:
129 return 'Linux'
128 return 'Linux'
130
129
131
130
132 class SeparateUnicode(Unicode):
131 class SeparateUnicode(Unicode):
133 """A Unicode subclass to validate separate_in, separate_out, etc.
132 """A Unicode subclass to validate separate_in, separate_out, etc.
134
133
135 This is a Unicode based trait that converts '0'->'' and '\\n'->'\n'.
134 This is a Unicode based trait that converts '0'->'' and '\\n'->'\n'.
136 """
135 """
137
136
138 def validate(self, obj, value):
137 def validate(self, obj, value):
139 if value == '0': value = ''
138 if value == '0': value = ''
140 value = value.replace('\\n','\n')
139 value = value.replace('\\n','\n')
141 return super(SeparateUnicode, self).validate(obj, value)
140 return super(SeparateUnicode, self).validate(obj, value)
142
141
143
142
144 class ReadlineNoRecord(object):
143 class ReadlineNoRecord(object):
145 """Context manager to execute some code, then reload readline history
144 """Context manager to execute some code, then reload readline history
146 so that interactive input to the code doesn't appear when pressing up."""
145 so that interactive input to the code doesn't appear when pressing up."""
147 def __init__(self, shell):
146 def __init__(self, shell):
148 self.shell = shell
147 self.shell = shell
149 self._nested_level = 0
148 self._nested_level = 0
150
149
151 def __enter__(self):
150 def __enter__(self):
152 if self._nested_level == 0:
151 if self._nested_level == 0:
153 try:
152 try:
154 self.orig_length = self.current_length()
153 self.orig_length = self.current_length()
155 self.readline_tail = self.get_readline_tail()
154 self.readline_tail = self.get_readline_tail()
156 except (AttributeError, IndexError): # Can fail with pyreadline
155 except (AttributeError, IndexError): # Can fail with pyreadline
157 self.orig_length, self.readline_tail = 999999, []
156 self.orig_length, self.readline_tail = 999999, []
158 self._nested_level += 1
157 self._nested_level += 1
159
158
160 def __exit__(self, type, value, traceback):
159 def __exit__(self, type, value, traceback):
161 self._nested_level -= 1
160 self._nested_level -= 1
162 if self._nested_level == 0:
161 if self._nested_level == 0:
163 # Try clipping the end if it's got longer
162 # Try clipping the end if it's got longer
164 try:
163 try:
165 e = self.current_length() - self.orig_length
164 e = self.current_length() - self.orig_length
166 if e > 0:
165 if e > 0:
167 for _ in range(e):
166 for _ in range(e):
168 self.shell.readline.remove_history_item(self.orig_length)
167 self.shell.readline.remove_history_item(self.orig_length)
169
168
170 # If it still doesn't match, just reload readline history.
169 # If it still doesn't match, just reload readline history.
171 if self.current_length() != self.orig_length \
170 if self.current_length() != self.orig_length \
172 or self.get_readline_tail() != self.readline_tail:
171 or self.get_readline_tail() != self.readline_tail:
173 self.shell.refill_readline_hist()
172 self.shell.refill_readline_hist()
174 except (AttributeError, IndexError):
173 except (AttributeError, IndexError):
175 pass
174 pass
176 # Returning False will cause exceptions to propagate
175 # Returning False will cause exceptions to propagate
177 return False
176 return False
178
177
179 def current_length(self):
178 def current_length(self):
180 return self.shell.readline.get_current_history_length()
179 return self.shell.readline.get_current_history_length()
181
180
182 def get_readline_tail(self, n=10):
181 def get_readline_tail(self, n=10):
183 """Get the last n items in readline history."""
182 """Get the last n items in readline history."""
184 end = self.shell.readline.get_current_history_length() + 1
183 end = self.shell.readline.get_current_history_length() + 1
185 start = max(end-n, 1)
184 start = max(end-n, 1)
186 ghi = self.shell.readline.get_history_item
185 ghi = self.shell.readline.get_history_item
187 return [ghi(x) for x in range(start, end)]
186 return [ghi(x) for x in range(start, end)]
188
187
189 #-----------------------------------------------------------------------------
188 #-----------------------------------------------------------------------------
190 # Main IPython class
189 # Main IPython class
191 #-----------------------------------------------------------------------------
190 #-----------------------------------------------------------------------------
192
191
193 class InteractiveShell(SingletonConfigurable):
192 class InteractiveShell(SingletonConfigurable):
194 """An enhanced, interactive shell for Python."""
193 """An enhanced, interactive shell for Python."""
195
194
196 _instance = None
195 _instance = None
197
196
198 ast_transformers = List([], config=True, help=
197 ast_transformers = List([], config=True, help=
199 """
198 """
200 A list of ast.NodeTransformer subclass instances, which will be applied
199 A list of ast.NodeTransformer subclass instances, which will be applied
201 to user input before code is run.
200 to user input before code is run.
202 """
201 """
203 )
202 )
204
203
205 autocall = Enum((0,1,2), default_value=0, config=True, help=
204 autocall = Enum((0,1,2), default_value=0, config=True, help=
206 """
205 """
207 Make IPython automatically call any callable object even if you didn't
206 Make IPython automatically call any callable object even if you didn't
208 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
207 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
209 automatically. The value can be '0' to disable the feature, '1' for
208 automatically. The value can be '0' to disable the feature, '1' for
210 'smart' autocall, where it is not applied if there are no more
209 'smart' autocall, where it is not applied if there are no more
211 arguments on the line, and '2' for 'full' autocall, where all callable
210 arguments on the line, and '2' for 'full' autocall, where all callable
212 objects are automatically called (even if no arguments are present).
211 objects are automatically called (even if no arguments are present).
213 """
212 """
214 )
213 )
215 # TODO: remove all autoindent logic and put into frontends.
214 # TODO: remove all autoindent logic and put into frontends.
216 # We can't do this yet because even runlines uses the autoindent.
215 # We can't do this yet because even runlines uses the autoindent.
217 autoindent = CBool(True, config=True, help=
216 autoindent = CBool(True, config=True, help=
218 """
217 """
219 Autoindent IPython code entered interactively.
218 Autoindent IPython code entered interactively.
220 """
219 """
221 )
220 )
222 automagic = CBool(True, config=True, help=
221 automagic = CBool(True, config=True, help=
223 """
222 """
224 Enable magic commands to be called without the leading %.
223 Enable magic commands to be called without the leading %.
225 """
224 """
226 )
225 )
227 cache_size = Integer(1000, config=True, help=
226 cache_size = Integer(1000, config=True, help=
228 """
227 """
229 Set the size of the output cache. The default is 1000, you can
228 Set the size of the output cache. The default is 1000, you can
230 change it permanently in your config file. Setting it to 0 completely
229 change it permanently in your config file. Setting it to 0 completely
231 disables the caching system, and the minimum value accepted is 20 (if
230 disables the caching system, and the minimum value accepted is 20 (if
232 you provide a value less than 20, it is reset to 0 and a warning is
231 you provide a value less than 20, it is reset to 0 and a warning is
233 issued). This limit is defined because otherwise you'll spend more
232 issued). This limit is defined because otherwise you'll spend more
234 time re-flushing a too small cache than working
233 time re-flushing a too small cache than working
235 """
234 """
236 )
235 )
237 color_info = CBool(True, config=True, help=
236 color_info = CBool(True, config=True, help=
238 """
237 """
239 Use colors for displaying information about objects. Because this
238 Use colors for displaying information about objects. Because this
240 information is passed through a pager (like 'less'), and some pagers
239 information is passed through a pager (like 'less'), and some pagers
241 get confused with color codes, this capability can be turned off.
240 get confused with color codes, this capability can be turned off.
242 """
241 """
243 )
242 )
244 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
243 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
245 default_value=get_default_colors(), config=True,
244 default_value=get_default_colors(), config=True,
246 help="Set the color scheme (NoColor, Linux, or LightBG)."
245 help="Set the color scheme (NoColor, Linux, or LightBG)."
247 )
246 )
248 colors_force = CBool(False, help=
247 colors_force = CBool(False, help=
249 """
248 """
250 Force use of ANSI color codes, regardless of OS and readline
249 Force use of ANSI color codes, regardless of OS and readline
251 availability.
250 availability.
252 """
251 """
253 # FIXME: This is essentially a hack to allow ZMQShell to show colors
252 # FIXME: This is essentially a hack to allow ZMQShell to show colors
254 # without readline on Win32. When the ZMQ formatting system is
253 # without readline on Win32. When the ZMQ formatting system is
255 # refactored, this should be removed.
254 # refactored, this should be removed.
256 )
255 )
257 debug = CBool(False, config=True)
256 debug = CBool(False, config=True)
258 deep_reload = CBool(False, config=True, help=
257 deep_reload = CBool(False, config=True, help=
259 """
258 """
260 Enable deep (recursive) reloading by default. IPython can use the
259 Enable deep (recursive) reloading by default. IPython can use the
261 deep_reload module which reloads changes in modules recursively (it
260 deep_reload module which reloads changes in modules recursively (it
262 replaces the reload() function, so you don't need to change anything to
261 replaces the reload() function, so you don't need to change anything to
263 use it). deep_reload() forces a full reload of modules whose code may
262 use it). deep_reload() forces a full reload of modules whose code may
264 have changed, which the default reload() function does not. When
263 have changed, which the default reload() function does not. When
265 deep_reload is off, IPython will use the normal reload(), but
264 deep_reload is off, IPython will use the normal reload(), but
266 deep_reload will still be available as dreload().
265 deep_reload will still be available as dreload().
267 """
266 """
268 )
267 )
269 disable_failing_post_execute = CBool(False, config=True,
268 disable_failing_post_execute = CBool(False, config=True,
270 help="Don't call post-execute functions that have failed in the past."
269 help="Don't call post-execute functions that have failed in the past."
271 )
270 )
272 display_formatter = Instance(DisplayFormatter)
271 display_formatter = Instance(DisplayFormatter)
273 displayhook_class = Type(DisplayHook)
272 displayhook_class = Type(DisplayHook)
274 display_pub_class = Type(DisplayPublisher)
273 display_pub_class = Type(DisplayPublisher)
275 data_pub_class = None
274 data_pub_class = None
276
275
277 exit_now = CBool(False)
276 exit_now = CBool(False)
278 exiter = Instance(ExitAutocall)
277 exiter = Instance(ExitAutocall)
279 def _exiter_default(self):
278 def _exiter_default(self):
280 return ExitAutocall(self)
279 return ExitAutocall(self)
281 # Monotonically increasing execution counter
280 # Monotonically increasing execution counter
282 execution_count = Integer(1)
281 execution_count = Integer(1)
283 filename = Unicode("<ipython console>")
282 filename = Unicode("<ipython console>")
284 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
283 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
285
284
286 # Input splitter, to transform input line by line and detect when a block
285 # Input splitter, to transform input line by line and detect when a block
287 # is ready to be executed.
286 # is ready to be executed.
288 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
287 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
289 (), {'line_input_checker': True})
288 (), {'line_input_checker': True})
290
289
291 # This InputSplitter instance is used to transform completed cells before
290 # This InputSplitter instance is used to transform completed cells before
292 # running them. It allows cell magics to contain blank lines.
291 # running them. It allows cell magics to contain blank lines.
293 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
292 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
294 (), {'line_input_checker': False})
293 (), {'line_input_checker': False})
295
294
296 logstart = CBool(False, config=True, help=
295 logstart = CBool(False, config=True, help=
297 """
296 """
298 Start logging to the default log file.
297 Start logging to the default log file.
299 """
298 """
300 )
299 )
301 logfile = Unicode('', config=True, help=
300 logfile = Unicode('', config=True, help=
302 """
301 """
303 The name of the logfile to use.
302 The name of the logfile to use.
304 """
303 """
305 )
304 )
306 logappend = Unicode('', config=True, help=
305 logappend = Unicode('', config=True, help=
307 """
306 """
308 Start logging to the given file in append mode.
307 Start logging to the given file in append mode.
309 """
308 """
310 )
309 )
311 object_info_string_level = Enum((0,1,2), default_value=0,
310 object_info_string_level = Enum((0,1,2), default_value=0,
312 config=True)
311 config=True)
313 pdb = CBool(False, config=True, help=
312 pdb = CBool(False, config=True, help=
314 """
313 """
315 Automatically call the pdb debugger after every exception.
314 Automatically call the pdb debugger after every exception.
316 """
315 """
317 )
316 )
318 multiline_history = CBool(sys.platform != 'win32', config=True,
317 multiline_history = CBool(sys.platform != 'win32', config=True,
319 help="Save multi-line entries as one entry in readline history"
318 help="Save multi-line entries as one entry in readline history"
320 )
319 )
321
320
322 # deprecated prompt traits:
321 # deprecated prompt traits:
323
322
324 prompt_in1 = Unicode('In [\\#]: ', config=True,
323 prompt_in1 = Unicode('In [\\#]: ', config=True,
325 help="Deprecated, use PromptManager.in_template")
324 help="Deprecated, use PromptManager.in_template")
326 prompt_in2 = Unicode(' .\\D.: ', config=True,
325 prompt_in2 = Unicode(' .\\D.: ', config=True,
327 help="Deprecated, use PromptManager.in2_template")
326 help="Deprecated, use PromptManager.in2_template")
328 prompt_out = Unicode('Out[\\#]: ', config=True,
327 prompt_out = Unicode('Out[\\#]: ', config=True,
329 help="Deprecated, use PromptManager.out_template")
328 help="Deprecated, use PromptManager.out_template")
330 prompts_pad_left = CBool(True, config=True,
329 prompts_pad_left = CBool(True, config=True,
331 help="Deprecated, use PromptManager.justify")
330 help="Deprecated, use PromptManager.justify")
332
331
333 def _prompt_trait_changed(self, name, old, new):
332 def _prompt_trait_changed(self, name, old, new):
334 table = {
333 table = {
335 'prompt_in1' : 'in_template',
334 'prompt_in1' : 'in_template',
336 'prompt_in2' : 'in2_template',
335 'prompt_in2' : 'in2_template',
337 'prompt_out' : 'out_template',
336 'prompt_out' : 'out_template',
338 'prompts_pad_left' : 'justify',
337 'prompts_pad_left' : 'justify',
339 }
338 }
340 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
339 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
341 name=name, newname=table[name])
340 name=name, newname=table[name])
342 )
341 )
343 # protect against weird cases where self.config may not exist:
342 # protect against weird cases where self.config may not exist:
344 if self.config is not None:
343 if self.config is not None:
345 # propagate to corresponding PromptManager trait
344 # propagate to corresponding PromptManager trait
346 setattr(self.config.PromptManager, table[name], new)
345 setattr(self.config.PromptManager, table[name], new)
347
346
348 _prompt_in1_changed = _prompt_trait_changed
347 _prompt_in1_changed = _prompt_trait_changed
349 _prompt_in2_changed = _prompt_trait_changed
348 _prompt_in2_changed = _prompt_trait_changed
350 _prompt_out_changed = _prompt_trait_changed
349 _prompt_out_changed = _prompt_trait_changed
351 _prompt_pad_left_changed = _prompt_trait_changed
350 _prompt_pad_left_changed = _prompt_trait_changed
352
351
353 show_rewritten_input = CBool(True, config=True,
352 show_rewritten_input = CBool(True, config=True,
354 help="Show rewritten input, e.g. for autocall."
353 help="Show rewritten input, e.g. for autocall."
355 )
354 )
356
355
357 quiet = CBool(False, config=True)
356 quiet = CBool(False, config=True)
358
357
359 history_length = Integer(10000, config=True)
358 history_length = Integer(10000, config=True)
360
359
361 # The readline stuff will eventually be moved to the terminal subclass
360 # The readline stuff will eventually be moved to the terminal subclass
362 # but for now, we can't do that as readline is welded in everywhere.
361 # but for now, we can't do that as readline is welded in everywhere.
363 readline_use = CBool(True, config=True)
362 readline_use = CBool(True, config=True)
364 readline_remove_delims = Unicode('-/~', config=True)
363 readline_remove_delims = Unicode('-/~', config=True)
365 readline_delims = Unicode() # set by init_readline()
364 readline_delims = Unicode() # set by init_readline()
366 # don't use \M- bindings by default, because they
365 # don't use \M- bindings by default, because they
367 # conflict with 8-bit encodings. See gh-58,gh-88
366 # conflict with 8-bit encodings. See gh-58,gh-88
368 readline_parse_and_bind = List([
367 readline_parse_and_bind = List([
369 'tab: complete',
368 'tab: complete',
370 '"\C-l": clear-screen',
369 '"\C-l": clear-screen',
371 'set show-all-if-ambiguous on',
370 'set show-all-if-ambiguous on',
372 '"\C-o": tab-insert',
371 '"\C-o": tab-insert',
373 '"\C-r": reverse-search-history',
372 '"\C-r": reverse-search-history',
374 '"\C-s": forward-search-history',
373 '"\C-s": forward-search-history',
375 '"\C-p": history-search-backward',
374 '"\C-p": history-search-backward',
376 '"\C-n": history-search-forward',
375 '"\C-n": history-search-forward',
377 '"\e[A": history-search-backward',
376 '"\e[A": history-search-backward',
378 '"\e[B": history-search-forward',
377 '"\e[B": history-search-forward',
379 '"\C-k": kill-line',
378 '"\C-k": kill-line',
380 '"\C-u": unix-line-discard',
379 '"\C-u": unix-line-discard',
381 ], allow_none=False, config=True)
380 ], allow_none=False, config=True)
382
381
383 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
382 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
384 default_value='last_expr', config=True,
383 default_value='last_expr', config=True,
385 help="""
384 help="""
386 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
385 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
387 run interactively (displaying output from expressions).""")
386 run interactively (displaying output from expressions).""")
388
387
389 # TODO: this part of prompt management should be moved to the frontends.
388 # TODO: this part of prompt management should be moved to the frontends.
390 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
389 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
391 separate_in = SeparateUnicode('\n', config=True)
390 separate_in = SeparateUnicode('\n', config=True)
392 separate_out = SeparateUnicode('', config=True)
391 separate_out = SeparateUnicode('', config=True)
393 separate_out2 = SeparateUnicode('', config=True)
392 separate_out2 = SeparateUnicode('', config=True)
394 wildcards_case_sensitive = CBool(True, config=True)
393 wildcards_case_sensitive = CBool(True, config=True)
395 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
394 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
396 default_value='Context', config=True)
395 default_value='Context', config=True)
397
396
398 # Subcomponents of InteractiveShell
397 # Subcomponents of InteractiveShell
399 alias_manager = Instance('IPython.core.alias.AliasManager')
398 alias_manager = Instance('IPython.core.alias.AliasManager')
400 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
399 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
401 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
400 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
402 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
401 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
403 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
402 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
404 payload_manager = Instance('IPython.core.payload.PayloadManager')
403 payload_manager = Instance('IPython.core.payload.PayloadManager')
405 history_manager = Instance('IPython.core.history.HistoryManager')
404 history_manager = Instance('IPython.core.history.HistoryManager')
406 magics_manager = Instance('IPython.core.magic.MagicsManager')
405 magics_manager = Instance('IPython.core.magic.MagicsManager')
407
406
408 profile_dir = Instance('IPython.core.application.ProfileDir')
407 profile_dir = Instance('IPython.core.application.ProfileDir')
409 @property
408 @property
410 def profile(self):
409 def profile(self):
411 if self.profile_dir is not None:
410 if self.profile_dir is not None:
412 name = os.path.basename(self.profile_dir.location)
411 name = os.path.basename(self.profile_dir.location)
413 return name.replace('profile_','')
412 return name.replace('profile_','')
414
413
415
414
416 # Private interface
415 # Private interface
417 _post_execute = Instance(dict)
416 _post_execute = Instance(dict)
418
417
419 # Tracks any GUI loop loaded for pylab
418 # Tracks any GUI loop loaded for pylab
420 pylab_gui_select = None
419 pylab_gui_select = None
421
420
422 def __init__(self, ipython_dir=None, profile_dir=None,
421 def __init__(self, ipython_dir=None, profile_dir=None,
423 user_module=None, user_ns=None,
422 user_module=None, user_ns=None,
424 custom_exceptions=((), None), **kwargs):
423 custom_exceptions=((), None), **kwargs):
425
424
426 # This is where traits with a config_key argument are updated
425 # This is where traits with a config_key argument are updated
427 # from the values on config.
426 # from the values on config.
428 super(InteractiveShell, self).__init__(**kwargs)
427 super(InteractiveShell, self).__init__(**kwargs)
429 self.configurables = [self]
428 self.configurables = [self]
430
429
431 # These are relatively independent and stateless
430 # These are relatively independent and stateless
432 self.init_ipython_dir(ipython_dir)
431 self.init_ipython_dir(ipython_dir)
433 self.init_profile_dir(profile_dir)
432 self.init_profile_dir(profile_dir)
434 self.init_instance_attrs()
433 self.init_instance_attrs()
435 self.init_environment()
434 self.init_environment()
436
435
437 # Check if we're in a virtualenv, and set up sys.path.
436 # Check if we're in a virtualenv, and set up sys.path.
438 self.init_virtualenv()
437 self.init_virtualenv()
439
438
440 # Create namespaces (user_ns, user_global_ns, etc.)
439 # Create namespaces (user_ns, user_global_ns, etc.)
441 self.init_create_namespaces(user_module, user_ns)
440 self.init_create_namespaces(user_module, user_ns)
442 # This has to be done after init_create_namespaces because it uses
441 # This has to be done after init_create_namespaces because it uses
443 # something in self.user_ns, but before init_sys_modules, which
442 # something in self.user_ns, but before init_sys_modules, which
444 # is the first thing to modify sys.
443 # is the first thing to modify sys.
445 # TODO: When we override sys.stdout and sys.stderr before this class
444 # TODO: When we override sys.stdout and sys.stderr before this class
446 # is created, we are saving the overridden ones here. Not sure if this
445 # is created, we are saving the overridden ones here. Not sure if this
447 # is what we want to do.
446 # is what we want to do.
448 self.save_sys_module_state()
447 self.save_sys_module_state()
449 self.init_sys_modules()
448 self.init_sys_modules()
450
449
451 # While we're trying to have each part of the code directly access what
450 # While we're trying to have each part of the code directly access what
452 # it needs without keeping redundant references to objects, we have too
451 # it needs without keeping redundant references to objects, we have too
453 # much legacy code that expects ip.db to exist.
452 # much legacy code that expects ip.db to exist.
454 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
453 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
455
454
456 self.init_history()
455 self.init_history()
457 self.init_encoding()
456 self.init_encoding()
458 self.init_prefilter()
457 self.init_prefilter()
459
458
460 self.init_syntax_highlighting()
459 self.init_syntax_highlighting()
461 self.init_hooks()
460 self.init_hooks()
462 self.init_pushd_popd_magic()
461 self.init_pushd_popd_magic()
463 # self.init_traceback_handlers use to be here, but we moved it below
462 # self.init_traceback_handlers use to be here, but we moved it below
464 # because it and init_io have to come after init_readline.
463 # because it and init_io have to come after init_readline.
465 self.init_user_ns()
464 self.init_user_ns()
466 self.init_logger()
465 self.init_logger()
467 self.init_alias()
466 self.init_alias()
468 self.init_builtins()
467 self.init_builtins()
469
468
470 # The following was in post_config_initialization
469 # The following was in post_config_initialization
471 self.init_inspector()
470 self.init_inspector()
472 # init_readline() must come before init_io(), because init_io uses
471 # init_readline() must come before init_io(), because init_io uses
473 # readline related things.
472 # readline related things.
474 self.init_readline()
473 self.init_readline()
475 # We save this here in case user code replaces raw_input, but it needs
474 # We save this here in case user code replaces raw_input, but it needs
476 # to be after init_readline(), because PyPy's readline works by replacing
475 # to be after init_readline(), because PyPy's readline works by replacing
477 # raw_input.
476 # raw_input.
478 if py3compat.PY3:
477 if py3compat.PY3:
479 self.raw_input_original = input
478 self.raw_input_original = input
480 else:
479 else:
481 self.raw_input_original = raw_input
480 self.raw_input_original = raw_input
482 # init_completer must come after init_readline, because it needs to
481 # init_completer must come after init_readline, because it needs to
483 # know whether readline is present or not system-wide to configure the
482 # know whether readline is present or not system-wide to configure the
484 # completers, since the completion machinery can now operate
483 # completers, since the completion machinery can now operate
485 # independently of readline (e.g. over the network)
484 # independently of readline (e.g. over the network)
486 self.init_completer()
485 self.init_completer()
487 # TODO: init_io() needs to happen before init_traceback handlers
486 # TODO: init_io() needs to happen before init_traceback handlers
488 # because the traceback handlers hardcode the stdout/stderr streams.
487 # because the traceback handlers hardcode the stdout/stderr streams.
489 # This logic in in debugger.Pdb and should eventually be changed.
488 # This logic in in debugger.Pdb and should eventually be changed.
490 self.init_io()
489 self.init_io()
491 self.init_traceback_handlers(custom_exceptions)
490 self.init_traceback_handlers(custom_exceptions)
492 self.init_prompts()
491 self.init_prompts()
493 self.init_display_formatter()
492 self.init_display_formatter()
494 self.init_display_pub()
493 self.init_display_pub()
495 self.init_data_pub()
494 self.init_data_pub()
496 self.init_displayhook()
495 self.init_displayhook()
497 self.init_latextool()
496 self.init_latextool()
498 self.init_magics()
497 self.init_magics()
499 self.init_logstart()
498 self.init_logstart()
500 self.init_pdb()
499 self.init_pdb()
501 self.init_extension_manager()
500 self.init_extension_manager()
502 self.init_payload()
501 self.init_payload()
503 self.hooks.late_startup_hook()
502 self.hooks.late_startup_hook()
504 atexit.register(self.atexit_operations)
503 atexit.register(self.atexit_operations)
505
504
506 def get_ipython(self):
505 def get_ipython(self):
507 """Return the currently running IPython instance."""
506 """Return the currently running IPython instance."""
508 return self
507 return self
509
508
510 #-------------------------------------------------------------------------
509 #-------------------------------------------------------------------------
511 # Trait changed handlers
510 # Trait changed handlers
512 #-------------------------------------------------------------------------
511 #-------------------------------------------------------------------------
513
512
514 def _ipython_dir_changed(self, name, new):
513 def _ipython_dir_changed(self, name, new):
515 if not os.path.isdir(new):
514 if not os.path.isdir(new):
516 os.makedirs(new, mode = 0o777)
515 os.makedirs(new, mode = 0o777)
517
516
518 def set_autoindent(self,value=None):
517 def set_autoindent(self,value=None):
519 """Set the autoindent flag, checking for readline support.
518 """Set the autoindent flag, checking for readline support.
520
519
521 If called with no arguments, it acts as a toggle."""
520 If called with no arguments, it acts as a toggle."""
522
521
523 if value != 0 and not self.has_readline:
522 if value != 0 and not self.has_readline:
524 if os.name == 'posix':
523 if os.name == 'posix':
525 warn("The auto-indent feature requires the readline library")
524 warn("The auto-indent feature requires the readline library")
526 self.autoindent = 0
525 self.autoindent = 0
527 return
526 return
528 if value is None:
527 if value is None:
529 self.autoindent = not self.autoindent
528 self.autoindent = not self.autoindent
530 else:
529 else:
531 self.autoindent = value
530 self.autoindent = value
532
531
533 #-------------------------------------------------------------------------
532 #-------------------------------------------------------------------------
534 # init_* methods called by __init__
533 # init_* methods called by __init__
535 #-------------------------------------------------------------------------
534 #-------------------------------------------------------------------------
536
535
537 def init_ipython_dir(self, ipython_dir):
536 def init_ipython_dir(self, ipython_dir):
538 if ipython_dir is not None:
537 if ipython_dir is not None:
539 self.ipython_dir = ipython_dir
538 self.ipython_dir = ipython_dir
540 return
539 return
541
540
542 self.ipython_dir = get_ipython_dir()
541 self.ipython_dir = get_ipython_dir()
543
542
544 def init_profile_dir(self, profile_dir):
543 def init_profile_dir(self, profile_dir):
545 if profile_dir is not None:
544 if profile_dir is not None:
546 self.profile_dir = profile_dir
545 self.profile_dir = profile_dir
547 return
546 return
548 self.profile_dir =\
547 self.profile_dir =\
549 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
548 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
550
549
551 def init_instance_attrs(self):
550 def init_instance_attrs(self):
552 self.more = False
551 self.more = False
553
552
554 # command compiler
553 # command compiler
555 self.compile = CachingCompiler()
554 self.compile = CachingCompiler()
556
555
557 # Make an empty namespace, which extension writers can rely on both
556 # Make an empty namespace, which extension writers can rely on both
558 # existing and NEVER being used by ipython itself. This gives them a
557 # existing and NEVER being used by ipython itself. This gives them a
559 # convenient location for storing additional information and state
558 # convenient location for storing additional information and state
560 # their extensions may require, without fear of collisions with other
559 # their extensions may require, without fear of collisions with other
561 # ipython names that may develop later.
560 # ipython names that may develop later.
562 self.meta = Struct()
561 self.meta = Struct()
563
562
564 # Temporary files used for various purposes. Deleted at exit.
563 # Temporary files used for various purposes. Deleted at exit.
565 self.tempfiles = []
564 self.tempfiles = []
566
565
567 # Keep track of readline usage (later set by init_readline)
566 # Keep track of readline usage (later set by init_readline)
568 self.has_readline = False
567 self.has_readline = False
569
568
570 # keep track of where we started running (mainly for crash post-mortem)
569 # keep track of where we started running (mainly for crash post-mortem)
571 # This is not being used anywhere currently.
570 # This is not being used anywhere currently.
572 self.starting_dir = os.getcwdu()
571 self.starting_dir = os.getcwdu()
573
572
574 # Indentation management
573 # Indentation management
575 self.indent_current_nsp = 0
574 self.indent_current_nsp = 0
576
575
577 # Dict to track post-execution functions that have been registered
576 # Dict to track post-execution functions that have been registered
578 self._post_execute = {}
577 self._post_execute = {}
579
578
580 def init_environment(self):
579 def init_environment(self):
581 """Any changes we need to make to the user's environment."""
580 """Any changes we need to make to the user's environment."""
582 pass
581 pass
583
582
584 def init_encoding(self):
583 def init_encoding(self):
585 # Get system encoding at startup time. Certain terminals (like Emacs
584 # Get system encoding at startup time. Certain terminals (like Emacs
586 # under Win32 have it set to None, and we need to have a known valid
585 # under Win32 have it set to None, and we need to have a known valid
587 # encoding to use in the raw_input() method
586 # encoding to use in the raw_input() method
588 try:
587 try:
589 self.stdin_encoding = sys.stdin.encoding or 'ascii'
588 self.stdin_encoding = sys.stdin.encoding or 'ascii'
590 except AttributeError:
589 except AttributeError:
591 self.stdin_encoding = 'ascii'
590 self.stdin_encoding = 'ascii'
592
591
593 def init_syntax_highlighting(self):
592 def init_syntax_highlighting(self):
594 # Python source parser/formatter for syntax highlighting
593 # Python source parser/formatter for syntax highlighting
595 pyformat = PyColorize.Parser().format
594 pyformat = PyColorize.Parser().format
596 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
595 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
597
596
598 def init_pushd_popd_magic(self):
597 def init_pushd_popd_magic(self):
599 # for pushd/popd management
598 # for pushd/popd management
600 self.home_dir = get_home_dir()
599 self.home_dir = get_home_dir()
601
600
602 self.dir_stack = []
601 self.dir_stack = []
603
602
604 def init_logger(self):
603 def init_logger(self):
605 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
604 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
606 logmode='rotate')
605 logmode='rotate')
607
606
608 def init_logstart(self):
607 def init_logstart(self):
609 """Initialize logging in case it was requested at the command line.
608 """Initialize logging in case it was requested at the command line.
610 """
609 """
611 if self.logappend:
610 if self.logappend:
612 self.magic('logstart %s append' % self.logappend)
611 self.magic('logstart %s append' % self.logappend)
613 elif self.logfile:
612 elif self.logfile:
614 self.magic('logstart %s' % self.logfile)
613 self.magic('logstart %s' % self.logfile)
615 elif self.logstart:
614 elif self.logstart:
616 self.magic('logstart')
615 self.magic('logstart')
617
616
618 def init_builtins(self):
617 def init_builtins(self):
619 # A single, static flag that we set to True. Its presence indicates
618 # A single, static flag that we set to True. Its presence indicates
620 # that an IPython shell has been created, and we make no attempts at
619 # that an IPython shell has been created, and we make no attempts at
621 # removing on exit or representing the existence of more than one
620 # removing on exit or representing the existence of more than one
622 # IPython at a time.
621 # IPython at a time.
623 builtin_mod.__dict__['__IPYTHON__'] = True
622 builtin_mod.__dict__['__IPYTHON__'] = True
624
623
625 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
624 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
626 # manage on enter/exit, but with all our shells it's virtually
625 # manage on enter/exit, but with all our shells it's virtually
627 # impossible to get all the cases right. We're leaving the name in for
626 # impossible to get all the cases right. We're leaving the name in for
628 # those who adapted their codes to check for this flag, but will
627 # those who adapted their codes to check for this flag, but will
629 # eventually remove it after a few more releases.
628 # eventually remove it after a few more releases.
630 builtin_mod.__dict__['__IPYTHON__active'] = \
629 builtin_mod.__dict__['__IPYTHON__active'] = \
631 'Deprecated, check for __IPYTHON__'
630 'Deprecated, check for __IPYTHON__'
632
631
633 self.builtin_trap = BuiltinTrap(shell=self)
632 self.builtin_trap = BuiltinTrap(shell=self)
634
633
635 def init_inspector(self):
634 def init_inspector(self):
636 # Object inspector
635 # Object inspector
637 self.inspector = oinspect.Inspector(oinspect.InspectColors,
636 self.inspector = oinspect.Inspector(oinspect.InspectColors,
638 PyColorize.ANSICodeColors,
637 PyColorize.ANSICodeColors,
639 'NoColor',
638 'NoColor',
640 self.object_info_string_level)
639 self.object_info_string_level)
641
640
642 def init_io(self):
641 def init_io(self):
643 # This will just use sys.stdout and sys.stderr. If you want to
642 # This will just use sys.stdout and sys.stderr. If you want to
644 # override sys.stdout and sys.stderr themselves, you need to do that
643 # override sys.stdout and sys.stderr themselves, you need to do that
645 # *before* instantiating this class, because io holds onto
644 # *before* instantiating this class, because io holds onto
646 # references to the underlying streams.
645 # references to the underlying streams.
647 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
646 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
648 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
647 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
649 else:
648 else:
650 io.stdout = io.IOStream(sys.stdout)
649 io.stdout = io.IOStream(sys.stdout)
651 io.stderr = io.IOStream(sys.stderr)
650 io.stderr = io.IOStream(sys.stderr)
652
651
653 def init_prompts(self):
652 def init_prompts(self):
654 self.prompt_manager = PromptManager(shell=self, parent=self)
653 self.prompt_manager = PromptManager(shell=self, parent=self)
655 self.configurables.append(self.prompt_manager)
654 self.configurables.append(self.prompt_manager)
656 # Set system prompts, so that scripts can decide if they are running
655 # Set system prompts, so that scripts can decide if they are running
657 # interactively.
656 # interactively.
658 sys.ps1 = 'In : '
657 sys.ps1 = 'In : '
659 sys.ps2 = '...: '
658 sys.ps2 = '...: '
660 sys.ps3 = 'Out: '
659 sys.ps3 = 'Out: '
661
660
662 def init_display_formatter(self):
661 def init_display_formatter(self):
663 self.display_formatter = DisplayFormatter(parent=self)
662 self.display_formatter = DisplayFormatter(parent=self)
664 self.configurables.append(self.display_formatter)
663 self.configurables.append(self.display_formatter)
665
664
666 def init_display_pub(self):
665 def init_display_pub(self):
667 self.display_pub = self.display_pub_class(parent=self)
666 self.display_pub = self.display_pub_class(parent=self)
668 self.configurables.append(self.display_pub)
667 self.configurables.append(self.display_pub)
669
668
670 def init_data_pub(self):
669 def init_data_pub(self):
671 if not self.data_pub_class:
670 if not self.data_pub_class:
672 self.data_pub = None
671 self.data_pub = None
673 return
672 return
674 self.data_pub = self.data_pub_class(parent=self)
673 self.data_pub = self.data_pub_class(parent=self)
675 self.configurables.append(self.data_pub)
674 self.configurables.append(self.data_pub)
676
675
677 def init_displayhook(self):
676 def init_displayhook(self):
678 # Initialize displayhook, set in/out prompts and printing system
677 # Initialize displayhook, set in/out prompts and printing system
679 self.displayhook = self.displayhook_class(
678 self.displayhook = self.displayhook_class(
680 parent=self,
679 parent=self,
681 shell=self,
680 shell=self,
682 cache_size=self.cache_size,
681 cache_size=self.cache_size,
683 )
682 )
684 self.configurables.append(self.displayhook)
683 self.configurables.append(self.displayhook)
685 # This is a context manager that installs/revmoes the displayhook at
684 # This is a context manager that installs/revmoes the displayhook at
686 # the appropriate time.
685 # the appropriate time.
687 self.display_trap = DisplayTrap(hook=self.displayhook)
686 self.display_trap = DisplayTrap(hook=self.displayhook)
688
687
689 def init_latextool(self):
688 def init_latextool(self):
690 """Configure LaTeXTool."""
689 """Configure LaTeXTool."""
691 cfg = LaTeXTool.instance(parent=self)
690 cfg = LaTeXTool.instance(parent=self)
692 if cfg not in self.configurables:
691 if cfg not in self.configurables:
693 self.configurables.append(cfg)
692 self.configurables.append(cfg)
694
693
695 def init_virtualenv(self):
694 def init_virtualenv(self):
696 """Add a virtualenv to sys.path so the user can import modules from it.
695 """Add a virtualenv to sys.path so the user can import modules from it.
697 This isn't perfect: it doesn't use the Python interpreter with which the
696 This isn't perfect: it doesn't use the Python interpreter with which the
698 virtualenv was built, and it ignores the --no-site-packages option. A
697 virtualenv was built, and it ignores the --no-site-packages option. A
699 warning will appear suggesting the user installs IPython in the
698 warning will appear suggesting the user installs IPython in the
700 virtualenv, but for many cases, it probably works well enough.
699 virtualenv, but for many cases, it probably works well enough.
701
700
702 Adapted from code snippets online.
701 Adapted from code snippets online.
703
702
704 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
703 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
705 """
704 """
706 if 'VIRTUAL_ENV' not in os.environ:
705 if 'VIRTUAL_ENV' not in os.environ:
707 # Not in a virtualenv
706 # Not in a virtualenv
708 return
707 return
709
708
710 if sys.executable.startswith(os.environ['VIRTUAL_ENV']):
709 if sys.executable.startswith(os.environ['VIRTUAL_ENV']):
711 # Running properly in the virtualenv, don't need to do anything
710 # Running properly in the virtualenv, don't need to do anything
712 return
711 return
713
712
714 warn("Attempting to work in a virtualenv. If you encounter problems, please "
713 warn("Attempting to work in a virtualenv. If you encounter problems, please "
715 "install IPython inside the virtualenv.")
714 "install IPython inside the virtualenv.")
716 if sys.platform == "win32":
715 if sys.platform == "win32":
717 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
716 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
718 else:
717 else:
719 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
718 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
720 'python%d.%d' % sys.version_info[:2], 'site-packages')
719 'python%d.%d' % sys.version_info[:2], 'site-packages')
721
720
722 import site
721 import site
723 sys.path.insert(0, virtual_env)
722 sys.path.insert(0, virtual_env)
724 site.addsitedir(virtual_env)
723 site.addsitedir(virtual_env)
725
724
726 #-------------------------------------------------------------------------
725 #-------------------------------------------------------------------------
727 # Things related to injections into the sys module
726 # Things related to injections into the sys module
728 #-------------------------------------------------------------------------
727 #-------------------------------------------------------------------------
729
728
730 def save_sys_module_state(self):
729 def save_sys_module_state(self):
731 """Save the state of hooks in the sys module.
730 """Save the state of hooks in the sys module.
732
731
733 This has to be called after self.user_module is created.
732 This has to be called after self.user_module is created.
734 """
733 """
735 self._orig_sys_module_state = {}
734 self._orig_sys_module_state = {}
736 self._orig_sys_module_state['stdin'] = sys.stdin
735 self._orig_sys_module_state['stdin'] = sys.stdin
737 self._orig_sys_module_state['stdout'] = sys.stdout
736 self._orig_sys_module_state['stdout'] = sys.stdout
738 self._orig_sys_module_state['stderr'] = sys.stderr
737 self._orig_sys_module_state['stderr'] = sys.stderr
739 self._orig_sys_module_state['excepthook'] = sys.excepthook
738 self._orig_sys_module_state['excepthook'] = sys.excepthook
740 self._orig_sys_modules_main_name = self.user_module.__name__
739 self._orig_sys_modules_main_name = self.user_module.__name__
741 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
740 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
742
741
743 def restore_sys_module_state(self):
742 def restore_sys_module_state(self):
744 """Restore the state of the sys module."""
743 """Restore the state of the sys module."""
745 try:
744 try:
746 for k, v in self._orig_sys_module_state.iteritems():
745 for k, v in self._orig_sys_module_state.iteritems():
747 setattr(sys, k, v)
746 setattr(sys, k, v)
748 except AttributeError:
747 except AttributeError:
749 pass
748 pass
750 # Reset what what done in self.init_sys_modules
749 # Reset what what done in self.init_sys_modules
751 if self._orig_sys_modules_main_mod is not None:
750 if self._orig_sys_modules_main_mod is not None:
752 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
751 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
753
752
754 #-------------------------------------------------------------------------
753 #-------------------------------------------------------------------------
755 # Things related to hooks
754 # Things related to hooks
756 #-------------------------------------------------------------------------
755 #-------------------------------------------------------------------------
757
756
758 def init_hooks(self):
757 def init_hooks(self):
759 # hooks holds pointers used for user-side customizations
758 # hooks holds pointers used for user-side customizations
760 self.hooks = Struct()
759 self.hooks = Struct()
761
760
762 self.strdispatchers = {}
761 self.strdispatchers = {}
763
762
764 # Set all default hooks, defined in the IPython.hooks module.
763 # Set all default hooks, defined in the IPython.hooks module.
765 hooks = IPython.core.hooks
764 hooks = IPython.core.hooks
766 for hook_name in hooks.__all__:
765 for hook_name in hooks.__all__:
767 # default hooks have priority 100, i.e. low; user hooks should have
766 # default hooks have priority 100, i.e. low; user hooks should have
768 # 0-100 priority
767 # 0-100 priority
769 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
768 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
770
769
771 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
770 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
772 """set_hook(name,hook) -> sets an internal IPython hook.
771 """set_hook(name,hook) -> sets an internal IPython hook.
773
772
774 IPython exposes some of its internal API as user-modifiable hooks. By
773 IPython exposes some of its internal API as user-modifiable hooks. By
775 adding your function to one of these hooks, you can modify IPython's
774 adding your function to one of these hooks, you can modify IPython's
776 behavior to call at runtime your own routines."""
775 behavior to call at runtime your own routines."""
777
776
778 # At some point in the future, this should validate the hook before it
777 # At some point in the future, this should validate the hook before it
779 # accepts it. Probably at least check that the hook takes the number
778 # accepts it. Probably at least check that the hook takes the number
780 # of args it's supposed to.
779 # of args it's supposed to.
781
780
782 f = types.MethodType(hook,self)
781 f = types.MethodType(hook,self)
783
782
784 # check if the hook is for strdispatcher first
783 # check if the hook is for strdispatcher first
785 if str_key is not None:
784 if str_key is not None:
786 sdp = self.strdispatchers.get(name, StrDispatch())
785 sdp = self.strdispatchers.get(name, StrDispatch())
787 sdp.add_s(str_key, f, priority )
786 sdp.add_s(str_key, f, priority )
788 self.strdispatchers[name] = sdp
787 self.strdispatchers[name] = sdp
789 return
788 return
790 if re_key is not None:
789 if re_key is not None:
791 sdp = self.strdispatchers.get(name, StrDispatch())
790 sdp = self.strdispatchers.get(name, StrDispatch())
792 sdp.add_re(re.compile(re_key), f, priority )
791 sdp.add_re(re.compile(re_key), f, priority )
793 self.strdispatchers[name] = sdp
792 self.strdispatchers[name] = sdp
794 return
793 return
795
794
796 dp = getattr(self.hooks, name, None)
795 dp = getattr(self.hooks, name, None)
797 if name not in IPython.core.hooks.__all__:
796 if name not in IPython.core.hooks.__all__:
798 print("Warning! Hook '%s' is not one of %s" % \
797 print("Warning! Hook '%s' is not one of %s" % \
799 (name, IPython.core.hooks.__all__ ))
798 (name, IPython.core.hooks.__all__ ))
800 if not dp:
799 if not dp:
801 dp = IPython.core.hooks.CommandChainDispatcher()
800 dp = IPython.core.hooks.CommandChainDispatcher()
802
801
803 try:
802 try:
804 dp.add(f,priority)
803 dp.add(f,priority)
805 except AttributeError:
804 except AttributeError:
806 # it was not commandchain, plain old func - replace
805 # it was not commandchain, plain old func - replace
807 dp = f
806 dp = f
808
807
809 setattr(self.hooks,name, dp)
808 setattr(self.hooks,name, dp)
810
809
811 def register_post_execute(self, func):
810 def register_post_execute(self, func):
812 """Register a function for calling after code execution.
811 """Register a function for calling after code execution.
813 """
812 """
814 if not callable(func):
813 if not callable(func):
815 raise ValueError('argument %s must be callable' % func)
814 raise ValueError('argument %s must be callable' % func)
816 self._post_execute[func] = True
815 self._post_execute[func] = True
817
816
818 #-------------------------------------------------------------------------
817 #-------------------------------------------------------------------------
819 # Things related to the "main" module
818 # Things related to the "main" module
820 #-------------------------------------------------------------------------
819 #-------------------------------------------------------------------------
821
820
822 def new_main_mod(self, filename):
821 def new_main_mod(self, filename):
823 """Return a new 'main' module object for user code execution.
822 """Return a new 'main' module object for user code execution.
824
823
825 ``filename`` should be the path of the script which will be run in the
824 ``filename`` should be the path of the script which will be run in the
826 module. Requests with the same filename will get the same module, with
825 module. Requests with the same filename will get the same module, with
827 its namespace cleared.
826 its namespace cleared.
828
827
829 When scripts are executed via %run, we must keep a reference to their
828 When scripts are executed via %run, we must keep a reference to their
830 __main__ module (a FakeModule instance) around so that Python doesn't
829 __main__ module (a FakeModule instance) around so that Python doesn't
831 clear it, rendering references to module globals useless.
830 clear it, rendering references to module globals useless.
832
831
833 This method keeps said reference in a private dict, keyed by the
832 This method keeps said reference in a private dict, keyed by the
834 absolute path of the script. This way, for multiple executions of the
833 absolute path of the script. This way, for multiple executions of the
835 same script we only keep one copy of the namespace (the last one),
834 same script we only keep one copy of the namespace (the last one),
836 thus preventing memory leaks from old references while allowing the
835 thus preventing memory leaks from old references while allowing the
837 objects from the last execution to be accessible.
836 objects from the last execution to be accessible.
838 """
837 """
839 filename = os.path.abspath(filename)
838 filename = os.path.abspath(filename)
840 try:
839 try:
841 main_mod = self._main_mod_cache[filename]
840 main_mod = self._main_mod_cache[filename]
842 except KeyError:
841 except KeyError:
843 main_mod = self._main_mod_cache[filename] = FakeModule()
842 main_mod = self._main_mod_cache[filename] = FakeModule()
844 else:
843 else:
845 init_fakemod_dict(main_mod)
844 init_fakemod_dict(main_mod)
846
845
847 return main_mod
846 return main_mod
848
847
849 def clear_main_mod_cache(self):
848 def clear_main_mod_cache(self):
850 """Clear the cache of main modules.
849 """Clear the cache of main modules.
851
850
852 Mainly for use by utilities like %reset.
851 Mainly for use by utilities like %reset.
853
852
854 Examples
853 Examples
855 --------
854 --------
856
855
857 In [15]: import IPython
856 In [15]: import IPython
858
857
859 In [16]: m = _ip.new_main_mod(IPython.__file__)
858 In [16]: m = _ip.new_main_mod(IPython.__file__)
860
859
861 In [17]: len(_ip._main_mod_cache) > 0
860 In [17]: len(_ip._main_mod_cache) > 0
862 Out[17]: True
861 Out[17]: True
863
862
864 In [18]: _ip.clear_main_mod_cache()
863 In [18]: _ip.clear_main_mod_cache()
865
864
866 In [19]: len(_ip._main_mod_cache) == 0
865 In [19]: len(_ip._main_mod_cache) == 0
867 Out[19]: True
866 Out[19]: True
868 """
867 """
869 self._main_mod_cache.clear()
868 self._main_mod_cache.clear()
870
869
871 #-------------------------------------------------------------------------
870 #-------------------------------------------------------------------------
872 # Things related to debugging
871 # Things related to debugging
873 #-------------------------------------------------------------------------
872 #-------------------------------------------------------------------------
874
873
875 def init_pdb(self):
874 def init_pdb(self):
876 # Set calling of pdb on exceptions
875 # Set calling of pdb on exceptions
877 # self.call_pdb is a property
876 # self.call_pdb is a property
878 self.call_pdb = self.pdb
877 self.call_pdb = self.pdb
879
878
880 def _get_call_pdb(self):
879 def _get_call_pdb(self):
881 return self._call_pdb
880 return self._call_pdb
882
881
883 def _set_call_pdb(self,val):
882 def _set_call_pdb(self,val):
884
883
885 if val not in (0,1,False,True):
884 if val not in (0,1,False,True):
886 raise ValueError('new call_pdb value must be boolean')
885 raise ValueError('new call_pdb value must be boolean')
887
886
888 # store value in instance
887 # store value in instance
889 self._call_pdb = val
888 self._call_pdb = val
890
889
891 # notify the actual exception handlers
890 # notify the actual exception handlers
892 self.InteractiveTB.call_pdb = val
891 self.InteractiveTB.call_pdb = val
893
892
894 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
893 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
895 'Control auto-activation of pdb at exceptions')
894 'Control auto-activation of pdb at exceptions')
896
895
897 def debugger(self,force=False):
896 def debugger(self,force=False):
898 """Call the pydb/pdb debugger.
897 """Call the pydb/pdb debugger.
899
898
900 Keywords:
899 Keywords:
901
900
902 - force(False): by default, this routine checks the instance call_pdb
901 - force(False): by default, this routine checks the instance call_pdb
903 flag and does not actually invoke the debugger if the flag is false.
902 flag and does not actually invoke the debugger if the flag is false.
904 The 'force' option forces the debugger to activate even if the flag
903 The 'force' option forces the debugger to activate even if the flag
905 is false.
904 is false.
906 """
905 """
907
906
908 if not (force or self.call_pdb):
907 if not (force or self.call_pdb):
909 return
908 return
910
909
911 if not hasattr(sys,'last_traceback'):
910 if not hasattr(sys,'last_traceback'):
912 error('No traceback has been produced, nothing to debug.')
911 error('No traceback has been produced, nothing to debug.')
913 return
912 return
914
913
915 # use pydb if available
914 # use pydb if available
916 if debugger.has_pydb:
915 if debugger.has_pydb:
917 from pydb import pm
916 from pydb import pm
918 else:
917 else:
919 # fallback to our internal debugger
918 # fallback to our internal debugger
920 pm = lambda : self.InteractiveTB.debugger(force=True)
919 pm = lambda : self.InteractiveTB.debugger(force=True)
921
920
922 with self.readline_no_record:
921 with self.readline_no_record:
923 pm()
922 pm()
924
923
925 #-------------------------------------------------------------------------
924 #-------------------------------------------------------------------------
926 # Things related to IPython's various namespaces
925 # Things related to IPython's various namespaces
927 #-------------------------------------------------------------------------
926 #-------------------------------------------------------------------------
928 default_user_namespaces = True
927 default_user_namespaces = True
929
928
930 def init_create_namespaces(self, user_module=None, user_ns=None):
929 def init_create_namespaces(self, user_module=None, user_ns=None):
931 # Create the namespace where the user will operate. user_ns is
930 # Create the namespace where the user will operate. user_ns is
932 # normally the only one used, and it is passed to the exec calls as
931 # normally the only one used, and it is passed to the exec calls as
933 # the locals argument. But we do carry a user_global_ns namespace
932 # the locals argument. But we do carry a user_global_ns namespace
934 # given as the exec 'globals' argument, This is useful in embedding
933 # given as the exec 'globals' argument, This is useful in embedding
935 # situations where the ipython shell opens in a context where the
934 # situations where the ipython shell opens in a context where the
936 # distinction between locals and globals is meaningful. For
935 # distinction between locals and globals is meaningful. For
937 # non-embedded contexts, it is just the same object as the user_ns dict.
936 # non-embedded contexts, it is just the same object as the user_ns dict.
938
937
939 # FIXME. For some strange reason, __builtins__ is showing up at user
938 # FIXME. For some strange reason, __builtins__ is showing up at user
940 # level as a dict instead of a module. This is a manual fix, but I
939 # level as a dict instead of a module. This is a manual fix, but I
941 # should really track down where the problem is coming from. Alex
940 # should really track down where the problem is coming from. Alex
942 # Schmolck reported this problem first.
941 # Schmolck reported this problem first.
943
942
944 # A useful post by Alex Martelli on this topic:
943 # A useful post by Alex Martelli on this topic:
945 # Re: inconsistent value from __builtins__
944 # Re: inconsistent value from __builtins__
946 # Von: Alex Martelli <aleaxit@yahoo.com>
945 # Von: Alex Martelli <aleaxit@yahoo.com>
947 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
946 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
948 # Gruppen: comp.lang.python
947 # Gruppen: comp.lang.python
949
948
950 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
949 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
951 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
950 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
952 # > <type 'dict'>
951 # > <type 'dict'>
953 # > >>> print type(__builtins__)
952 # > >>> print type(__builtins__)
954 # > <type 'module'>
953 # > <type 'module'>
955 # > Is this difference in return value intentional?
954 # > Is this difference in return value intentional?
956
955
957 # Well, it's documented that '__builtins__' can be either a dictionary
956 # Well, it's documented that '__builtins__' can be either a dictionary
958 # or a module, and it's been that way for a long time. Whether it's
957 # or a module, and it's been that way for a long time. Whether it's
959 # intentional (or sensible), I don't know. In any case, the idea is
958 # intentional (or sensible), I don't know. In any case, the idea is
960 # that if you need to access the built-in namespace directly, you
959 # that if you need to access the built-in namespace directly, you
961 # should start with "import __builtin__" (note, no 's') which will
960 # should start with "import __builtin__" (note, no 's') which will
962 # definitely give you a module. Yeah, it's somewhat confusing:-(.
961 # definitely give you a module. Yeah, it's somewhat confusing:-(.
963
962
964 # These routines return a properly built module and dict as needed by
963 # These routines return a properly built module and dict as needed by
965 # the rest of the code, and can also be used by extension writers to
964 # the rest of the code, and can also be used by extension writers to
966 # generate properly initialized namespaces.
965 # generate properly initialized namespaces.
967 if (user_ns is not None) or (user_module is not None):
966 if (user_ns is not None) or (user_module is not None):
968 self.default_user_namespaces = False
967 self.default_user_namespaces = False
969 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
968 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
970
969
971 # A record of hidden variables we have added to the user namespace, so
970 # A record of hidden variables we have added to the user namespace, so
972 # we can list later only variables defined in actual interactive use.
971 # we can list later only variables defined in actual interactive use.
973 self.user_ns_hidden = set()
972 self.user_ns_hidden = set()
974
973
975 # Now that FakeModule produces a real module, we've run into a nasty
974 # Now that FakeModule produces a real module, we've run into a nasty
976 # problem: after script execution (via %run), the module where the user
975 # problem: after script execution (via %run), the module where the user
977 # code ran is deleted. Now that this object is a true module (needed
976 # code ran is deleted. Now that this object is a true module (needed
978 # so docetst and other tools work correctly), the Python module
977 # so docetst and other tools work correctly), the Python module
979 # teardown mechanism runs over it, and sets to None every variable
978 # teardown mechanism runs over it, and sets to None every variable
980 # present in that module. Top-level references to objects from the
979 # present in that module. Top-level references to objects from the
981 # script survive, because the user_ns is updated with them. However,
980 # script survive, because the user_ns is updated with them. However,
982 # calling functions defined in the script that use other things from
981 # calling functions defined in the script that use other things from
983 # the script will fail, because the function's closure had references
982 # the script will fail, because the function's closure had references
984 # to the original objects, which are now all None. So we must protect
983 # to the original objects, which are now all None. So we must protect
985 # these modules from deletion by keeping a cache.
984 # these modules from deletion by keeping a cache.
986 #
985 #
987 # To avoid keeping stale modules around (we only need the one from the
986 # To avoid keeping stale modules around (we only need the one from the
988 # last run), we use a dict keyed with the full path to the script, so
987 # last run), we use a dict keyed with the full path to the script, so
989 # only the last version of the module is held in the cache. Note,
988 # only the last version of the module is held in the cache. Note,
990 # however, that we must cache the module *namespace contents* (their
989 # however, that we must cache the module *namespace contents* (their
991 # __dict__). Because if we try to cache the actual modules, old ones
990 # __dict__). Because if we try to cache the actual modules, old ones
992 # (uncached) could be destroyed while still holding references (such as
991 # (uncached) could be destroyed while still holding references (such as
993 # those held by GUI objects that tend to be long-lived)>
992 # those held by GUI objects that tend to be long-lived)>
994 #
993 #
995 # The %reset command will flush this cache. See the cache_main_mod()
994 # The %reset command will flush this cache. See the cache_main_mod()
996 # and clear_main_mod_cache() methods for details on use.
995 # and clear_main_mod_cache() methods for details on use.
997
996
998 # This is the cache used for 'main' namespaces
997 # This is the cache used for 'main' namespaces
999 self._main_mod_cache = {}
998 self._main_mod_cache = {}
1000
999
1001 # A table holding all the namespaces IPython deals with, so that
1000 # A table holding all the namespaces IPython deals with, so that
1002 # introspection facilities can search easily.
1001 # introspection facilities can search easily.
1003 self.ns_table = {'user_global':self.user_module.__dict__,
1002 self.ns_table = {'user_global':self.user_module.__dict__,
1004 'user_local':self.user_ns,
1003 'user_local':self.user_ns,
1005 'builtin':builtin_mod.__dict__
1004 'builtin':builtin_mod.__dict__
1006 }
1005 }
1007
1006
1008 @property
1007 @property
1009 def user_global_ns(self):
1008 def user_global_ns(self):
1010 return self.user_module.__dict__
1009 return self.user_module.__dict__
1011
1010
1012 def prepare_user_module(self, user_module=None, user_ns=None):
1011 def prepare_user_module(self, user_module=None, user_ns=None):
1013 """Prepare the module and namespace in which user code will be run.
1012 """Prepare the module and namespace in which user code will be run.
1014
1013
1015 When IPython is started normally, both parameters are None: a new module
1014 When IPython is started normally, both parameters are None: a new module
1016 is created automatically, and its __dict__ used as the namespace.
1015 is created automatically, and its __dict__ used as the namespace.
1017
1016
1018 If only user_module is provided, its __dict__ is used as the namespace.
1017 If only user_module is provided, its __dict__ is used as the namespace.
1019 If only user_ns is provided, a dummy module is created, and user_ns
1018 If only user_ns is provided, a dummy module is created, and user_ns
1020 becomes the global namespace. If both are provided (as they may be
1019 becomes the global namespace. If both are provided (as they may be
1021 when embedding), user_ns is the local namespace, and user_module
1020 when embedding), user_ns is the local namespace, and user_module
1022 provides the global namespace.
1021 provides the global namespace.
1023
1022
1024 Parameters
1023 Parameters
1025 ----------
1024 ----------
1026 user_module : module, optional
1025 user_module : module, optional
1027 The current user module in which IPython is being run. If None,
1026 The current user module in which IPython is being run. If None,
1028 a clean module will be created.
1027 a clean module will be created.
1029 user_ns : dict, optional
1028 user_ns : dict, optional
1030 A namespace in which to run interactive commands.
1029 A namespace in which to run interactive commands.
1031
1030
1032 Returns
1031 Returns
1033 -------
1032 -------
1034 A tuple of user_module and user_ns, each properly initialised.
1033 A tuple of user_module and user_ns, each properly initialised.
1035 """
1034 """
1036 if user_module is None and user_ns is not None:
1035 if user_module is None and user_ns is not None:
1037 user_ns.setdefault("__name__", "__main__")
1036 user_ns.setdefault("__name__", "__main__")
1038 class DummyMod(object):
1037 class DummyMod(object):
1039 "A dummy module used for IPython's interactive namespace."
1038 "A dummy module used for IPython's interactive namespace."
1040 pass
1039 pass
1041 user_module = DummyMod()
1040 user_module = DummyMod()
1042 user_module.__dict__ = user_ns
1041 user_module.__dict__ = user_ns
1043
1042
1044 if user_module is None:
1043 if user_module is None:
1045 user_module = types.ModuleType("__main__",
1044 user_module = types.ModuleType("__main__",
1046 doc="Automatically created module for IPython interactive environment")
1045 doc="Automatically created module for IPython interactive environment")
1047
1046
1048 # We must ensure that __builtin__ (without the final 's') is always
1047 # We must ensure that __builtin__ (without the final 's') is always
1049 # available and pointing to the __builtin__ *module*. For more details:
1048 # available and pointing to the __builtin__ *module*. For more details:
1050 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1049 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1051 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1050 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1052 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1051 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1053
1052
1054 if user_ns is None:
1053 if user_ns is None:
1055 user_ns = user_module.__dict__
1054 user_ns = user_module.__dict__
1056
1055
1057 return user_module, user_ns
1056 return user_module, user_ns
1058
1057
1059 def init_sys_modules(self):
1058 def init_sys_modules(self):
1060 # We need to insert into sys.modules something that looks like a
1059 # We need to insert into sys.modules something that looks like a
1061 # module but which accesses the IPython namespace, for shelve and
1060 # module but which accesses the IPython namespace, for shelve and
1062 # pickle to work interactively. Normally they rely on getting
1061 # pickle to work interactively. Normally they rely on getting
1063 # everything out of __main__, but for embedding purposes each IPython
1062 # everything out of __main__, but for embedding purposes each IPython
1064 # instance has its own private namespace, so we can't go shoving
1063 # instance has its own private namespace, so we can't go shoving
1065 # everything into __main__.
1064 # everything into __main__.
1066
1065
1067 # note, however, that we should only do this for non-embedded
1066 # note, however, that we should only do this for non-embedded
1068 # ipythons, which really mimic the __main__.__dict__ with their own
1067 # ipythons, which really mimic the __main__.__dict__ with their own
1069 # namespace. Embedded instances, on the other hand, should not do
1068 # namespace. Embedded instances, on the other hand, should not do
1070 # this because they need to manage the user local/global namespaces
1069 # this because they need to manage the user local/global namespaces
1071 # only, but they live within a 'normal' __main__ (meaning, they
1070 # only, but they live within a 'normal' __main__ (meaning, they
1072 # shouldn't overtake the execution environment of the script they're
1071 # shouldn't overtake the execution environment of the script they're
1073 # embedded in).
1072 # embedded in).
1074
1073
1075 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1074 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1076 main_name = self.user_module.__name__
1075 main_name = self.user_module.__name__
1077 sys.modules[main_name] = self.user_module
1076 sys.modules[main_name] = self.user_module
1078
1077
1079 def init_user_ns(self):
1078 def init_user_ns(self):
1080 """Initialize all user-visible namespaces to their minimum defaults.
1079 """Initialize all user-visible namespaces to their minimum defaults.
1081
1080
1082 Certain history lists are also initialized here, as they effectively
1081 Certain history lists are also initialized here, as they effectively
1083 act as user namespaces.
1082 act as user namespaces.
1084
1083
1085 Notes
1084 Notes
1086 -----
1085 -----
1087 All data structures here are only filled in, they are NOT reset by this
1086 All data structures here are only filled in, they are NOT reset by this
1088 method. If they were not empty before, data will simply be added to
1087 method. If they were not empty before, data will simply be added to
1089 therm.
1088 therm.
1090 """
1089 """
1091 # This function works in two parts: first we put a few things in
1090 # This function works in two parts: first we put a few things in
1092 # user_ns, and we sync that contents into user_ns_hidden so that these
1091 # user_ns, and we sync that contents into user_ns_hidden so that these
1093 # initial variables aren't shown by %who. After the sync, we add the
1092 # initial variables aren't shown by %who. After the sync, we add the
1094 # rest of what we *do* want the user to see with %who even on a new
1093 # rest of what we *do* want the user to see with %who even on a new
1095 # session (probably nothing, so theye really only see their own stuff)
1094 # session (probably nothing, so theye really only see their own stuff)
1096
1095
1097 # The user dict must *always* have a __builtin__ reference to the
1096 # The user dict must *always* have a __builtin__ reference to the
1098 # Python standard __builtin__ namespace, which must be imported.
1097 # Python standard __builtin__ namespace, which must be imported.
1099 # This is so that certain operations in prompt evaluation can be
1098 # This is so that certain operations in prompt evaluation can be
1100 # reliably executed with builtins. Note that we can NOT use
1099 # reliably executed with builtins. Note that we can NOT use
1101 # __builtins__ (note the 's'), because that can either be a dict or a
1100 # __builtins__ (note the 's'), because that can either be a dict or a
1102 # module, and can even mutate at runtime, depending on the context
1101 # module, and can even mutate at runtime, depending on the context
1103 # (Python makes no guarantees on it). In contrast, __builtin__ is
1102 # (Python makes no guarantees on it). In contrast, __builtin__ is
1104 # always a module object, though it must be explicitly imported.
1103 # always a module object, though it must be explicitly imported.
1105
1104
1106 # For more details:
1105 # For more details:
1107 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1106 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1108 ns = dict()
1107 ns = dict()
1109
1108
1110 # Put 'help' in the user namespace
1109 # Put 'help' in the user namespace
1111 try:
1110 try:
1112 from site import _Helper
1111 from site import _Helper
1113 ns['help'] = _Helper()
1112 ns['help'] = _Helper()
1114 except ImportError:
1113 except ImportError:
1115 warn('help() not available - check site.py')
1114 warn('help() not available - check site.py')
1116
1115
1117 # make global variables for user access to the histories
1116 # make global variables for user access to the histories
1118 ns['_ih'] = self.history_manager.input_hist_parsed
1117 ns['_ih'] = self.history_manager.input_hist_parsed
1119 ns['_oh'] = self.history_manager.output_hist
1118 ns['_oh'] = self.history_manager.output_hist
1120 ns['_dh'] = self.history_manager.dir_hist
1119 ns['_dh'] = self.history_manager.dir_hist
1121
1120
1122 ns['_sh'] = shadowns
1121 ns['_sh'] = shadowns
1123
1122
1124 # user aliases to input and output histories. These shouldn't show up
1123 # user aliases to input and output histories. These shouldn't show up
1125 # in %who, as they can have very large reprs.
1124 # in %who, as they can have very large reprs.
1126 ns['In'] = self.history_manager.input_hist_parsed
1125 ns['In'] = self.history_manager.input_hist_parsed
1127 ns['Out'] = self.history_manager.output_hist
1126 ns['Out'] = self.history_manager.output_hist
1128
1127
1129 # Store myself as the public api!!!
1128 # Store myself as the public api!!!
1130 ns['get_ipython'] = self.get_ipython
1129 ns['get_ipython'] = self.get_ipython
1131
1130
1132 ns['exit'] = self.exiter
1131 ns['exit'] = self.exiter
1133 ns['quit'] = self.exiter
1132 ns['quit'] = self.exiter
1134
1133
1135 # Sync what we've added so far to user_ns_hidden so these aren't seen
1134 # Sync what we've added so far to user_ns_hidden so these aren't seen
1136 # by %who
1135 # by %who
1137 self.user_ns_hidden.update(ns)
1136 self.user_ns_hidden.update(ns)
1138
1137
1139 # Anything put into ns now would show up in %who. Think twice before
1138 # Anything put into ns now would show up in %who. Think twice before
1140 # putting anything here, as we really want %who to show the user their
1139 # putting anything here, as we really want %who to show the user their
1141 # stuff, not our variables.
1140 # stuff, not our variables.
1142
1141
1143 # Finally, update the real user's namespace
1142 # Finally, update the real user's namespace
1144 self.user_ns.update(ns)
1143 self.user_ns.update(ns)
1145
1144
1146 @property
1145 @property
1147 def all_ns_refs(self):
1146 def all_ns_refs(self):
1148 """Get a list of references to all the namespace dictionaries in which
1147 """Get a list of references to all the namespace dictionaries in which
1149 IPython might store a user-created object.
1148 IPython might store a user-created object.
1150
1149
1151 Note that this does not include the displayhook, which also caches
1150 Note that this does not include the displayhook, which also caches
1152 objects from the output."""
1151 objects from the output."""
1153 return [self.user_ns, self.user_global_ns] + \
1152 return [self.user_ns, self.user_global_ns] + \
1154 [m.__dict__ for m in self._main_mod_cache.values()]
1153 [m.__dict__ for m in self._main_mod_cache.values()]
1155
1154
1156 def reset(self, new_session=True):
1155 def reset(self, new_session=True):
1157 """Clear all internal namespaces, and attempt to release references to
1156 """Clear all internal namespaces, and attempt to release references to
1158 user objects.
1157 user objects.
1159
1158
1160 If new_session is True, a new history session will be opened.
1159 If new_session is True, a new history session will be opened.
1161 """
1160 """
1162 # Clear histories
1161 # Clear histories
1163 self.history_manager.reset(new_session)
1162 self.history_manager.reset(new_session)
1164 # Reset counter used to index all histories
1163 # Reset counter used to index all histories
1165 if new_session:
1164 if new_session:
1166 self.execution_count = 1
1165 self.execution_count = 1
1167
1166
1168 # Flush cached output items
1167 # Flush cached output items
1169 if self.displayhook.do_full_cache:
1168 if self.displayhook.do_full_cache:
1170 self.displayhook.flush()
1169 self.displayhook.flush()
1171
1170
1172 # The main execution namespaces must be cleared very carefully,
1171 # The main execution namespaces must be cleared very carefully,
1173 # skipping the deletion of the builtin-related keys, because doing so
1172 # skipping the deletion of the builtin-related keys, because doing so
1174 # would cause errors in many object's __del__ methods.
1173 # would cause errors in many object's __del__ methods.
1175 if self.user_ns is not self.user_global_ns:
1174 if self.user_ns is not self.user_global_ns:
1176 self.user_ns.clear()
1175 self.user_ns.clear()
1177 ns = self.user_global_ns
1176 ns = self.user_global_ns
1178 drop_keys = set(ns.keys())
1177 drop_keys = set(ns.keys())
1179 drop_keys.discard('__builtin__')
1178 drop_keys.discard('__builtin__')
1180 drop_keys.discard('__builtins__')
1179 drop_keys.discard('__builtins__')
1181 drop_keys.discard('__name__')
1180 drop_keys.discard('__name__')
1182 for k in drop_keys:
1181 for k in drop_keys:
1183 del ns[k]
1182 del ns[k]
1184
1183
1185 self.user_ns_hidden.clear()
1184 self.user_ns_hidden.clear()
1186
1185
1187 # Restore the user namespaces to minimal usability
1186 # Restore the user namespaces to minimal usability
1188 self.init_user_ns()
1187 self.init_user_ns()
1189
1188
1190 # Restore the default and user aliases
1189 # Restore the default and user aliases
1191 self.alias_manager.clear_aliases()
1190 self.alias_manager.clear_aliases()
1192 self.alias_manager.init_aliases()
1191 self.alias_manager.init_aliases()
1193
1192
1194 # Flush the private list of module references kept for script
1193 # Flush the private list of module references kept for script
1195 # execution protection
1194 # execution protection
1196 self.clear_main_mod_cache()
1195 self.clear_main_mod_cache()
1197
1196
1198 def del_var(self, varname, by_name=False):
1197 def del_var(self, varname, by_name=False):
1199 """Delete a variable from the various namespaces, so that, as
1198 """Delete a variable from the various namespaces, so that, as
1200 far as possible, we're not keeping any hidden references to it.
1199 far as possible, we're not keeping any hidden references to it.
1201
1200
1202 Parameters
1201 Parameters
1203 ----------
1202 ----------
1204 varname : str
1203 varname : str
1205 The name of the variable to delete.
1204 The name of the variable to delete.
1206 by_name : bool
1205 by_name : bool
1207 If True, delete variables with the given name in each
1206 If True, delete variables with the given name in each
1208 namespace. If False (default), find the variable in the user
1207 namespace. If False (default), find the variable in the user
1209 namespace, and delete references to it.
1208 namespace, and delete references to it.
1210 """
1209 """
1211 if varname in ('__builtin__', '__builtins__'):
1210 if varname in ('__builtin__', '__builtins__'):
1212 raise ValueError("Refusing to delete %s" % varname)
1211 raise ValueError("Refusing to delete %s" % varname)
1213
1212
1214 ns_refs = self.all_ns_refs
1213 ns_refs = self.all_ns_refs
1215
1214
1216 if by_name: # Delete by name
1215 if by_name: # Delete by name
1217 for ns in ns_refs:
1216 for ns in ns_refs:
1218 try:
1217 try:
1219 del ns[varname]
1218 del ns[varname]
1220 except KeyError:
1219 except KeyError:
1221 pass
1220 pass
1222 else: # Delete by object
1221 else: # Delete by object
1223 try:
1222 try:
1224 obj = self.user_ns[varname]
1223 obj = self.user_ns[varname]
1225 except KeyError:
1224 except KeyError:
1226 raise NameError("name '%s' is not defined" % varname)
1225 raise NameError("name '%s' is not defined" % varname)
1227 # Also check in output history
1226 # Also check in output history
1228 ns_refs.append(self.history_manager.output_hist)
1227 ns_refs.append(self.history_manager.output_hist)
1229 for ns in ns_refs:
1228 for ns in ns_refs:
1230 to_delete = [n for n, o in ns.iteritems() if o is obj]
1229 to_delete = [n for n, o in ns.iteritems() if o is obj]
1231 for name in to_delete:
1230 for name in to_delete:
1232 del ns[name]
1231 del ns[name]
1233
1232
1234 # displayhook keeps extra references, but not in a dictionary
1233 # displayhook keeps extra references, but not in a dictionary
1235 for name in ('_', '__', '___'):
1234 for name in ('_', '__', '___'):
1236 if getattr(self.displayhook, name) is obj:
1235 if getattr(self.displayhook, name) is obj:
1237 setattr(self.displayhook, name, None)
1236 setattr(self.displayhook, name, None)
1238
1237
1239 def reset_selective(self, regex=None):
1238 def reset_selective(self, regex=None):
1240 """Clear selective variables from internal namespaces based on a
1239 """Clear selective variables from internal namespaces based on a
1241 specified regular expression.
1240 specified regular expression.
1242
1241
1243 Parameters
1242 Parameters
1244 ----------
1243 ----------
1245 regex : string or compiled pattern, optional
1244 regex : string or compiled pattern, optional
1246 A regular expression pattern that will be used in searching
1245 A regular expression pattern that will be used in searching
1247 variable names in the users namespaces.
1246 variable names in the users namespaces.
1248 """
1247 """
1249 if regex is not None:
1248 if regex is not None:
1250 try:
1249 try:
1251 m = re.compile(regex)
1250 m = re.compile(regex)
1252 except TypeError:
1251 except TypeError:
1253 raise TypeError('regex must be a string or compiled pattern')
1252 raise TypeError('regex must be a string or compiled pattern')
1254 # Search for keys in each namespace that match the given regex
1253 # Search for keys in each namespace that match the given regex
1255 # If a match is found, delete the key/value pair.
1254 # If a match is found, delete the key/value pair.
1256 for ns in self.all_ns_refs:
1255 for ns in self.all_ns_refs:
1257 for var in ns:
1256 for var in ns:
1258 if m.search(var):
1257 if m.search(var):
1259 del ns[var]
1258 del ns[var]
1260
1259
1261 def push(self, variables, interactive=True):
1260 def push(self, variables, interactive=True):
1262 """Inject a group of variables into the IPython user namespace.
1261 """Inject a group of variables into the IPython user namespace.
1263
1262
1264 Parameters
1263 Parameters
1265 ----------
1264 ----------
1266 variables : dict, str or list/tuple of str
1265 variables : dict, str or list/tuple of str
1267 The variables to inject into the user's namespace. If a dict, a
1266 The variables to inject into the user's namespace. If a dict, a
1268 simple update is done. If a str, the string is assumed to have
1267 simple update is done. If a str, the string is assumed to have
1269 variable names separated by spaces. A list/tuple of str can also
1268 variable names separated by spaces. A list/tuple of str can also
1270 be used to give the variable names. If just the variable names are
1269 be used to give the variable names. If just the variable names are
1271 give (list/tuple/str) then the variable values looked up in the
1270 give (list/tuple/str) then the variable values looked up in the
1272 callers frame.
1271 callers frame.
1273 interactive : bool
1272 interactive : bool
1274 If True (default), the variables will be listed with the ``who``
1273 If True (default), the variables will be listed with the ``who``
1275 magic.
1274 magic.
1276 """
1275 """
1277 vdict = None
1276 vdict = None
1278
1277
1279 # We need a dict of name/value pairs to do namespace updates.
1278 # We need a dict of name/value pairs to do namespace updates.
1280 if isinstance(variables, dict):
1279 if isinstance(variables, dict):
1281 vdict = variables
1280 vdict = variables
1282 elif isinstance(variables, (basestring, list, tuple)):
1281 elif isinstance(variables, (basestring, list, tuple)):
1283 if isinstance(variables, basestring):
1282 if isinstance(variables, basestring):
1284 vlist = variables.split()
1283 vlist = variables.split()
1285 else:
1284 else:
1286 vlist = variables
1285 vlist = variables
1287 vdict = {}
1286 vdict = {}
1288 cf = sys._getframe(1)
1287 cf = sys._getframe(1)
1289 for name in vlist:
1288 for name in vlist:
1290 try:
1289 try:
1291 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1290 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1292 except:
1291 except:
1293 print('Could not get variable %s from %s' %
1292 print('Could not get variable %s from %s' %
1294 (name,cf.f_code.co_name))
1293 (name,cf.f_code.co_name))
1295 else:
1294 else:
1296 raise ValueError('variables must be a dict/str/list/tuple')
1295 raise ValueError('variables must be a dict/str/list/tuple')
1297
1296
1298 # Propagate variables to user namespace
1297 # Propagate variables to user namespace
1299 self.user_ns.update(vdict)
1298 self.user_ns.update(vdict)
1300
1299
1301 # And configure interactive visibility
1300 # And configure interactive visibility
1302 user_ns_hidden = self.user_ns_hidden
1301 user_ns_hidden = self.user_ns_hidden
1303 if interactive:
1302 if interactive:
1304 user_ns_hidden.difference_update(vdict)
1303 user_ns_hidden.difference_update(vdict)
1305 else:
1304 else:
1306 user_ns_hidden.update(vdict)
1305 user_ns_hidden.update(vdict)
1307
1306
1308 def drop_by_id(self, variables):
1307 def drop_by_id(self, variables):
1309 """Remove a dict of variables from the user namespace, if they are the
1308 """Remove a dict of variables from the user namespace, if they are the
1310 same as the values in the dictionary.
1309 same as the values in the dictionary.
1311
1310
1312 This is intended for use by extensions: variables that they've added can
1311 This is intended for use by extensions: variables that they've added can
1313 be taken back out if they are unloaded, without removing any that the
1312 be taken back out if they are unloaded, without removing any that the
1314 user has overwritten.
1313 user has overwritten.
1315
1314
1316 Parameters
1315 Parameters
1317 ----------
1316 ----------
1318 variables : dict
1317 variables : dict
1319 A dictionary mapping object names (as strings) to the objects.
1318 A dictionary mapping object names (as strings) to the objects.
1320 """
1319 """
1321 for name, obj in variables.iteritems():
1320 for name, obj in variables.iteritems():
1322 if name in self.user_ns and self.user_ns[name] is obj:
1321 if name in self.user_ns and self.user_ns[name] is obj:
1323 del self.user_ns[name]
1322 del self.user_ns[name]
1324 self.user_ns_hidden.discard(name)
1323 self.user_ns_hidden.discard(name)
1325
1324
1326 #-------------------------------------------------------------------------
1325 #-------------------------------------------------------------------------
1327 # Things related to object introspection
1326 # Things related to object introspection
1328 #-------------------------------------------------------------------------
1327 #-------------------------------------------------------------------------
1329
1328
1330 def _ofind(self, oname, namespaces=None):
1329 def _ofind(self, oname, namespaces=None):
1331 """Find an object in the available namespaces.
1330 """Find an object in the available namespaces.
1332
1331
1333 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1332 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1334
1333
1335 Has special code to detect magic functions.
1334 Has special code to detect magic functions.
1336 """
1335 """
1337 oname = oname.strip()
1336 oname = oname.strip()
1338 #print '1- oname: <%r>' % oname # dbg
1337 #print '1- oname: <%r>' % oname # dbg
1339 if not oname.startswith(ESC_MAGIC) and \
1338 if not oname.startswith(ESC_MAGIC) and \
1340 not oname.startswith(ESC_MAGIC2) and \
1339 not oname.startswith(ESC_MAGIC2) and \
1341 not py3compat.isidentifier(oname, dotted=True):
1340 not py3compat.isidentifier(oname, dotted=True):
1342 return dict(found=False)
1341 return dict(found=False)
1343
1342
1344 alias_ns = None
1343 alias_ns = None
1345 if namespaces is None:
1344 if namespaces is None:
1346 # Namespaces to search in:
1345 # Namespaces to search in:
1347 # Put them in a list. The order is important so that we
1346 # Put them in a list. The order is important so that we
1348 # find things in the same order that Python finds them.
1347 # find things in the same order that Python finds them.
1349 namespaces = [ ('Interactive', self.user_ns),
1348 namespaces = [ ('Interactive', self.user_ns),
1350 ('Interactive (global)', self.user_global_ns),
1349 ('Interactive (global)', self.user_global_ns),
1351 ('Python builtin', builtin_mod.__dict__),
1350 ('Python builtin', builtin_mod.__dict__),
1352 ('Alias', self.alias_manager.alias_table),
1351 ('Alias', self.alias_manager.alias_table),
1353 ]
1352 ]
1354 alias_ns = self.alias_manager.alias_table
1353 alias_ns = self.alias_manager.alias_table
1355
1354
1356 # initialize results to 'null'
1355 # initialize results to 'null'
1357 found = False; obj = None; ospace = None; ds = None;
1356 found = False; obj = None; ospace = None; ds = None;
1358 ismagic = False; isalias = False; parent = None
1357 ismagic = False; isalias = False; parent = None
1359
1358
1360 # We need to special-case 'print', which as of python2.6 registers as a
1359 # We need to special-case 'print', which as of python2.6 registers as a
1361 # function but should only be treated as one if print_function was
1360 # function but should only be treated as one if print_function was
1362 # loaded with a future import. In this case, just bail.
1361 # loaded with a future import. In this case, just bail.
1363 if (oname == 'print' and not py3compat.PY3 and not \
1362 if (oname == 'print' and not py3compat.PY3 and not \
1364 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1363 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1365 return {'found':found, 'obj':obj, 'namespace':ospace,
1364 return {'found':found, 'obj':obj, 'namespace':ospace,
1366 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1365 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1367
1366
1368 # Look for the given name by splitting it in parts. If the head is
1367 # Look for the given name by splitting it in parts. If the head is
1369 # found, then we look for all the remaining parts as members, and only
1368 # found, then we look for all the remaining parts as members, and only
1370 # declare success if we can find them all.
1369 # declare success if we can find them all.
1371 oname_parts = oname.split('.')
1370 oname_parts = oname.split('.')
1372 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1371 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1373 for nsname,ns in namespaces:
1372 for nsname,ns in namespaces:
1374 try:
1373 try:
1375 obj = ns[oname_head]
1374 obj = ns[oname_head]
1376 except KeyError:
1375 except KeyError:
1377 continue
1376 continue
1378 else:
1377 else:
1379 #print 'oname_rest:', oname_rest # dbg
1378 #print 'oname_rest:', oname_rest # dbg
1380 for part in oname_rest:
1379 for part in oname_rest:
1381 try:
1380 try:
1382 parent = obj
1381 parent = obj
1383 obj = getattr(obj,part)
1382 obj = getattr(obj,part)
1384 except:
1383 except:
1385 # Blanket except b/c some badly implemented objects
1384 # Blanket except b/c some badly implemented objects
1386 # allow __getattr__ to raise exceptions other than
1385 # allow __getattr__ to raise exceptions other than
1387 # AttributeError, which then crashes IPython.
1386 # AttributeError, which then crashes IPython.
1388 break
1387 break
1389 else:
1388 else:
1390 # If we finish the for loop (no break), we got all members
1389 # If we finish the for loop (no break), we got all members
1391 found = True
1390 found = True
1392 ospace = nsname
1391 ospace = nsname
1393 if ns == alias_ns:
1392 if ns == alias_ns:
1394 isalias = True
1393 isalias = True
1395 break # namespace loop
1394 break # namespace loop
1396
1395
1397 # Try to see if it's magic
1396 # Try to see if it's magic
1398 if not found:
1397 if not found:
1399 obj = None
1398 obj = None
1400 if oname.startswith(ESC_MAGIC2):
1399 if oname.startswith(ESC_MAGIC2):
1401 oname = oname.lstrip(ESC_MAGIC2)
1400 oname = oname.lstrip(ESC_MAGIC2)
1402 obj = self.find_cell_magic(oname)
1401 obj = self.find_cell_magic(oname)
1403 elif oname.startswith(ESC_MAGIC):
1402 elif oname.startswith(ESC_MAGIC):
1404 oname = oname.lstrip(ESC_MAGIC)
1403 oname = oname.lstrip(ESC_MAGIC)
1405 obj = self.find_line_magic(oname)
1404 obj = self.find_line_magic(oname)
1406 else:
1405 else:
1407 # search without prefix, so run? will find %run?
1406 # search without prefix, so run? will find %run?
1408 obj = self.find_line_magic(oname)
1407 obj = self.find_line_magic(oname)
1409 if obj is None:
1408 if obj is None:
1410 obj = self.find_cell_magic(oname)
1409 obj = self.find_cell_magic(oname)
1411 if obj is not None:
1410 if obj is not None:
1412 found = True
1411 found = True
1413 ospace = 'IPython internal'
1412 ospace = 'IPython internal'
1414 ismagic = True
1413 ismagic = True
1415
1414
1416 # Last try: special-case some literals like '', [], {}, etc:
1415 # Last try: special-case some literals like '', [], {}, etc:
1417 if not found and oname_head in ["''",'""','[]','{}','()']:
1416 if not found and oname_head in ["''",'""','[]','{}','()']:
1418 obj = eval(oname_head)
1417 obj = eval(oname_head)
1419 found = True
1418 found = True
1420 ospace = 'Interactive'
1419 ospace = 'Interactive'
1421
1420
1422 return {'found':found, 'obj':obj, 'namespace':ospace,
1421 return {'found':found, 'obj':obj, 'namespace':ospace,
1423 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1422 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1424
1423
1425 def _ofind_property(self, oname, info):
1424 def _ofind_property(self, oname, info):
1426 """Second part of object finding, to look for property details."""
1425 """Second part of object finding, to look for property details."""
1427 if info.found:
1426 if info.found:
1428 # Get the docstring of the class property if it exists.
1427 # Get the docstring of the class property if it exists.
1429 path = oname.split('.')
1428 path = oname.split('.')
1430 root = '.'.join(path[:-1])
1429 root = '.'.join(path[:-1])
1431 if info.parent is not None:
1430 if info.parent is not None:
1432 try:
1431 try:
1433 target = getattr(info.parent, '__class__')
1432 target = getattr(info.parent, '__class__')
1434 # The object belongs to a class instance.
1433 # The object belongs to a class instance.
1435 try:
1434 try:
1436 target = getattr(target, path[-1])
1435 target = getattr(target, path[-1])
1437 # The class defines the object.
1436 # The class defines the object.
1438 if isinstance(target, property):
1437 if isinstance(target, property):
1439 oname = root + '.__class__.' + path[-1]
1438 oname = root + '.__class__.' + path[-1]
1440 info = Struct(self._ofind(oname))
1439 info = Struct(self._ofind(oname))
1441 except AttributeError: pass
1440 except AttributeError: pass
1442 except AttributeError: pass
1441 except AttributeError: pass
1443
1442
1444 # We return either the new info or the unmodified input if the object
1443 # We return either the new info or the unmodified input if the object
1445 # hadn't been found
1444 # hadn't been found
1446 return info
1445 return info
1447
1446
1448 def _object_find(self, oname, namespaces=None):
1447 def _object_find(self, oname, namespaces=None):
1449 """Find an object and return a struct with info about it."""
1448 """Find an object and return a struct with info about it."""
1450 inf = Struct(self._ofind(oname, namespaces))
1449 inf = Struct(self._ofind(oname, namespaces))
1451 return Struct(self._ofind_property(oname, inf))
1450 return Struct(self._ofind_property(oname, inf))
1452
1451
1453 def _inspect(self, meth, oname, namespaces=None, **kw):
1452 def _inspect(self, meth, oname, namespaces=None, **kw):
1454 """Generic interface to the inspector system.
1453 """Generic interface to the inspector system.
1455
1454
1456 This function is meant to be called by pdef, pdoc & friends."""
1455 This function is meant to be called by pdef, pdoc & friends."""
1457 info = self._object_find(oname, namespaces)
1456 info = self._object_find(oname, namespaces)
1458 if info.found:
1457 if info.found:
1459 pmethod = getattr(self.inspector, meth)
1458 pmethod = getattr(self.inspector, meth)
1460 formatter = format_screen if info.ismagic else None
1459 formatter = format_screen if info.ismagic else None
1461 if meth == 'pdoc':
1460 if meth == 'pdoc':
1462 pmethod(info.obj, oname, formatter)
1461 pmethod(info.obj, oname, formatter)
1463 elif meth == 'pinfo':
1462 elif meth == 'pinfo':
1464 pmethod(info.obj, oname, formatter, info, **kw)
1463 pmethod(info.obj, oname, formatter, info, **kw)
1465 else:
1464 else:
1466 pmethod(info.obj, oname)
1465 pmethod(info.obj, oname)
1467 else:
1466 else:
1468 print('Object `%s` not found.' % oname)
1467 print('Object `%s` not found.' % oname)
1469 return 'not found' # so callers can take other action
1468 return 'not found' # so callers can take other action
1470
1469
1471 def object_inspect(self, oname, detail_level=0):
1470 def object_inspect(self, oname, detail_level=0):
1472 with self.builtin_trap:
1471 with self.builtin_trap:
1473 info = self._object_find(oname)
1472 info = self._object_find(oname)
1474 if info.found:
1473 if info.found:
1475 return self.inspector.info(info.obj, oname, info=info,
1474 return self.inspector.info(info.obj, oname, info=info,
1476 detail_level=detail_level
1475 detail_level=detail_level
1477 )
1476 )
1478 else:
1477 else:
1479 return oinspect.object_info(name=oname, found=False)
1478 return oinspect.object_info(name=oname, found=False)
1480
1479
1481 #-------------------------------------------------------------------------
1480 #-------------------------------------------------------------------------
1482 # Things related to history management
1481 # Things related to history management
1483 #-------------------------------------------------------------------------
1482 #-------------------------------------------------------------------------
1484
1483
1485 def init_history(self):
1484 def init_history(self):
1486 """Sets up the command history, and starts regular autosaves."""
1485 """Sets up the command history, and starts regular autosaves."""
1487 self.history_manager = HistoryManager(shell=self, parent=self)
1486 self.history_manager = HistoryManager(shell=self, parent=self)
1488 self.configurables.append(self.history_manager)
1487 self.configurables.append(self.history_manager)
1489
1488
1490 #-------------------------------------------------------------------------
1489 #-------------------------------------------------------------------------
1491 # Things related to exception handling and tracebacks (not debugging)
1490 # Things related to exception handling and tracebacks (not debugging)
1492 #-------------------------------------------------------------------------
1491 #-------------------------------------------------------------------------
1493
1492
1494 def init_traceback_handlers(self, custom_exceptions):
1493 def init_traceback_handlers(self, custom_exceptions):
1495 # Syntax error handler.
1494 # Syntax error handler.
1496 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1495 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1497
1496
1498 # The interactive one is initialized with an offset, meaning we always
1497 # The interactive one is initialized with an offset, meaning we always
1499 # want to remove the topmost item in the traceback, which is our own
1498 # want to remove the topmost item in the traceback, which is our own
1500 # internal code. Valid modes: ['Plain','Context','Verbose']
1499 # internal code. Valid modes: ['Plain','Context','Verbose']
1501 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1500 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1502 color_scheme='NoColor',
1501 color_scheme='NoColor',
1503 tb_offset = 1,
1502 tb_offset = 1,
1504 check_cache=check_linecache_ipython)
1503 check_cache=check_linecache_ipython)
1505
1504
1506 # The instance will store a pointer to the system-wide exception hook,
1505 # The instance will store a pointer to the system-wide exception hook,
1507 # so that runtime code (such as magics) can access it. This is because
1506 # so that runtime code (such as magics) can access it. This is because
1508 # during the read-eval loop, it may get temporarily overwritten.
1507 # during the read-eval loop, it may get temporarily overwritten.
1509 self.sys_excepthook = sys.excepthook
1508 self.sys_excepthook = sys.excepthook
1510
1509
1511 # and add any custom exception handlers the user may have specified
1510 # and add any custom exception handlers the user may have specified
1512 self.set_custom_exc(*custom_exceptions)
1511 self.set_custom_exc(*custom_exceptions)
1513
1512
1514 # Set the exception mode
1513 # Set the exception mode
1515 self.InteractiveTB.set_mode(mode=self.xmode)
1514 self.InteractiveTB.set_mode(mode=self.xmode)
1516
1515
1517 def set_custom_exc(self, exc_tuple, handler):
1516 def set_custom_exc(self, exc_tuple, handler):
1518 """set_custom_exc(exc_tuple,handler)
1517 """set_custom_exc(exc_tuple,handler)
1519
1518
1520 Set a custom exception handler, which will be called if any of the
1519 Set a custom exception handler, which will be called if any of the
1521 exceptions in exc_tuple occur in the mainloop (specifically, in the
1520 exceptions in exc_tuple occur in the mainloop (specifically, in the
1522 run_code() method).
1521 run_code() method).
1523
1522
1524 Parameters
1523 Parameters
1525 ----------
1524 ----------
1526
1525
1527 exc_tuple : tuple of exception classes
1526 exc_tuple : tuple of exception classes
1528 A *tuple* of exception classes, for which to call the defined
1527 A *tuple* of exception classes, for which to call the defined
1529 handler. It is very important that you use a tuple, and NOT A
1528 handler. It is very important that you use a tuple, and NOT A
1530 LIST here, because of the way Python's except statement works. If
1529 LIST here, because of the way Python's except statement works. If
1531 you only want to trap a single exception, use a singleton tuple::
1530 you only want to trap a single exception, use a singleton tuple::
1532
1531
1533 exc_tuple == (MyCustomException,)
1532 exc_tuple == (MyCustomException,)
1534
1533
1535 handler : callable
1534 handler : callable
1536 handler must have the following signature::
1535 handler must have the following signature::
1537
1536
1538 def my_handler(self, etype, value, tb, tb_offset=None):
1537 def my_handler(self, etype, value, tb, tb_offset=None):
1539 ...
1538 ...
1540 return structured_traceback
1539 return structured_traceback
1541
1540
1542 Your handler must return a structured traceback (a list of strings),
1541 Your handler must return a structured traceback (a list of strings),
1543 or None.
1542 or None.
1544
1543
1545 This will be made into an instance method (via types.MethodType)
1544 This will be made into an instance method (via types.MethodType)
1546 of IPython itself, and it will be called if any of the exceptions
1545 of IPython itself, and it will be called if any of the exceptions
1547 listed in the exc_tuple are caught. If the handler is None, an
1546 listed in the exc_tuple are caught. If the handler is None, an
1548 internal basic one is used, which just prints basic info.
1547 internal basic one is used, which just prints basic info.
1549
1548
1550 To protect IPython from crashes, if your handler ever raises an
1549 To protect IPython from crashes, if your handler ever raises an
1551 exception or returns an invalid result, it will be immediately
1550 exception or returns an invalid result, it will be immediately
1552 disabled.
1551 disabled.
1553
1552
1554 WARNING: by putting in your own exception handler into IPython's main
1553 WARNING: by putting in your own exception handler into IPython's main
1555 execution loop, you run a very good chance of nasty crashes. This
1554 execution loop, you run a very good chance of nasty crashes. This
1556 facility should only be used if you really know what you are doing."""
1555 facility should only be used if you really know what you are doing."""
1557
1556
1558 assert type(exc_tuple)==type(()) , \
1557 assert type(exc_tuple)==type(()) , \
1559 "The custom exceptions must be given AS A TUPLE."
1558 "The custom exceptions must be given AS A TUPLE."
1560
1559
1561 def dummy_handler(self,etype,value,tb,tb_offset=None):
1560 def dummy_handler(self,etype,value,tb,tb_offset=None):
1562 print('*** Simple custom exception handler ***')
1561 print('*** Simple custom exception handler ***')
1563 print('Exception type :',etype)
1562 print('Exception type :',etype)
1564 print('Exception value:',value)
1563 print('Exception value:',value)
1565 print('Traceback :',tb)
1564 print('Traceback :',tb)
1566 #print 'Source code :','\n'.join(self.buffer)
1565 #print 'Source code :','\n'.join(self.buffer)
1567
1566
1568 def validate_stb(stb):
1567 def validate_stb(stb):
1569 """validate structured traceback return type
1568 """validate structured traceback return type
1570
1569
1571 return type of CustomTB *should* be a list of strings, but allow
1570 return type of CustomTB *should* be a list of strings, but allow
1572 single strings or None, which are harmless.
1571 single strings or None, which are harmless.
1573
1572
1574 This function will *always* return a list of strings,
1573 This function will *always* return a list of strings,
1575 and will raise a TypeError if stb is inappropriate.
1574 and will raise a TypeError if stb is inappropriate.
1576 """
1575 """
1577 msg = "CustomTB must return list of strings, not %r" % stb
1576 msg = "CustomTB must return list of strings, not %r" % stb
1578 if stb is None:
1577 if stb is None:
1579 return []
1578 return []
1580 elif isinstance(stb, basestring):
1579 elif isinstance(stb, basestring):
1581 return [stb]
1580 return [stb]
1582 elif not isinstance(stb, list):
1581 elif not isinstance(stb, list):
1583 raise TypeError(msg)
1582 raise TypeError(msg)
1584 # it's a list
1583 # it's a list
1585 for line in stb:
1584 for line in stb:
1586 # check every element
1585 # check every element
1587 if not isinstance(line, basestring):
1586 if not isinstance(line, basestring):
1588 raise TypeError(msg)
1587 raise TypeError(msg)
1589 return stb
1588 return stb
1590
1589
1591 if handler is None:
1590 if handler is None:
1592 wrapped = dummy_handler
1591 wrapped = dummy_handler
1593 else:
1592 else:
1594 def wrapped(self,etype,value,tb,tb_offset=None):
1593 def wrapped(self,etype,value,tb,tb_offset=None):
1595 """wrap CustomTB handler, to protect IPython from user code
1594 """wrap CustomTB handler, to protect IPython from user code
1596
1595
1597 This makes it harder (but not impossible) for custom exception
1596 This makes it harder (but not impossible) for custom exception
1598 handlers to crash IPython.
1597 handlers to crash IPython.
1599 """
1598 """
1600 try:
1599 try:
1601 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1600 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1602 return validate_stb(stb)
1601 return validate_stb(stb)
1603 except:
1602 except:
1604 # clear custom handler immediately
1603 # clear custom handler immediately
1605 self.set_custom_exc((), None)
1604 self.set_custom_exc((), None)
1606 print("Custom TB Handler failed, unregistering", file=io.stderr)
1605 print("Custom TB Handler failed, unregistering", file=io.stderr)
1607 # show the exception in handler first
1606 # show the exception in handler first
1608 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1607 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1609 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1608 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1610 print("The original exception:", file=io.stdout)
1609 print("The original exception:", file=io.stdout)
1611 stb = self.InteractiveTB.structured_traceback(
1610 stb = self.InteractiveTB.structured_traceback(
1612 (etype,value,tb), tb_offset=tb_offset
1611 (etype,value,tb), tb_offset=tb_offset
1613 )
1612 )
1614 return stb
1613 return stb
1615
1614
1616 self.CustomTB = types.MethodType(wrapped,self)
1615 self.CustomTB = types.MethodType(wrapped,self)
1617 self.custom_exceptions = exc_tuple
1616 self.custom_exceptions = exc_tuple
1618
1617
1619 def excepthook(self, etype, value, tb):
1618 def excepthook(self, etype, value, tb):
1620 """One more defense for GUI apps that call sys.excepthook.
1619 """One more defense for GUI apps that call sys.excepthook.
1621
1620
1622 GUI frameworks like wxPython trap exceptions and call
1621 GUI frameworks like wxPython trap exceptions and call
1623 sys.excepthook themselves. I guess this is a feature that
1622 sys.excepthook themselves. I guess this is a feature that
1624 enables them to keep running after exceptions that would
1623 enables them to keep running after exceptions that would
1625 otherwise kill their mainloop. This is a bother for IPython
1624 otherwise kill their mainloop. This is a bother for IPython
1626 which excepts to catch all of the program exceptions with a try:
1625 which excepts to catch all of the program exceptions with a try:
1627 except: statement.
1626 except: statement.
1628
1627
1629 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1628 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1630 any app directly invokes sys.excepthook, it will look to the user like
1629 any app directly invokes sys.excepthook, it will look to the user like
1631 IPython crashed. In order to work around this, we can disable the
1630 IPython crashed. In order to work around this, we can disable the
1632 CrashHandler and replace it with this excepthook instead, which prints a
1631 CrashHandler and replace it with this excepthook instead, which prints a
1633 regular traceback using our InteractiveTB. In this fashion, apps which
1632 regular traceback using our InteractiveTB. In this fashion, apps which
1634 call sys.excepthook will generate a regular-looking exception from
1633 call sys.excepthook will generate a regular-looking exception from
1635 IPython, and the CrashHandler will only be triggered by real IPython
1634 IPython, and the CrashHandler will only be triggered by real IPython
1636 crashes.
1635 crashes.
1637
1636
1638 This hook should be used sparingly, only in places which are not likely
1637 This hook should be used sparingly, only in places which are not likely
1639 to be true IPython errors.
1638 to be true IPython errors.
1640 """
1639 """
1641 self.showtraceback((etype,value,tb),tb_offset=0)
1640 self.showtraceback((etype,value,tb),tb_offset=0)
1642
1641
1643 def _get_exc_info(self, exc_tuple=None):
1642 def _get_exc_info(self, exc_tuple=None):
1644 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1643 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1645
1644
1646 Ensures sys.last_type,value,traceback hold the exc_info we found,
1645 Ensures sys.last_type,value,traceback hold the exc_info we found,
1647 from whichever source.
1646 from whichever source.
1648
1647
1649 raises ValueError if none of these contain any information
1648 raises ValueError if none of these contain any information
1650 """
1649 """
1651 if exc_tuple is None:
1650 if exc_tuple is None:
1652 etype, value, tb = sys.exc_info()
1651 etype, value, tb = sys.exc_info()
1653 else:
1652 else:
1654 etype, value, tb = exc_tuple
1653 etype, value, tb = exc_tuple
1655
1654
1656 if etype is None:
1655 if etype is None:
1657 if hasattr(sys, 'last_type'):
1656 if hasattr(sys, 'last_type'):
1658 etype, value, tb = sys.last_type, sys.last_value, \
1657 etype, value, tb = sys.last_type, sys.last_value, \
1659 sys.last_traceback
1658 sys.last_traceback
1660
1659
1661 if etype is None:
1660 if etype is None:
1662 raise ValueError("No exception to find")
1661 raise ValueError("No exception to find")
1663
1662
1664 # Now store the exception info in sys.last_type etc.
1663 # Now store the exception info in sys.last_type etc.
1665 # WARNING: these variables are somewhat deprecated and not
1664 # WARNING: these variables are somewhat deprecated and not
1666 # necessarily safe to use in a threaded environment, but tools
1665 # necessarily safe to use in a threaded environment, but tools
1667 # like pdb depend on their existence, so let's set them. If we
1666 # like pdb depend on their existence, so let's set them. If we
1668 # find problems in the field, we'll need to revisit their use.
1667 # find problems in the field, we'll need to revisit their use.
1669 sys.last_type = etype
1668 sys.last_type = etype
1670 sys.last_value = value
1669 sys.last_value = value
1671 sys.last_traceback = tb
1670 sys.last_traceback = tb
1672
1671
1673 return etype, value, tb
1672 return etype, value, tb
1674
1673
1675 def show_usage_error(self, exc):
1674 def show_usage_error(self, exc):
1676 """Show a short message for UsageErrors
1675 """Show a short message for UsageErrors
1677
1676
1678 These are special exceptions that shouldn't show a traceback.
1677 These are special exceptions that shouldn't show a traceback.
1679 """
1678 """
1680 self.write_err("UsageError: %s" % exc)
1679 self.write_err("UsageError: %s" % exc)
1681
1680
1682 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1681 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1683 exception_only=False):
1682 exception_only=False):
1684 """Display the exception that just occurred.
1683 """Display the exception that just occurred.
1685
1684
1686 If nothing is known about the exception, this is the method which
1685 If nothing is known about the exception, this is the method which
1687 should be used throughout the code for presenting user tracebacks,
1686 should be used throughout the code for presenting user tracebacks,
1688 rather than directly invoking the InteractiveTB object.
1687 rather than directly invoking the InteractiveTB object.
1689
1688
1690 A specific showsyntaxerror() also exists, but this method can take
1689 A specific showsyntaxerror() also exists, but this method can take
1691 care of calling it if needed, so unless you are explicitly catching a
1690 care of calling it if needed, so unless you are explicitly catching a
1692 SyntaxError exception, don't try to analyze the stack manually and
1691 SyntaxError exception, don't try to analyze the stack manually and
1693 simply call this method."""
1692 simply call this method."""
1694
1693
1695 try:
1694 try:
1696 try:
1695 try:
1697 etype, value, tb = self._get_exc_info(exc_tuple)
1696 etype, value, tb = self._get_exc_info(exc_tuple)
1698 except ValueError:
1697 except ValueError:
1699 self.write_err('No traceback available to show.\n')
1698 self.write_err('No traceback available to show.\n')
1700 return
1699 return
1701
1700
1702 if issubclass(etype, SyntaxError):
1701 if issubclass(etype, SyntaxError):
1703 # Though this won't be called by syntax errors in the input
1702 # Though this won't be called by syntax errors in the input
1704 # line, there may be SyntaxError cases with imported code.
1703 # line, there may be SyntaxError cases with imported code.
1705 self.showsyntaxerror(filename)
1704 self.showsyntaxerror(filename)
1706 elif etype is UsageError:
1705 elif etype is UsageError:
1707 self.show_usage_error(value)
1706 self.show_usage_error(value)
1708 else:
1707 else:
1709 if exception_only:
1708 if exception_only:
1710 stb = ['An exception has occurred, use %tb to see '
1709 stb = ['An exception has occurred, use %tb to see '
1711 'the full traceback.\n']
1710 'the full traceback.\n']
1712 stb.extend(self.InteractiveTB.get_exception_only(etype,
1711 stb.extend(self.InteractiveTB.get_exception_only(etype,
1713 value))
1712 value))
1714 else:
1713 else:
1715 try:
1714 try:
1716 # Exception classes can customise their traceback - we
1715 # Exception classes can customise their traceback - we
1717 # use this in IPython.parallel for exceptions occurring
1716 # use this in IPython.parallel for exceptions occurring
1718 # in the engines. This should return a list of strings.
1717 # in the engines. This should return a list of strings.
1719 stb = value._render_traceback_()
1718 stb = value._render_traceback_()
1720 except Exception:
1719 except Exception:
1721 stb = self.InteractiveTB.structured_traceback(etype,
1720 stb = self.InteractiveTB.structured_traceback(etype,
1722 value, tb, tb_offset=tb_offset)
1721 value, tb, tb_offset=tb_offset)
1723
1722
1724 self._showtraceback(etype, value, stb)
1723 self._showtraceback(etype, value, stb)
1725 if self.call_pdb:
1724 if self.call_pdb:
1726 # drop into debugger
1725 # drop into debugger
1727 self.debugger(force=True)
1726 self.debugger(force=True)
1728 return
1727 return
1729
1728
1730 # Actually show the traceback
1729 # Actually show the traceback
1731 self._showtraceback(etype, value, stb)
1730 self._showtraceback(etype, value, stb)
1732
1731
1733 except KeyboardInterrupt:
1732 except KeyboardInterrupt:
1734 self.write_err("\nKeyboardInterrupt\n")
1733 self.write_err("\nKeyboardInterrupt\n")
1735
1734
1736 def _showtraceback(self, etype, evalue, stb):
1735 def _showtraceback(self, etype, evalue, stb):
1737 """Actually show a traceback.
1736 """Actually show a traceback.
1738
1737
1739 Subclasses may override this method to put the traceback on a different
1738 Subclasses may override this method to put the traceback on a different
1740 place, like a side channel.
1739 place, like a side channel.
1741 """
1740 """
1742 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1741 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1743
1742
1744 def showsyntaxerror(self, filename=None):
1743 def showsyntaxerror(self, filename=None):
1745 """Display the syntax error that just occurred.
1744 """Display the syntax error that just occurred.
1746
1745
1747 This doesn't display a stack trace because there isn't one.
1746 This doesn't display a stack trace because there isn't one.
1748
1747
1749 If a filename is given, it is stuffed in the exception instead
1748 If a filename is given, it is stuffed in the exception instead
1750 of what was there before (because Python's parser always uses
1749 of what was there before (because Python's parser always uses
1751 "<string>" when reading from a string).
1750 "<string>" when reading from a string).
1752 """
1751 """
1753 etype, value, last_traceback = self._get_exc_info()
1752 etype, value, last_traceback = self._get_exc_info()
1754
1753
1755 if filename and issubclass(etype, SyntaxError):
1754 if filename and issubclass(etype, SyntaxError):
1756 try:
1755 try:
1757 value.filename = filename
1756 value.filename = filename
1758 except:
1757 except:
1759 # Not the format we expect; leave it alone
1758 # Not the format we expect; leave it alone
1760 pass
1759 pass
1761
1760
1762 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1761 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1763 self._showtraceback(etype, value, stb)
1762 self._showtraceback(etype, value, stb)
1764
1763
1765 # This is overridden in TerminalInteractiveShell to show a message about
1764 # This is overridden in TerminalInteractiveShell to show a message about
1766 # the %paste magic.
1765 # the %paste magic.
1767 def showindentationerror(self):
1766 def showindentationerror(self):
1768 """Called by run_cell when there's an IndentationError in code entered
1767 """Called by run_cell when there's an IndentationError in code entered
1769 at the prompt.
1768 at the prompt.
1770
1769
1771 This is overridden in TerminalInteractiveShell to show a message about
1770 This is overridden in TerminalInteractiveShell to show a message about
1772 the %paste magic."""
1771 the %paste magic."""
1773 self.showsyntaxerror()
1772 self.showsyntaxerror()
1774
1773
1775 #-------------------------------------------------------------------------
1774 #-------------------------------------------------------------------------
1776 # Things related to readline
1775 # Things related to readline
1777 #-------------------------------------------------------------------------
1776 #-------------------------------------------------------------------------
1778
1777
1779 def init_readline(self):
1778 def init_readline(self):
1780 """Command history completion/saving/reloading."""
1779 """Command history completion/saving/reloading."""
1781
1780
1782 if self.readline_use:
1781 if self.readline_use:
1783 import IPython.utils.rlineimpl as readline
1782 import IPython.utils.rlineimpl as readline
1784
1783
1785 self.rl_next_input = None
1784 self.rl_next_input = None
1786 self.rl_do_indent = False
1785 self.rl_do_indent = False
1787
1786
1788 if not self.readline_use or not readline.have_readline:
1787 if not self.readline_use or not readline.have_readline:
1789 self.has_readline = False
1788 self.has_readline = False
1790 self.readline = None
1789 self.readline = None
1791 # Set a number of methods that depend on readline to be no-op
1790 # Set a number of methods that depend on readline to be no-op
1792 self.readline_no_record = no_op_context
1791 self.readline_no_record = no_op_context
1793 self.set_readline_completer = no_op
1792 self.set_readline_completer = no_op
1794 self.set_custom_completer = no_op
1793 self.set_custom_completer = no_op
1795 if self.readline_use:
1794 if self.readline_use:
1796 warn('Readline services not available or not loaded.')
1795 warn('Readline services not available or not loaded.')
1797 else:
1796 else:
1798 self.has_readline = True
1797 self.has_readline = True
1799 self.readline = readline
1798 self.readline = readline
1800 sys.modules['readline'] = readline
1799 sys.modules['readline'] = readline
1801
1800
1802 # Platform-specific configuration
1801 # Platform-specific configuration
1803 if os.name == 'nt':
1802 if os.name == 'nt':
1804 # FIXME - check with Frederick to see if we can harmonize
1803 # FIXME - check with Frederick to see if we can harmonize
1805 # naming conventions with pyreadline to avoid this
1804 # naming conventions with pyreadline to avoid this
1806 # platform-dependent check
1805 # platform-dependent check
1807 self.readline_startup_hook = readline.set_pre_input_hook
1806 self.readline_startup_hook = readline.set_pre_input_hook
1808 else:
1807 else:
1809 self.readline_startup_hook = readline.set_startup_hook
1808 self.readline_startup_hook = readline.set_startup_hook
1810
1809
1811 # Load user's initrc file (readline config)
1810 # Load user's initrc file (readline config)
1812 # Or if libedit is used, load editrc.
1811 # Or if libedit is used, load editrc.
1813 inputrc_name = os.environ.get('INPUTRC')
1812 inputrc_name = os.environ.get('INPUTRC')
1814 if inputrc_name is None:
1813 if inputrc_name is None:
1815 inputrc_name = '.inputrc'
1814 inputrc_name = '.inputrc'
1816 if readline.uses_libedit:
1815 if readline.uses_libedit:
1817 inputrc_name = '.editrc'
1816 inputrc_name = '.editrc'
1818 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1817 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1819 if os.path.isfile(inputrc_name):
1818 if os.path.isfile(inputrc_name):
1820 try:
1819 try:
1821 readline.read_init_file(inputrc_name)
1820 readline.read_init_file(inputrc_name)
1822 except:
1821 except:
1823 warn('Problems reading readline initialization file <%s>'
1822 warn('Problems reading readline initialization file <%s>'
1824 % inputrc_name)
1823 % inputrc_name)
1825
1824
1826 # Configure readline according to user's prefs
1825 # Configure readline according to user's prefs
1827 # This is only done if GNU readline is being used. If libedit
1826 # This is only done if GNU readline is being used. If libedit
1828 # is being used (as on Leopard) the readline config is
1827 # is being used (as on Leopard) the readline config is
1829 # not run as the syntax for libedit is different.
1828 # not run as the syntax for libedit is different.
1830 if not readline.uses_libedit:
1829 if not readline.uses_libedit:
1831 for rlcommand in self.readline_parse_and_bind:
1830 for rlcommand in self.readline_parse_and_bind:
1832 #print "loading rl:",rlcommand # dbg
1831 #print "loading rl:",rlcommand # dbg
1833 readline.parse_and_bind(rlcommand)
1832 readline.parse_and_bind(rlcommand)
1834
1833
1835 # Remove some chars from the delimiters list. If we encounter
1834 # Remove some chars from the delimiters list. If we encounter
1836 # unicode chars, discard them.
1835 # unicode chars, discard them.
1837 delims = readline.get_completer_delims()
1836 delims = readline.get_completer_delims()
1838 if not py3compat.PY3:
1837 if not py3compat.PY3:
1839 delims = delims.encode("ascii", "ignore")
1838 delims = delims.encode("ascii", "ignore")
1840 for d in self.readline_remove_delims:
1839 for d in self.readline_remove_delims:
1841 delims = delims.replace(d, "")
1840 delims = delims.replace(d, "")
1842 delims = delims.replace(ESC_MAGIC, '')
1841 delims = delims.replace(ESC_MAGIC, '')
1843 readline.set_completer_delims(delims)
1842 readline.set_completer_delims(delims)
1844 # Store these so we can restore them if something like rpy2 modifies
1843 # Store these so we can restore them if something like rpy2 modifies
1845 # them.
1844 # them.
1846 self.readline_delims = delims
1845 self.readline_delims = delims
1847 # otherwise we end up with a monster history after a while:
1846 # otherwise we end up with a monster history after a while:
1848 readline.set_history_length(self.history_length)
1847 readline.set_history_length(self.history_length)
1849
1848
1850 self.refill_readline_hist()
1849 self.refill_readline_hist()
1851 self.readline_no_record = ReadlineNoRecord(self)
1850 self.readline_no_record = ReadlineNoRecord(self)
1852
1851
1853 # Configure auto-indent for all platforms
1852 # Configure auto-indent for all platforms
1854 self.set_autoindent(self.autoindent)
1853 self.set_autoindent(self.autoindent)
1855
1854
1856 def refill_readline_hist(self):
1855 def refill_readline_hist(self):
1857 # Load the last 1000 lines from history
1856 # Load the last 1000 lines from history
1858 self.readline.clear_history()
1857 self.readline.clear_history()
1859 stdin_encoding = sys.stdin.encoding or "utf-8"
1858 stdin_encoding = sys.stdin.encoding or "utf-8"
1860 last_cell = u""
1859 last_cell = u""
1861 for _, _, cell in self.history_manager.get_tail(1000,
1860 for _, _, cell in self.history_manager.get_tail(1000,
1862 include_latest=True):
1861 include_latest=True):
1863 # Ignore blank lines and consecutive duplicates
1862 # Ignore blank lines and consecutive duplicates
1864 cell = cell.rstrip()
1863 cell = cell.rstrip()
1865 if cell and (cell != last_cell):
1864 if cell and (cell != last_cell):
1866 if self.multiline_history:
1865 if self.multiline_history:
1867 self.readline.add_history(py3compat.unicode_to_str(cell,
1866 self.readline.add_history(py3compat.unicode_to_str(cell,
1868 stdin_encoding))
1867 stdin_encoding))
1869 else:
1868 else:
1870 for line in cell.splitlines():
1869 for line in cell.splitlines():
1871 self.readline.add_history(py3compat.unicode_to_str(line,
1870 self.readline.add_history(py3compat.unicode_to_str(line,
1872 stdin_encoding))
1871 stdin_encoding))
1873 last_cell = cell
1872 last_cell = cell
1874
1873
1875 @skip_doctest
1874 @skip_doctest
1876 def set_next_input(self, s):
1875 def set_next_input(self, s):
1877 """ Sets the 'default' input string for the next command line.
1876 """ Sets the 'default' input string for the next command line.
1878
1877
1879 Requires readline.
1878 Requires readline.
1880
1879
1881 Example::
1880 Example::
1882
1881
1883 In [1]: _ip.set_next_input("Hello Word")
1882 In [1]: _ip.set_next_input("Hello Word")
1884 In [2]: Hello Word_ # cursor is here
1883 In [2]: Hello Word_ # cursor is here
1885 """
1884 """
1886 self.rl_next_input = py3compat.cast_bytes_py2(s)
1885 self.rl_next_input = py3compat.cast_bytes_py2(s)
1887
1886
1888 # Maybe move this to the terminal subclass?
1887 # Maybe move this to the terminal subclass?
1889 def pre_readline(self):
1888 def pre_readline(self):
1890 """readline hook to be used at the start of each line.
1889 """readline hook to be used at the start of each line.
1891
1890
1892 Currently it handles auto-indent only."""
1891 Currently it handles auto-indent only."""
1893
1892
1894 if self.rl_do_indent:
1893 if self.rl_do_indent:
1895 self.readline.insert_text(self._indent_current_str())
1894 self.readline.insert_text(self._indent_current_str())
1896 if self.rl_next_input is not None:
1895 if self.rl_next_input is not None:
1897 self.readline.insert_text(self.rl_next_input)
1896 self.readline.insert_text(self.rl_next_input)
1898 self.rl_next_input = None
1897 self.rl_next_input = None
1899
1898
1900 def _indent_current_str(self):
1899 def _indent_current_str(self):
1901 """return the current level of indentation as a string"""
1900 """return the current level of indentation as a string"""
1902 return self.input_splitter.indent_spaces * ' '
1901 return self.input_splitter.indent_spaces * ' '
1903
1902
1904 #-------------------------------------------------------------------------
1903 #-------------------------------------------------------------------------
1905 # Things related to text completion
1904 # Things related to text completion
1906 #-------------------------------------------------------------------------
1905 #-------------------------------------------------------------------------
1907
1906
1908 def init_completer(self):
1907 def init_completer(self):
1909 """Initialize the completion machinery.
1908 """Initialize the completion machinery.
1910
1909
1911 This creates completion machinery that can be used by client code,
1910 This creates completion machinery that can be used by client code,
1912 either interactively in-process (typically triggered by the readline
1911 either interactively in-process (typically triggered by the readline
1913 library), programatically (such as in test suites) or out-of-prcess
1912 library), programatically (such as in test suites) or out-of-prcess
1914 (typically over the network by remote frontends).
1913 (typically over the network by remote frontends).
1915 """
1914 """
1916 from IPython.core.completer import IPCompleter
1915 from IPython.core.completer import IPCompleter
1917 from IPython.core.completerlib import (module_completer,
1916 from IPython.core.completerlib import (module_completer,
1918 magic_run_completer, cd_completer, reset_completer)
1917 magic_run_completer, cd_completer, reset_completer)
1919
1918
1920 self.Completer = IPCompleter(shell=self,
1919 self.Completer = IPCompleter(shell=self,
1921 namespace=self.user_ns,
1920 namespace=self.user_ns,
1922 global_namespace=self.user_global_ns,
1921 global_namespace=self.user_global_ns,
1923 alias_table=self.alias_manager.alias_table,
1922 alias_table=self.alias_manager.alias_table,
1924 use_readline=self.has_readline,
1923 use_readline=self.has_readline,
1925 parent=self,
1924 parent=self,
1926 )
1925 )
1927 self.configurables.append(self.Completer)
1926 self.configurables.append(self.Completer)
1928
1927
1929 # Add custom completers to the basic ones built into IPCompleter
1928 # Add custom completers to the basic ones built into IPCompleter
1930 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1929 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1931 self.strdispatchers['complete_command'] = sdisp
1930 self.strdispatchers['complete_command'] = sdisp
1932 self.Completer.custom_completers = sdisp
1931 self.Completer.custom_completers = sdisp
1933
1932
1934 self.set_hook('complete_command', module_completer, str_key = 'import')
1933 self.set_hook('complete_command', module_completer, str_key = 'import')
1935 self.set_hook('complete_command', module_completer, str_key = 'from')
1934 self.set_hook('complete_command', module_completer, str_key = 'from')
1936 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1935 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1937 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1936 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1938 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1937 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1939
1938
1940 # Only configure readline if we truly are using readline. IPython can
1939 # Only configure readline if we truly are using readline. IPython can
1941 # do tab-completion over the network, in GUIs, etc, where readline
1940 # do tab-completion over the network, in GUIs, etc, where readline
1942 # itself may be absent
1941 # itself may be absent
1943 if self.has_readline:
1942 if self.has_readline:
1944 self.set_readline_completer()
1943 self.set_readline_completer()
1945
1944
1946 def complete(self, text, line=None, cursor_pos=None):
1945 def complete(self, text, line=None, cursor_pos=None):
1947 """Return the completed text and a list of completions.
1946 """Return the completed text and a list of completions.
1948
1947
1949 Parameters
1948 Parameters
1950 ----------
1949 ----------
1951
1950
1952 text : string
1951 text : string
1953 A string of text to be completed on. It can be given as empty and
1952 A string of text to be completed on. It can be given as empty and
1954 instead a line/position pair are given. In this case, the
1953 instead a line/position pair are given. In this case, the
1955 completer itself will split the line like readline does.
1954 completer itself will split the line like readline does.
1956
1955
1957 line : string, optional
1956 line : string, optional
1958 The complete line that text is part of.
1957 The complete line that text is part of.
1959
1958
1960 cursor_pos : int, optional
1959 cursor_pos : int, optional
1961 The position of the cursor on the input line.
1960 The position of the cursor on the input line.
1962
1961
1963 Returns
1962 Returns
1964 -------
1963 -------
1965 text : string
1964 text : string
1966 The actual text that was completed.
1965 The actual text that was completed.
1967
1966
1968 matches : list
1967 matches : list
1969 A sorted list with all possible completions.
1968 A sorted list with all possible completions.
1970
1969
1971 The optional arguments allow the completion to take more context into
1970 The optional arguments allow the completion to take more context into
1972 account, and are part of the low-level completion API.
1971 account, and are part of the low-level completion API.
1973
1972
1974 This is a wrapper around the completion mechanism, similar to what
1973 This is a wrapper around the completion mechanism, similar to what
1975 readline does at the command line when the TAB key is hit. By
1974 readline does at the command line when the TAB key is hit. By
1976 exposing it as a method, it can be used by other non-readline
1975 exposing it as a method, it can be used by other non-readline
1977 environments (such as GUIs) for text completion.
1976 environments (such as GUIs) for text completion.
1978
1977
1979 Simple usage example:
1978 Simple usage example:
1980
1979
1981 In [1]: x = 'hello'
1980 In [1]: x = 'hello'
1982
1981
1983 In [2]: _ip.complete('x.l')
1982 In [2]: _ip.complete('x.l')
1984 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
1983 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
1985 """
1984 """
1986
1985
1987 # Inject names into __builtin__ so we can complete on the added names.
1986 # Inject names into __builtin__ so we can complete on the added names.
1988 with self.builtin_trap:
1987 with self.builtin_trap:
1989 return self.Completer.complete(text, line, cursor_pos)
1988 return self.Completer.complete(text, line, cursor_pos)
1990
1989
1991 def set_custom_completer(self, completer, pos=0):
1990 def set_custom_completer(self, completer, pos=0):
1992 """Adds a new custom completer function.
1991 """Adds a new custom completer function.
1993
1992
1994 The position argument (defaults to 0) is the index in the completers
1993 The position argument (defaults to 0) is the index in the completers
1995 list where you want the completer to be inserted."""
1994 list where you want the completer to be inserted."""
1996
1995
1997 newcomp = types.MethodType(completer,self.Completer)
1996 newcomp = types.MethodType(completer,self.Completer)
1998 self.Completer.matchers.insert(pos,newcomp)
1997 self.Completer.matchers.insert(pos,newcomp)
1999
1998
2000 def set_readline_completer(self):
1999 def set_readline_completer(self):
2001 """Reset readline's completer to be our own."""
2000 """Reset readline's completer to be our own."""
2002 self.readline.set_completer(self.Completer.rlcomplete)
2001 self.readline.set_completer(self.Completer.rlcomplete)
2003
2002
2004 def set_completer_frame(self, frame=None):
2003 def set_completer_frame(self, frame=None):
2005 """Set the frame of the completer."""
2004 """Set the frame of the completer."""
2006 if frame:
2005 if frame:
2007 self.Completer.namespace = frame.f_locals
2006 self.Completer.namespace = frame.f_locals
2008 self.Completer.global_namespace = frame.f_globals
2007 self.Completer.global_namespace = frame.f_globals
2009 else:
2008 else:
2010 self.Completer.namespace = self.user_ns
2009 self.Completer.namespace = self.user_ns
2011 self.Completer.global_namespace = self.user_global_ns
2010 self.Completer.global_namespace = self.user_global_ns
2012
2011
2013 #-------------------------------------------------------------------------
2012 #-------------------------------------------------------------------------
2014 # Things related to magics
2013 # Things related to magics
2015 #-------------------------------------------------------------------------
2014 #-------------------------------------------------------------------------
2016
2015
2017 def init_magics(self):
2016 def init_magics(self):
2018 from IPython.core import magics as m
2017 from IPython.core import magics as m
2019 self.magics_manager = magic.MagicsManager(shell=self,
2018 self.magics_manager = magic.MagicsManager(shell=self,
2020 parent=self,
2019 parent=self,
2021 user_magics=m.UserMagics(self))
2020 user_magics=m.UserMagics(self))
2022 self.configurables.append(self.magics_manager)
2021 self.configurables.append(self.magics_manager)
2023
2022
2024 # Expose as public API from the magics manager
2023 # Expose as public API from the magics manager
2025 self.register_magics = self.magics_manager.register
2024 self.register_magics = self.magics_manager.register
2026 self.register_magic_function = self.magics_manager.register_function
2025 self.register_magic_function = self.magics_manager.register_function
2027 self.define_magic = self.magics_manager.define_magic
2026 self.define_magic = self.magics_manager.define_magic
2028
2027
2029 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2028 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2030 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2029 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2031 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2030 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2032 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2031 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2033 )
2032 )
2034
2033
2035 # Register Magic Aliases
2034 # Register Magic Aliases
2036 mman = self.magics_manager
2035 mman = self.magics_manager
2037 # FIXME: magic aliases should be defined by the Magics classes
2036 # FIXME: magic aliases should be defined by the Magics classes
2038 # or in MagicsManager, not here
2037 # or in MagicsManager, not here
2039 mman.register_alias('ed', 'edit')
2038 mman.register_alias('ed', 'edit')
2040 mman.register_alias('hist', 'history')
2039 mman.register_alias('hist', 'history')
2041 mman.register_alias('rep', 'recall')
2040 mman.register_alias('rep', 'recall')
2042 mman.register_alias('SVG', 'svg', 'cell')
2041 mman.register_alias('SVG', 'svg', 'cell')
2043 mman.register_alias('HTML', 'html', 'cell')
2042 mman.register_alias('HTML', 'html', 'cell')
2044 mman.register_alias('file', 'writefile', 'cell')
2043 mman.register_alias('file', 'writefile', 'cell')
2045
2044
2046 # FIXME: Move the color initialization to the DisplayHook, which
2045 # FIXME: Move the color initialization to the DisplayHook, which
2047 # should be split into a prompt manager and displayhook. We probably
2046 # should be split into a prompt manager and displayhook. We probably
2048 # even need a centralize colors management object.
2047 # even need a centralize colors management object.
2049 self.magic('colors %s' % self.colors)
2048 self.magic('colors %s' % self.colors)
2050
2049
2051 def run_line_magic(self, magic_name, line):
2050 def run_line_magic(self, magic_name, line):
2052 """Execute the given line magic.
2051 """Execute the given line magic.
2053
2052
2054 Parameters
2053 Parameters
2055 ----------
2054 ----------
2056 magic_name : str
2055 magic_name : str
2057 Name of the desired magic function, without '%' prefix.
2056 Name of the desired magic function, without '%' prefix.
2058
2057
2059 line : str
2058 line : str
2060 The rest of the input line as a single string.
2059 The rest of the input line as a single string.
2061 """
2060 """
2062 fn = self.find_line_magic(magic_name)
2061 fn = self.find_line_magic(magic_name)
2063 if fn is None:
2062 if fn is None:
2064 cm = self.find_cell_magic(magic_name)
2063 cm = self.find_cell_magic(magic_name)
2065 etpl = "Line magic function `%%%s` not found%s."
2064 etpl = "Line magic function `%%%s` not found%s."
2066 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2065 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2067 'did you mean that instead?)' % magic_name )
2066 'did you mean that instead?)' % magic_name )
2068 error(etpl % (magic_name, extra))
2067 error(etpl % (magic_name, extra))
2069 else:
2068 else:
2070 # Note: this is the distance in the stack to the user's frame.
2069 # Note: this is the distance in the stack to the user's frame.
2071 # This will need to be updated if the internal calling logic gets
2070 # This will need to be updated if the internal calling logic gets
2072 # refactored, or else we'll be expanding the wrong variables.
2071 # refactored, or else we'll be expanding the wrong variables.
2073 stack_depth = 2
2072 stack_depth = 2
2074 magic_arg_s = self.var_expand(line, stack_depth)
2073 magic_arg_s = self.var_expand(line, stack_depth)
2075 # Put magic args in a list so we can call with f(*a) syntax
2074 # Put magic args in a list so we can call with f(*a) syntax
2076 args = [magic_arg_s]
2075 args = [magic_arg_s]
2077 kwargs = {}
2076 kwargs = {}
2078 # Grab local namespace if we need it:
2077 # Grab local namespace if we need it:
2079 if getattr(fn, "needs_local_scope", False):
2078 if getattr(fn, "needs_local_scope", False):
2080 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2079 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2081 with self.builtin_trap:
2080 with self.builtin_trap:
2082 result = fn(*args,**kwargs)
2081 result = fn(*args,**kwargs)
2083 return result
2082 return result
2084
2083
2085 def run_cell_magic(self, magic_name, line, cell):
2084 def run_cell_magic(self, magic_name, line, cell):
2086 """Execute the given cell magic.
2085 """Execute the given cell magic.
2087
2086
2088 Parameters
2087 Parameters
2089 ----------
2088 ----------
2090 magic_name : str
2089 magic_name : str
2091 Name of the desired magic function, without '%' prefix.
2090 Name of the desired magic function, without '%' prefix.
2092
2091
2093 line : str
2092 line : str
2094 The rest of the first input line as a single string.
2093 The rest of the first input line as a single string.
2095
2094
2096 cell : str
2095 cell : str
2097 The body of the cell as a (possibly multiline) string.
2096 The body of the cell as a (possibly multiline) string.
2098 """
2097 """
2099 fn = self.find_cell_magic(magic_name)
2098 fn = self.find_cell_magic(magic_name)
2100 if fn is None:
2099 if fn is None:
2101 lm = self.find_line_magic(magic_name)
2100 lm = self.find_line_magic(magic_name)
2102 etpl = "Cell magic `%%{0}` not found{1}."
2101 etpl = "Cell magic `%%{0}` not found{1}."
2103 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2102 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2104 'did you mean that instead?)'.format(magic_name))
2103 'did you mean that instead?)'.format(magic_name))
2105 error(etpl.format(magic_name, extra))
2104 error(etpl.format(magic_name, extra))
2106 elif cell == '':
2105 elif cell == '':
2107 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2106 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2108 if self.find_line_magic(magic_name) is not None:
2107 if self.find_line_magic(magic_name) is not None:
2109 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2108 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2110 raise UsageError(message)
2109 raise UsageError(message)
2111 else:
2110 else:
2112 # Note: this is the distance in the stack to the user's frame.
2111 # Note: this is the distance in the stack to the user's frame.
2113 # This will need to be updated if the internal calling logic gets
2112 # This will need to be updated if the internal calling logic gets
2114 # refactored, or else we'll be expanding the wrong variables.
2113 # refactored, or else we'll be expanding the wrong variables.
2115 stack_depth = 2
2114 stack_depth = 2
2116 magic_arg_s = self.var_expand(line, stack_depth)
2115 magic_arg_s = self.var_expand(line, stack_depth)
2117 with self.builtin_trap:
2116 with self.builtin_trap:
2118 result = fn(magic_arg_s, cell)
2117 result = fn(magic_arg_s, cell)
2119 return result
2118 return result
2120
2119
2121 def find_line_magic(self, magic_name):
2120 def find_line_magic(self, magic_name):
2122 """Find and return a line magic by name.
2121 """Find and return a line magic by name.
2123
2122
2124 Returns None if the magic isn't found."""
2123 Returns None if the magic isn't found."""
2125 return self.magics_manager.magics['line'].get(magic_name)
2124 return self.magics_manager.magics['line'].get(magic_name)
2126
2125
2127 def find_cell_magic(self, magic_name):
2126 def find_cell_magic(self, magic_name):
2128 """Find and return a cell magic by name.
2127 """Find and return a cell magic by name.
2129
2128
2130 Returns None if the magic isn't found."""
2129 Returns None if the magic isn't found."""
2131 return self.magics_manager.magics['cell'].get(magic_name)
2130 return self.magics_manager.magics['cell'].get(magic_name)
2132
2131
2133 def find_magic(self, magic_name, magic_kind='line'):
2132 def find_magic(self, magic_name, magic_kind='line'):
2134 """Find and return a magic of the given type by name.
2133 """Find and return a magic of the given type by name.
2135
2134
2136 Returns None if the magic isn't found."""
2135 Returns None if the magic isn't found."""
2137 return self.magics_manager.magics[magic_kind].get(magic_name)
2136 return self.magics_manager.magics[magic_kind].get(magic_name)
2138
2137
2139 def magic(self, arg_s):
2138 def magic(self, arg_s):
2140 """DEPRECATED. Use run_line_magic() instead.
2139 """DEPRECATED. Use run_line_magic() instead.
2141
2140
2142 Call a magic function by name.
2141 Call a magic function by name.
2143
2142
2144 Input: a string containing the name of the magic function to call and
2143 Input: a string containing the name of the magic function to call and
2145 any additional arguments to be passed to the magic.
2144 any additional arguments to be passed to the magic.
2146
2145
2147 magic('name -opt foo bar') is equivalent to typing at the ipython
2146 magic('name -opt foo bar') is equivalent to typing at the ipython
2148 prompt:
2147 prompt:
2149
2148
2150 In[1]: %name -opt foo bar
2149 In[1]: %name -opt foo bar
2151
2150
2152 To call a magic without arguments, simply use magic('name').
2151 To call a magic without arguments, simply use magic('name').
2153
2152
2154 This provides a proper Python function to call IPython's magics in any
2153 This provides a proper Python function to call IPython's magics in any
2155 valid Python code you can type at the interpreter, including loops and
2154 valid Python code you can type at the interpreter, including loops and
2156 compound statements.
2155 compound statements.
2157 """
2156 """
2158 # TODO: should we issue a loud deprecation warning here?
2157 # TODO: should we issue a loud deprecation warning here?
2159 magic_name, _, magic_arg_s = arg_s.partition(' ')
2158 magic_name, _, magic_arg_s = arg_s.partition(' ')
2160 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2159 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2161 return self.run_line_magic(magic_name, magic_arg_s)
2160 return self.run_line_magic(magic_name, magic_arg_s)
2162
2161
2163 #-------------------------------------------------------------------------
2162 #-------------------------------------------------------------------------
2164 # Things related to macros
2163 # Things related to macros
2165 #-------------------------------------------------------------------------
2164 #-------------------------------------------------------------------------
2166
2165
2167 def define_macro(self, name, themacro):
2166 def define_macro(self, name, themacro):
2168 """Define a new macro
2167 """Define a new macro
2169
2168
2170 Parameters
2169 Parameters
2171 ----------
2170 ----------
2172 name : str
2171 name : str
2173 The name of the macro.
2172 The name of the macro.
2174 themacro : str or Macro
2173 themacro : str or Macro
2175 The action to do upon invoking the macro. If a string, a new
2174 The action to do upon invoking the macro. If a string, a new
2176 Macro object is created by passing the string to it.
2175 Macro object is created by passing the string to it.
2177 """
2176 """
2178
2177
2179 from IPython.core import macro
2178 from IPython.core import macro
2180
2179
2181 if isinstance(themacro, basestring):
2180 if isinstance(themacro, basestring):
2182 themacro = macro.Macro(themacro)
2181 themacro = macro.Macro(themacro)
2183 if not isinstance(themacro, macro.Macro):
2182 if not isinstance(themacro, macro.Macro):
2184 raise ValueError('A macro must be a string or a Macro instance.')
2183 raise ValueError('A macro must be a string or a Macro instance.')
2185 self.user_ns[name] = themacro
2184 self.user_ns[name] = themacro
2186
2185
2187 #-------------------------------------------------------------------------
2186 #-------------------------------------------------------------------------
2188 # Things related to the running of system commands
2187 # Things related to the running of system commands
2189 #-------------------------------------------------------------------------
2188 #-------------------------------------------------------------------------
2190
2189
2191 def system_piped(self, cmd):
2190 def system_piped(self, cmd):
2192 """Call the given cmd in a subprocess, piping stdout/err
2191 """Call the given cmd in a subprocess, piping stdout/err
2193
2192
2194 Parameters
2193 Parameters
2195 ----------
2194 ----------
2196 cmd : str
2195 cmd : str
2197 Command to execute (can not end in '&', as background processes are
2196 Command to execute (can not end in '&', as background processes are
2198 not supported. Should not be a command that expects input
2197 not supported. Should not be a command that expects input
2199 other than simple text.
2198 other than simple text.
2200 """
2199 """
2201 if cmd.rstrip().endswith('&'):
2200 if cmd.rstrip().endswith('&'):
2202 # this is *far* from a rigorous test
2201 # this is *far* from a rigorous test
2203 # We do not support backgrounding processes because we either use
2202 # We do not support backgrounding processes because we either use
2204 # pexpect or pipes to read from. Users can always just call
2203 # pexpect or pipes to read from. Users can always just call
2205 # os.system() or use ip.system=ip.system_raw
2204 # os.system() or use ip.system=ip.system_raw
2206 # if they really want a background process.
2205 # if they really want a background process.
2207 raise OSError("Background processes not supported.")
2206 raise OSError("Background processes not supported.")
2208
2207
2209 # we explicitly do NOT return the subprocess status code, because
2208 # we explicitly do NOT return the subprocess status code, because
2210 # a non-None value would trigger :func:`sys.displayhook` calls.
2209 # a non-None value would trigger :func:`sys.displayhook` calls.
2211 # Instead, we store the exit_code in user_ns.
2210 # Instead, we store the exit_code in user_ns.
2212 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2211 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2213
2212
2214 def system_raw(self, cmd):
2213 def system_raw(self, cmd):
2215 """Call the given cmd in a subprocess using os.system
2214 """Call the given cmd in a subprocess using os.system
2216
2215
2217 Parameters
2216 Parameters
2218 ----------
2217 ----------
2219 cmd : str
2218 cmd : str
2220 Command to execute.
2219 Command to execute.
2221 """
2220 """
2222 cmd = self.var_expand(cmd, depth=1)
2221 cmd = self.var_expand(cmd, depth=1)
2223 # protect os.system from UNC paths on Windows, which it can't handle:
2222 # protect os.system from UNC paths on Windows, which it can't handle:
2224 if sys.platform == 'win32':
2223 if sys.platform == 'win32':
2225 from IPython.utils._process_win32 import AvoidUNCPath
2224 from IPython.utils._process_win32 import AvoidUNCPath
2226 with AvoidUNCPath() as path:
2225 with AvoidUNCPath() as path:
2227 if path is not None:
2226 if path is not None:
2228 cmd = '"pushd %s &&"%s' % (path, cmd)
2227 cmd = '"pushd %s &&"%s' % (path, cmd)
2229 cmd = py3compat.unicode_to_str(cmd)
2228 cmd = py3compat.unicode_to_str(cmd)
2230 ec = os.system(cmd)
2229 ec = os.system(cmd)
2231 else:
2230 else:
2232 cmd = py3compat.unicode_to_str(cmd)
2231 cmd = py3compat.unicode_to_str(cmd)
2233 ec = os.system(cmd)
2232 ec = os.system(cmd)
2234 # The high byte is the exit code, the low byte is a signal number
2233 # The high byte is the exit code, the low byte is a signal number
2235 # that we discard for now. See the docs for os.wait()
2234 # that we discard for now. See the docs for os.wait()
2236 if ec > 255:
2235 if ec > 255:
2237 ec >>= 8
2236 ec >>= 8
2238
2237
2239 # We explicitly do NOT return the subprocess status code, because
2238 # We explicitly do NOT return the subprocess status code, because
2240 # a non-None value would trigger :func:`sys.displayhook` calls.
2239 # a non-None value would trigger :func:`sys.displayhook` calls.
2241 # Instead, we store the exit_code in user_ns.
2240 # Instead, we store the exit_code in user_ns.
2242 self.user_ns['_exit_code'] = ec
2241 self.user_ns['_exit_code'] = ec
2243
2242
2244 # use piped system by default, because it is better behaved
2243 # use piped system by default, because it is better behaved
2245 system = system_piped
2244 system = system_piped
2246
2245
2247 def getoutput(self, cmd, split=True, depth=0):
2246 def getoutput(self, cmd, split=True, depth=0):
2248 """Get output (possibly including stderr) from a subprocess.
2247 """Get output (possibly including stderr) from a subprocess.
2249
2248
2250 Parameters
2249 Parameters
2251 ----------
2250 ----------
2252 cmd : str
2251 cmd : str
2253 Command to execute (can not end in '&', as background processes are
2252 Command to execute (can not end in '&', as background processes are
2254 not supported.
2253 not supported.
2255 split : bool, optional
2254 split : bool, optional
2256 If True, split the output into an IPython SList. Otherwise, an
2255 If True, split the output into an IPython SList. Otherwise, an
2257 IPython LSString is returned. These are objects similar to normal
2256 IPython LSString is returned. These are objects similar to normal
2258 lists and strings, with a few convenience attributes for easier
2257 lists and strings, with a few convenience attributes for easier
2259 manipulation of line-based output. You can use '?' on them for
2258 manipulation of line-based output. You can use '?' on them for
2260 details.
2259 details.
2261 depth : int, optional
2260 depth : int, optional
2262 How many frames above the caller are the local variables which should
2261 How many frames above the caller are the local variables which should
2263 be expanded in the command string? The default (0) assumes that the
2262 be expanded in the command string? The default (0) assumes that the
2264 expansion variables are in the stack frame calling this function.
2263 expansion variables are in the stack frame calling this function.
2265 """
2264 """
2266 if cmd.rstrip().endswith('&'):
2265 if cmd.rstrip().endswith('&'):
2267 # this is *far* from a rigorous test
2266 # this is *far* from a rigorous test
2268 raise OSError("Background processes not supported.")
2267 raise OSError("Background processes not supported.")
2269 out = getoutput(self.var_expand(cmd, depth=depth+1))
2268 out = getoutput(self.var_expand(cmd, depth=depth+1))
2270 if split:
2269 if split:
2271 out = SList(out.splitlines())
2270 out = SList(out.splitlines())
2272 else:
2271 else:
2273 out = LSString(out)
2272 out = LSString(out)
2274 return out
2273 return out
2275
2274
2276 #-------------------------------------------------------------------------
2275 #-------------------------------------------------------------------------
2277 # Things related to aliases
2276 # Things related to aliases
2278 #-------------------------------------------------------------------------
2277 #-------------------------------------------------------------------------
2279
2278
2280 def init_alias(self):
2279 def init_alias(self):
2281 self.alias_manager = AliasManager(shell=self, parent=self)
2280 self.alias_manager = AliasManager(shell=self, parent=self)
2282 self.configurables.append(self.alias_manager)
2281 self.configurables.append(self.alias_manager)
2283 self.ns_table['alias'] = self.alias_manager.alias_table,
2282 self.ns_table['alias'] = self.alias_manager.alias_table,
2284
2283
2285 #-------------------------------------------------------------------------
2284 #-------------------------------------------------------------------------
2286 # Things related to extensions
2285 # Things related to extensions
2287 #-------------------------------------------------------------------------
2286 #-------------------------------------------------------------------------
2288
2287
2289 def init_extension_manager(self):
2288 def init_extension_manager(self):
2290 self.extension_manager = ExtensionManager(shell=self, parent=self)
2289 self.extension_manager = ExtensionManager(shell=self, parent=self)
2291 self.configurables.append(self.extension_manager)
2290 self.configurables.append(self.extension_manager)
2292
2291
2293 #-------------------------------------------------------------------------
2292 #-------------------------------------------------------------------------
2294 # Things related to payloads
2293 # Things related to payloads
2295 #-------------------------------------------------------------------------
2294 #-------------------------------------------------------------------------
2296
2295
2297 def init_payload(self):
2296 def init_payload(self):
2298 self.payload_manager = PayloadManager(parent=self)
2297 self.payload_manager = PayloadManager(parent=self)
2299 self.configurables.append(self.payload_manager)
2298 self.configurables.append(self.payload_manager)
2300
2299
2301 #-------------------------------------------------------------------------
2300 #-------------------------------------------------------------------------
2302 # Things related to the prefilter
2301 # Things related to the prefilter
2303 #-------------------------------------------------------------------------
2302 #-------------------------------------------------------------------------
2304
2303
2305 def init_prefilter(self):
2304 def init_prefilter(self):
2306 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2305 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2307 self.configurables.append(self.prefilter_manager)
2306 self.configurables.append(self.prefilter_manager)
2308 # Ultimately this will be refactored in the new interpreter code, but
2307 # Ultimately this will be refactored in the new interpreter code, but
2309 # for now, we should expose the main prefilter method (there's legacy
2308 # for now, we should expose the main prefilter method (there's legacy
2310 # code out there that may rely on this).
2309 # code out there that may rely on this).
2311 self.prefilter = self.prefilter_manager.prefilter_lines
2310 self.prefilter = self.prefilter_manager.prefilter_lines
2312
2311
2313 def auto_rewrite_input(self, cmd):
2312 def auto_rewrite_input(self, cmd):
2314 """Print to the screen the rewritten form of the user's command.
2313 """Print to the screen the rewritten form of the user's command.
2315
2314
2316 This shows visual feedback by rewriting input lines that cause
2315 This shows visual feedback by rewriting input lines that cause
2317 automatic calling to kick in, like::
2316 automatic calling to kick in, like::
2318
2317
2319 /f x
2318 /f x
2320
2319
2321 into::
2320 into::
2322
2321
2323 ------> f(x)
2322 ------> f(x)
2324
2323
2325 after the user's input prompt. This helps the user understand that the
2324 after the user's input prompt. This helps the user understand that the
2326 input line was transformed automatically by IPython.
2325 input line was transformed automatically by IPython.
2327 """
2326 """
2328 if not self.show_rewritten_input:
2327 if not self.show_rewritten_input:
2329 return
2328 return
2330
2329
2331 rw = self.prompt_manager.render('rewrite') + cmd
2330 rw = self.prompt_manager.render('rewrite') + cmd
2332
2331
2333 try:
2332 try:
2334 # plain ascii works better w/ pyreadline, on some machines, so
2333 # plain ascii works better w/ pyreadline, on some machines, so
2335 # we use it and only print uncolored rewrite if we have unicode
2334 # we use it and only print uncolored rewrite if we have unicode
2336 rw = str(rw)
2335 rw = str(rw)
2337 print(rw, file=io.stdout)
2336 print(rw, file=io.stdout)
2338 except UnicodeEncodeError:
2337 except UnicodeEncodeError:
2339 print("------> " + cmd)
2338 print("------> " + cmd)
2340
2339
2341 #-------------------------------------------------------------------------
2340 #-------------------------------------------------------------------------
2342 # Things related to extracting values/expressions from kernel and user_ns
2341 # Things related to extracting values/expressions from kernel and user_ns
2343 #-------------------------------------------------------------------------
2342 #-------------------------------------------------------------------------
2344
2343
2345 def _user_obj_error(self):
2344 def _user_obj_error(self):
2346 """return simple exception dict
2345 """return simple exception dict
2347
2346
2348 for use in user_variables / expressions
2347 for use in user_variables / expressions
2349 """
2348 """
2350
2349
2351 etype, evalue, tb = self._get_exc_info()
2350 etype, evalue, tb = self._get_exc_info()
2352 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2351 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2353
2352
2354 exc_info = {
2353 exc_info = {
2355 u'status' : 'error',
2354 u'status' : 'error',
2356 u'traceback' : stb,
2355 u'traceback' : stb,
2357 u'ename' : unicode(etype.__name__),
2356 u'ename' : unicode(etype.__name__),
2358 u'evalue' : py3compat.safe_unicode(evalue),
2357 u'evalue' : py3compat.safe_unicode(evalue),
2359 }
2358 }
2360
2359
2361 return exc_info
2360 return exc_info
2362
2361
2363 def _format_user_obj(self, obj):
2362 def _format_user_obj(self, obj):
2364 """format a user object to display dict
2363 """format a user object to display dict
2365
2364
2366 for use in user_expressions / variables
2365 for use in user_expressions / variables
2367 """
2366 """
2368
2367
2369 data, md = self.display_formatter.format(obj)
2368 data, md = self.display_formatter.format(obj)
2370 value = {
2369 value = {
2371 'status' : 'ok',
2370 'status' : 'ok',
2372 'data' : data,
2371 'data' : data,
2373 'metadata' : md,
2372 'metadata' : md,
2374 }
2373 }
2375 return value
2374 return value
2376
2375
2377 def user_variables(self, names):
2376 def user_variables(self, names):
2378 """Get a list of variable names from the user's namespace.
2377 """Get a list of variable names from the user's namespace.
2379
2378
2380 Parameters
2379 Parameters
2381 ----------
2380 ----------
2382 names : list of strings
2381 names : list of strings
2383 A list of names of variables to be read from the user namespace.
2382 A list of names of variables to be read from the user namespace.
2384
2383
2385 Returns
2384 Returns
2386 -------
2385 -------
2387 A dict, keyed by the input names and with the rich mime-type repr(s) of each value.
2386 A dict, keyed by the input names and with the rich mime-type repr(s) of each value.
2388 Each element will be a sub-dict of the same form as a display_data message.
2387 Each element will be a sub-dict of the same form as a display_data message.
2389 """
2388 """
2390 out = {}
2389 out = {}
2391 user_ns = self.user_ns
2390 user_ns = self.user_ns
2392
2391
2393 for varname in names:
2392 for varname in names:
2394 try:
2393 try:
2395 value = self._format_user_obj(user_ns[varname])
2394 value = self._format_user_obj(user_ns[varname])
2396 except:
2395 except:
2397 value = self._user_obj_error()
2396 value = self._user_obj_error()
2398 out[varname] = value
2397 out[varname] = value
2399 return out
2398 return out
2400
2399
2401 def user_expressions(self, expressions):
2400 def user_expressions(self, expressions):
2402 """Evaluate a dict of expressions in the user's namespace.
2401 """Evaluate a dict of expressions in the user's namespace.
2403
2402
2404 Parameters
2403 Parameters
2405 ----------
2404 ----------
2406 expressions : dict
2405 expressions : dict
2407 A dict with string keys and string values. The expression values
2406 A dict with string keys and string values. The expression values
2408 should be valid Python expressions, each of which will be evaluated
2407 should be valid Python expressions, each of which will be evaluated
2409 in the user namespace.
2408 in the user namespace.
2410
2409
2411 Returns
2410 Returns
2412 -------
2411 -------
2413 A dict, keyed like the input expressions dict, with the rich mime-typed
2412 A dict, keyed like the input expressions dict, with the rich mime-typed
2414 display_data of each value.
2413 display_data of each value.
2415 """
2414 """
2416 out = {}
2415 out = {}
2417 user_ns = self.user_ns
2416 user_ns = self.user_ns
2418 global_ns = self.user_global_ns
2417 global_ns = self.user_global_ns
2419
2418
2420 for key, expr in expressions.iteritems():
2419 for key, expr in expressions.iteritems():
2421 try:
2420 try:
2422 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2421 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2423 except:
2422 except:
2424 value = self._user_obj_error()
2423 value = self._user_obj_error()
2425 out[key] = value
2424 out[key] = value
2426 return out
2425 return out
2427
2426
2428 #-------------------------------------------------------------------------
2427 #-------------------------------------------------------------------------
2429 # Things related to the running of code
2428 # Things related to the running of code
2430 #-------------------------------------------------------------------------
2429 #-------------------------------------------------------------------------
2431
2430
2432 def ex(self, cmd):
2431 def ex(self, cmd):
2433 """Execute a normal python statement in user namespace."""
2432 """Execute a normal python statement in user namespace."""
2434 with self.builtin_trap:
2433 with self.builtin_trap:
2435 exec cmd in self.user_global_ns, self.user_ns
2434 exec cmd in self.user_global_ns, self.user_ns
2436
2435
2437 def ev(self, expr):
2436 def ev(self, expr):
2438 """Evaluate python expression expr in user namespace.
2437 """Evaluate python expression expr in user namespace.
2439
2438
2440 Returns the result of evaluation
2439 Returns the result of evaluation
2441 """
2440 """
2442 with self.builtin_trap:
2441 with self.builtin_trap:
2443 return eval(expr, self.user_global_ns, self.user_ns)
2442 return eval(expr, self.user_global_ns, self.user_ns)
2444
2443
2445 def safe_execfile(self, fname, *where, **kw):
2444 def safe_execfile(self, fname, *where, **kw):
2446 """A safe version of the builtin execfile().
2445 """A safe version of the builtin execfile().
2447
2446
2448 This version will never throw an exception, but instead print
2447 This version will never throw an exception, but instead print
2449 helpful error messages to the screen. This only works on pure
2448 helpful error messages to the screen. This only works on pure
2450 Python files with the .py extension.
2449 Python files with the .py extension.
2451
2450
2452 Parameters
2451 Parameters
2453 ----------
2452 ----------
2454 fname : string
2453 fname : string
2455 The name of the file to be executed.
2454 The name of the file to be executed.
2456 where : tuple
2455 where : tuple
2457 One or two namespaces, passed to execfile() as (globals,locals).
2456 One or two namespaces, passed to execfile() as (globals,locals).
2458 If only one is given, it is passed as both.
2457 If only one is given, it is passed as both.
2459 exit_ignore : bool (False)
2458 exit_ignore : bool (False)
2460 If True, then silence SystemExit for non-zero status (it is always
2459 If True, then silence SystemExit for non-zero status (it is always
2461 silenced for zero status, as it is so common).
2460 silenced for zero status, as it is so common).
2462 raise_exceptions : bool (False)
2461 raise_exceptions : bool (False)
2463 If True raise exceptions everywhere. Meant for testing.
2462 If True raise exceptions everywhere. Meant for testing.
2464
2463
2465 """
2464 """
2466 kw.setdefault('exit_ignore', False)
2465 kw.setdefault('exit_ignore', False)
2467 kw.setdefault('raise_exceptions', False)
2466 kw.setdefault('raise_exceptions', False)
2468
2467
2469 fname = os.path.abspath(os.path.expanduser(fname))
2468 fname = os.path.abspath(os.path.expanduser(fname))
2470
2469
2471 # Make sure we can open the file
2470 # Make sure we can open the file
2472 try:
2471 try:
2473 with open(fname) as thefile:
2472 with open(fname) as thefile:
2474 pass
2473 pass
2475 except:
2474 except:
2476 warn('Could not open file <%s> for safe execution.' % fname)
2475 warn('Could not open file <%s> for safe execution.' % fname)
2477 return
2476 return
2478
2477
2479 # Find things also in current directory. This is needed to mimic the
2478 # Find things also in current directory. This is needed to mimic the
2480 # behavior of running a script from the system command line, where
2479 # behavior of running a script from the system command line, where
2481 # Python inserts the script's directory into sys.path
2480 # Python inserts the script's directory into sys.path
2482 dname = os.path.dirname(fname)
2481 dname = os.path.dirname(fname)
2483
2482
2484 with prepended_to_syspath(dname):
2483 with prepended_to_syspath(dname):
2485 try:
2484 try:
2486 py3compat.execfile(fname,*where)
2485 py3compat.execfile(fname,*where)
2487 except SystemExit as status:
2486 except SystemExit as status:
2488 # If the call was made with 0 or None exit status (sys.exit(0)
2487 # If the call was made with 0 or None exit status (sys.exit(0)
2489 # or sys.exit() ), don't bother showing a traceback, as both of
2488 # or sys.exit() ), don't bother showing a traceback, as both of
2490 # these are considered normal by the OS:
2489 # these are considered normal by the OS:
2491 # > python -c'import sys;sys.exit(0)'; echo $?
2490 # > python -c'import sys;sys.exit(0)'; echo $?
2492 # 0
2491 # 0
2493 # > python -c'import sys;sys.exit()'; echo $?
2492 # > python -c'import sys;sys.exit()'; echo $?
2494 # 0
2493 # 0
2495 # For other exit status, we show the exception unless
2494 # For other exit status, we show the exception unless
2496 # explicitly silenced, but only in short form.
2495 # explicitly silenced, but only in short form.
2497 if kw['raise_exceptions']:
2496 if kw['raise_exceptions']:
2498 raise
2497 raise
2499 if status.code and not kw['exit_ignore']:
2498 if status.code and not kw['exit_ignore']:
2500 self.showtraceback(exception_only=True)
2499 self.showtraceback(exception_only=True)
2501 except:
2500 except:
2502 if kw['raise_exceptions']:
2501 if kw['raise_exceptions']:
2503 raise
2502 raise
2504 self.showtraceback()
2503 self.showtraceback()
2505
2504
2506 def safe_execfile_ipy(self, fname):
2505 def safe_execfile_ipy(self, fname):
2507 """Like safe_execfile, but for .ipy files with IPython syntax.
2506 """Like safe_execfile, but for .ipy files with IPython syntax.
2508
2507
2509 Parameters
2508 Parameters
2510 ----------
2509 ----------
2511 fname : str
2510 fname : str
2512 The name of the file to execute. The filename must have a
2511 The name of the file to execute. The filename must have a
2513 .ipy extension.
2512 .ipy extension.
2514 """
2513 """
2515 fname = os.path.abspath(os.path.expanduser(fname))
2514 fname = os.path.abspath(os.path.expanduser(fname))
2516
2515
2517 # Make sure we can open the file
2516 # Make sure we can open the file
2518 try:
2517 try:
2519 with open(fname) as thefile:
2518 with open(fname) as thefile:
2520 pass
2519 pass
2521 except:
2520 except:
2522 warn('Could not open file <%s> for safe execution.' % fname)
2521 warn('Could not open file <%s> for safe execution.' % fname)
2523 return
2522 return
2524
2523
2525 # Find things also in current directory. This is needed to mimic the
2524 # Find things also in current directory. This is needed to mimic the
2526 # behavior of running a script from the system command line, where
2525 # behavior of running a script from the system command line, where
2527 # Python inserts the script's directory into sys.path
2526 # Python inserts the script's directory into sys.path
2528 dname = os.path.dirname(fname)
2527 dname = os.path.dirname(fname)
2529
2528
2530 with prepended_to_syspath(dname):
2529 with prepended_to_syspath(dname):
2531 try:
2530 try:
2532 with open(fname) as thefile:
2531 with open(fname) as thefile:
2533 # self.run_cell currently captures all exceptions
2532 # self.run_cell currently captures all exceptions
2534 # raised in user code. It would be nice if there were
2533 # raised in user code. It would be nice if there were
2535 # versions of runlines, execfile that did raise, so
2534 # versions of runlines, execfile that did raise, so
2536 # we could catch the errors.
2535 # we could catch the errors.
2537 self.run_cell(thefile.read(), store_history=False, shell_futures=False)
2536 self.run_cell(thefile.read(), store_history=False, shell_futures=False)
2538 except:
2537 except:
2539 self.showtraceback()
2538 self.showtraceback()
2540 warn('Unknown failure executing file: <%s>' % fname)
2539 warn('Unknown failure executing file: <%s>' % fname)
2541
2540
2542 def safe_run_module(self, mod_name, where):
2541 def safe_run_module(self, mod_name, where):
2543 """A safe version of runpy.run_module().
2542 """A safe version of runpy.run_module().
2544
2543
2545 This version will never throw an exception, but instead print
2544 This version will never throw an exception, but instead print
2546 helpful error messages to the screen.
2545 helpful error messages to the screen.
2547
2546
2548 `SystemExit` exceptions with status code 0 or None are ignored.
2547 `SystemExit` exceptions with status code 0 or None are ignored.
2549
2548
2550 Parameters
2549 Parameters
2551 ----------
2550 ----------
2552 mod_name : string
2551 mod_name : string
2553 The name of the module to be executed.
2552 The name of the module to be executed.
2554 where : dict
2553 where : dict
2555 The globals namespace.
2554 The globals namespace.
2556 """
2555 """
2557 try:
2556 try:
2558 try:
2557 try:
2559 where.update(
2558 where.update(
2560 runpy.run_module(str(mod_name), run_name="__main__",
2559 runpy.run_module(str(mod_name), run_name="__main__",
2561 alter_sys=True)
2560 alter_sys=True)
2562 )
2561 )
2563 except SystemExit as status:
2562 except SystemExit as status:
2564 if status.code:
2563 if status.code:
2565 raise
2564 raise
2566 except:
2565 except:
2567 self.showtraceback()
2566 self.showtraceback()
2568 warn('Unknown failure executing module: <%s>' % mod_name)
2567 warn('Unknown failure executing module: <%s>' % mod_name)
2569
2568
2570 def _run_cached_cell_magic(self, magic_name, line):
2569 def _run_cached_cell_magic(self, magic_name, line):
2571 """Special method to call a cell magic with the data stored in self.
2570 """Special method to call a cell magic with the data stored in self.
2572 """
2571 """
2573 cell = self._current_cell_magic_body
2572 cell = self._current_cell_magic_body
2574 self._current_cell_magic_body = None
2573 self._current_cell_magic_body = None
2575 return self.run_cell_magic(magic_name, line, cell)
2574 return self.run_cell_magic(magic_name, line, cell)
2576
2575
2577 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2576 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2578 """Run a complete IPython cell.
2577 """Run a complete IPython cell.
2579
2578
2580 Parameters
2579 Parameters
2581 ----------
2580 ----------
2582 raw_cell : str
2581 raw_cell : str
2583 The code (including IPython code such as %magic functions) to run.
2582 The code (including IPython code such as %magic functions) to run.
2584 store_history : bool
2583 store_history : bool
2585 If True, the raw and translated cell will be stored in IPython's
2584 If True, the raw and translated cell will be stored in IPython's
2586 history. For user code calling back into IPython's machinery, this
2585 history. For user code calling back into IPython's machinery, this
2587 should be set to False.
2586 should be set to False.
2588 silent : bool
2587 silent : bool
2589 If True, avoid side-effects, such as implicit displayhooks and
2588 If True, avoid side-effects, such as implicit displayhooks and
2590 and logging. silent=True forces store_history=False.
2589 and logging. silent=True forces store_history=False.
2591 shell_futures : bool
2590 shell_futures : bool
2592 If True, the code will share future statements with the interactive
2591 If True, the code will share future statements with the interactive
2593 shell. It will both be affected by previous __future__ imports, and
2592 shell. It will both be affected by previous __future__ imports, and
2594 any __future__ imports in the code will affect the shell. If False,
2593 any __future__ imports in the code will affect the shell. If False,
2595 __future__ imports are not shared in either direction.
2594 __future__ imports are not shared in either direction.
2596 """
2595 """
2597 if (not raw_cell) or raw_cell.isspace():
2596 if (not raw_cell) or raw_cell.isspace():
2598 return
2597 return
2599
2598
2600 if silent:
2599 if silent:
2601 store_history = False
2600 store_history = False
2602
2601
2603 self.input_transformer_manager.push(raw_cell)
2602 self.input_transformer_manager.push(raw_cell)
2604 cell = self.input_transformer_manager.source_reset()
2603 cell = self.input_transformer_manager.source_reset()
2605
2604
2606 # Our own compiler remembers the __future__ environment. If we want to
2605 # Our own compiler remembers the __future__ environment. If we want to
2607 # run code with a separate __future__ environment, use the default
2606 # run code with a separate __future__ environment, use the default
2608 # compiler
2607 # compiler
2609 compiler = self.compile if shell_futures else CachingCompiler()
2608 compiler = self.compile if shell_futures else CachingCompiler()
2610
2609
2611 with self.builtin_trap:
2610 with self.builtin_trap:
2612 prefilter_failed = False
2611 prefilter_failed = False
2613 if len(cell.splitlines()) == 1:
2612 if len(cell.splitlines()) == 1:
2614 try:
2613 try:
2615 # use prefilter_lines to handle trailing newlines
2614 # use prefilter_lines to handle trailing newlines
2616 # restore trailing newline for ast.parse
2615 # restore trailing newline for ast.parse
2617 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2616 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2618 except AliasError as e:
2617 except AliasError as e:
2619 error(e)
2618 error(e)
2620 prefilter_failed = True
2619 prefilter_failed = True
2621 except Exception:
2620 except Exception:
2622 # don't allow prefilter errors to crash IPython
2621 # don't allow prefilter errors to crash IPython
2623 self.showtraceback()
2622 self.showtraceback()
2624 prefilter_failed = True
2623 prefilter_failed = True
2625
2624
2626 # Store raw and processed history
2625 # Store raw and processed history
2627 if store_history:
2626 if store_history:
2628 self.history_manager.store_inputs(self.execution_count,
2627 self.history_manager.store_inputs(self.execution_count,
2629 cell, raw_cell)
2628 cell, raw_cell)
2630 if not silent:
2629 if not silent:
2631 self.logger.log(cell, raw_cell)
2630 self.logger.log(cell, raw_cell)
2632
2631
2633 if not prefilter_failed:
2632 if not prefilter_failed:
2634 # don't run if prefilter failed
2633 # don't run if prefilter failed
2635 cell_name = self.compile.cache(cell, self.execution_count)
2634 cell_name = self.compile.cache(cell, self.execution_count)
2636
2635
2637 with self.display_trap:
2636 with self.display_trap:
2638 try:
2637 try:
2639 code_ast = compiler.ast_parse(cell, filename=cell_name)
2638 code_ast = compiler.ast_parse(cell, filename=cell_name)
2640 except IndentationError:
2639 except IndentationError:
2641 self.showindentationerror()
2640 self.showindentationerror()
2642 if store_history:
2641 if store_history:
2643 self.execution_count += 1
2642 self.execution_count += 1
2644 return None
2643 return None
2645 except (OverflowError, SyntaxError, ValueError, TypeError,
2644 except (OverflowError, SyntaxError, ValueError, TypeError,
2646 MemoryError):
2645 MemoryError):
2647 self.showsyntaxerror()
2646 self.showsyntaxerror()
2648 if store_history:
2647 if store_history:
2649 self.execution_count += 1
2648 self.execution_count += 1
2650 return None
2649 return None
2651
2650
2652 code_ast = self.transform_ast(code_ast)
2651 code_ast = self.transform_ast(code_ast)
2653
2652
2654 interactivity = "none" if silent else self.ast_node_interactivity
2653 interactivity = "none" if silent else self.ast_node_interactivity
2655 self.run_ast_nodes(code_ast.body, cell_name,
2654 self.run_ast_nodes(code_ast.body, cell_name,
2656 interactivity=interactivity, compiler=compiler)
2655 interactivity=interactivity, compiler=compiler)
2657
2656
2658 # Execute any registered post-execution functions.
2657 # Execute any registered post-execution functions.
2659 # unless we are silent
2658 # unless we are silent
2660 post_exec = [] if silent else self._post_execute.iteritems()
2659 post_exec = [] if silent else self._post_execute.iteritems()
2661
2660
2662 for func, status in post_exec:
2661 for func, status in post_exec:
2663 if self.disable_failing_post_execute and not status:
2662 if self.disable_failing_post_execute and not status:
2664 continue
2663 continue
2665 try:
2664 try:
2666 func()
2665 func()
2667 except KeyboardInterrupt:
2666 except KeyboardInterrupt:
2668 print("\nKeyboardInterrupt", file=io.stderr)
2667 print("\nKeyboardInterrupt", file=io.stderr)
2669 except Exception:
2668 except Exception:
2670 # register as failing:
2669 # register as failing:
2671 self._post_execute[func] = False
2670 self._post_execute[func] = False
2672 self.showtraceback()
2671 self.showtraceback()
2673 print('\n'.join([
2672 print('\n'.join([
2674 "post-execution function %r produced an error." % func,
2673 "post-execution function %r produced an error." % func,
2675 "If this problem persists, you can disable failing post-exec functions with:",
2674 "If this problem persists, you can disable failing post-exec functions with:",
2676 "",
2675 "",
2677 " get_ipython().disable_failing_post_execute = True"
2676 " get_ipython().disable_failing_post_execute = True"
2678 ]), file=io.stderr)
2677 ]), file=io.stderr)
2679
2678
2680 if store_history:
2679 if store_history:
2681 # Write output to the database. Does nothing unless
2680 # Write output to the database. Does nothing unless
2682 # history output logging is enabled.
2681 # history output logging is enabled.
2683 self.history_manager.store_output(self.execution_count)
2682 self.history_manager.store_output(self.execution_count)
2684 # Each cell is a *single* input, regardless of how many lines it has
2683 # Each cell is a *single* input, regardless of how many lines it has
2685 self.execution_count += 1
2684 self.execution_count += 1
2686
2685
2687 def transform_ast(self, node):
2686 def transform_ast(self, node):
2688 """Apply the AST transformations from self.ast_transformers
2687 """Apply the AST transformations from self.ast_transformers
2689
2688
2690 Parameters
2689 Parameters
2691 ----------
2690 ----------
2692 node : ast.Node
2691 node : ast.Node
2693 The root node to be transformed. Typically called with the ast.Module
2692 The root node to be transformed. Typically called with the ast.Module
2694 produced by parsing user input.
2693 produced by parsing user input.
2695
2694
2696 Returns
2695 Returns
2697 -------
2696 -------
2698 An ast.Node corresponding to the node it was called with. Note that it
2697 An ast.Node corresponding to the node it was called with. Note that it
2699 may also modify the passed object, so don't rely on references to the
2698 may also modify the passed object, so don't rely on references to the
2700 original AST.
2699 original AST.
2701 """
2700 """
2702 for transformer in self.ast_transformers:
2701 for transformer in self.ast_transformers:
2703 try:
2702 try:
2704 node = transformer.visit(node)
2703 node = transformer.visit(node)
2705 except Exception:
2704 except Exception:
2706 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2705 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2707 self.ast_transformers.remove(transformer)
2706 self.ast_transformers.remove(transformer)
2708
2707
2709 if self.ast_transformers:
2708 if self.ast_transformers:
2710 ast.fix_missing_locations(node)
2709 ast.fix_missing_locations(node)
2711 return node
2710 return node
2712
2711
2713
2712
2714 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2713 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2715 compiler=compile):
2714 compiler=compile):
2716 """Run a sequence of AST nodes. The execution mode depends on the
2715 """Run a sequence of AST nodes. The execution mode depends on the
2717 interactivity parameter.
2716 interactivity parameter.
2718
2717
2719 Parameters
2718 Parameters
2720 ----------
2719 ----------
2721 nodelist : list
2720 nodelist : list
2722 A sequence of AST nodes to run.
2721 A sequence of AST nodes to run.
2723 cell_name : str
2722 cell_name : str
2724 Will be passed to the compiler as the filename of the cell. Typically
2723 Will be passed to the compiler as the filename of the cell. Typically
2725 the value returned by ip.compile.cache(cell).
2724 the value returned by ip.compile.cache(cell).
2726 interactivity : str
2725 interactivity : str
2727 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2726 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2728 run interactively (displaying output from expressions). 'last_expr'
2727 run interactively (displaying output from expressions). 'last_expr'
2729 will run the last node interactively only if it is an expression (i.e.
2728 will run the last node interactively only if it is an expression (i.e.
2730 expressions in loops or other blocks are not displayed. Other values
2729 expressions in loops or other blocks are not displayed. Other values
2731 for this parameter will raise a ValueError.
2730 for this parameter will raise a ValueError.
2732 compiler : callable
2731 compiler : callable
2733 A function with the same interface as the built-in compile(), to turn
2732 A function with the same interface as the built-in compile(), to turn
2734 the AST nodes into code objects. Default is the built-in compile().
2733 the AST nodes into code objects. Default is the built-in compile().
2735 """
2734 """
2736 if not nodelist:
2735 if not nodelist:
2737 return
2736 return
2738
2737
2739 if interactivity == 'last_expr':
2738 if interactivity == 'last_expr':
2740 if isinstance(nodelist[-1], ast.Expr):
2739 if isinstance(nodelist[-1], ast.Expr):
2741 interactivity = "last"
2740 interactivity = "last"
2742 else:
2741 else:
2743 interactivity = "none"
2742 interactivity = "none"
2744
2743
2745 if interactivity == 'none':
2744 if interactivity == 'none':
2746 to_run_exec, to_run_interactive = nodelist, []
2745 to_run_exec, to_run_interactive = nodelist, []
2747 elif interactivity == 'last':
2746 elif interactivity == 'last':
2748 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2747 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2749 elif interactivity == 'all':
2748 elif interactivity == 'all':
2750 to_run_exec, to_run_interactive = [], nodelist
2749 to_run_exec, to_run_interactive = [], nodelist
2751 else:
2750 else:
2752 raise ValueError("Interactivity was %r" % interactivity)
2751 raise ValueError("Interactivity was %r" % interactivity)
2753
2752
2754 exec_count = self.execution_count
2753 exec_count = self.execution_count
2755
2754
2756 try:
2755 try:
2757 for i, node in enumerate(to_run_exec):
2756 for i, node in enumerate(to_run_exec):
2758 mod = ast.Module([node])
2757 mod = ast.Module([node])
2759 code = compiler(mod, cell_name, "exec")
2758 code = compiler(mod, cell_name, "exec")
2760 if self.run_code(code):
2759 if self.run_code(code):
2761 return True
2760 return True
2762
2761
2763 for i, node in enumerate(to_run_interactive):
2762 for i, node in enumerate(to_run_interactive):
2764 mod = ast.Interactive([node])
2763 mod = ast.Interactive([node])
2765 code = compiler(mod, cell_name, "single")
2764 code = compiler(mod, cell_name, "single")
2766 if self.run_code(code):
2765 if self.run_code(code):
2767 return True
2766 return True
2768
2767
2769 # Flush softspace
2768 # Flush softspace
2770 if softspace(sys.stdout, 0):
2769 if softspace(sys.stdout, 0):
2771 print()
2770 print()
2772
2771
2773 except:
2772 except:
2774 # It's possible to have exceptions raised here, typically by
2773 # It's possible to have exceptions raised here, typically by
2775 # compilation of odd code (such as a naked 'return' outside a
2774 # compilation of odd code (such as a naked 'return' outside a
2776 # function) that did parse but isn't valid. Typically the exception
2775 # function) that did parse but isn't valid. Typically the exception
2777 # is a SyntaxError, but it's safest just to catch anything and show
2776 # is a SyntaxError, but it's safest just to catch anything and show
2778 # the user a traceback.
2777 # the user a traceback.
2779
2778
2780 # We do only one try/except outside the loop to minimize the impact
2779 # We do only one try/except outside the loop to minimize the impact
2781 # on runtime, and also because if any node in the node list is
2780 # on runtime, and also because if any node in the node list is
2782 # broken, we should stop execution completely.
2781 # broken, we should stop execution completely.
2783 self.showtraceback()
2782 self.showtraceback()
2784
2783
2785 return False
2784 return False
2786
2785
2787 def run_code(self, code_obj):
2786 def run_code(self, code_obj):
2788 """Execute a code object.
2787 """Execute a code object.
2789
2788
2790 When an exception occurs, self.showtraceback() is called to display a
2789 When an exception occurs, self.showtraceback() is called to display a
2791 traceback.
2790 traceback.
2792
2791
2793 Parameters
2792 Parameters
2794 ----------
2793 ----------
2795 code_obj : code object
2794 code_obj : code object
2796 A compiled code object, to be executed
2795 A compiled code object, to be executed
2797
2796
2798 Returns
2797 Returns
2799 -------
2798 -------
2800 False : successful execution.
2799 False : successful execution.
2801 True : an error occurred.
2800 True : an error occurred.
2802 """
2801 """
2803
2802
2804 # Set our own excepthook in case the user code tries to call it
2803 # Set our own excepthook in case the user code tries to call it
2805 # directly, so that the IPython crash handler doesn't get triggered
2804 # directly, so that the IPython crash handler doesn't get triggered
2806 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2805 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2807
2806
2808 # we save the original sys.excepthook in the instance, in case config
2807 # we save the original sys.excepthook in the instance, in case config
2809 # code (such as magics) needs access to it.
2808 # code (such as magics) needs access to it.
2810 self.sys_excepthook = old_excepthook
2809 self.sys_excepthook = old_excepthook
2811 outflag = 1 # happens in more places, so it's easier as default
2810 outflag = 1 # happens in more places, so it's easier as default
2812 try:
2811 try:
2813 try:
2812 try:
2814 self.hooks.pre_run_code_hook()
2813 self.hooks.pre_run_code_hook()
2815 #rprint('Running code', repr(code_obj)) # dbg
2814 #rprint('Running code', repr(code_obj)) # dbg
2816 exec code_obj in self.user_global_ns, self.user_ns
2815 exec code_obj in self.user_global_ns, self.user_ns
2817 finally:
2816 finally:
2818 # Reset our crash handler in place
2817 # Reset our crash handler in place
2819 sys.excepthook = old_excepthook
2818 sys.excepthook = old_excepthook
2820 except SystemExit:
2819 except SystemExit:
2821 self.showtraceback(exception_only=True)
2820 self.showtraceback(exception_only=True)
2822 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2821 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2823 except self.custom_exceptions:
2822 except self.custom_exceptions:
2824 etype,value,tb = sys.exc_info()
2823 etype,value,tb = sys.exc_info()
2825 self.CustomTB(etype,value,tb)
2824 self.CustomTB(etype,value,tb)
2826 except:
2825 except:
2827 self.showtraceback()
2826 self.showtraceback()
2828 else:
2827 else:
2829 outflag = 0
2828 outflag = 0
2830 return outflag
2829 return outflag
2831
2830
2832 # For backwards compatibility
2831 # For backwards compatibility
2833 runcode = run_code
2832 runcode = run_code
2834
2833
2835 #-------------------------------------------------------------------------
2834 #-------------------------------------------------------------------------
2836 # Things related to GUI support and pylab
2835 # Things related to GUI support and pylab
2837 #-------------------------------------------------------------------------
2836 #-------------------------------------------------------------------------
2838
2837
2839 def enable_gui(self, gui=None):
2838 def enable_gui(self, gui=None):
2840 raise NotImplementedError('Implement enable_gui in a subclass')
2839 raise NotImplementedError('Implement enable_gui in a subclass')
2841
2840
2841 def enable_matplotlib(self, gui=None):
2842 """Enable interactive matplotlib and inline figure support.
2843
2844 This takes the following steps:
2845
2846 1. select the appropriate eventloop and matplotlib backend
2847 2. set up matplotlib for interactive use with that backend
2848 3. configure formatters for inline figure display
2849 4. enable the selected gui eventloop
2850
2851 Parameters
2852 ----------
2853 gui : optional, string
2854 If given, dictates the choice of matplotlib GUI backend to use
2855 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2856 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2857 matplotlib (as dictated by the matplotlib build-time options plus the
2858 user's matplotlibrc configuration file). Note that not all backends
2859 make sense in all contexts, for example a terminal ipython can't
2860 display figures inline.
2861 """
2862 from IPython.core import pylabtools as pt
2863 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
2864
2865 if gui != 'inline':
2866 # If we have our first gui selection, store it
2867 if self.pylab_gui_select is None:
2868 self.pylab_gui_select = gui
2869 # Otherwise if they are different
2870 elif gui != self.pylab_gui_select:
2871 print ('Warning: Cannot change to a different GUI toolkit: %s.'
2872 ' Using %s instead.' % (gui, self.pylab_gui_select))
2873 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
2874
2875 pt.activate_matplotlib(backend)
2876 pt.configure_inline_support(self, backend)
2877
2878 # Now we must activate the gui pylab wants to use, and fix %run to take
2879 # plot updates into account
2880 self.enable_gui(gui)
2881 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2882 pt.mpl_runner(self.safe_execfile)
2883
2884 return gui, backend
2885
2842 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2886 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2843 """Activate pylab support at runtime.
2887 """Activate pylab support at runtime.
2844
2888
2845 This turns on support for matplotlib, preloads into the interactive
2889 This turns on support for matplotlib, preloads into the interactive
2846 namespace all of numpy and pylab, and configures IPython to correctly
2890 namespace all of numpy and pylab, and configures IPython to correctly
2847 interact with the GUI event loop. The GUI backend to be used can be
2891 interact with the GUI event loop. The GUI backend to be used can be
2848 optionally selected with the optional ``gui`` argument.
2892 optionally selected with the optional ``gui`` argument.
2849
2893
2894 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
2895
2850 Parameters
2896 Parameters
2851 ----------
2897 ----------
2852 gui : optional, string
2898 gui : optional, string
2853 If given, dictates the choice of matplotlib GUI backend to use
2899 If given, dictates the choice of matplotlib GUI backend to use
2854 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2900 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2855 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2901 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2856 matplotlib (as dictated by the matplotlib build-time options plus the
2902 matplotlib (as dictated by the matplotlib build-time options plus the
2857 user's matplotlibrc configuration file). Note that not all backends
2903 user's matplotlibrc configuration file). Note that not all backends
2858 make sense in all contexts, for example a terminal ipython can't
2904 make sense in all contexts, for example a terminal ipython can't
2859 display figures inline.
2905 display figures inline.
2906 import_all : optional, bool, default: True
2907 Whether to do `from numpy import *` and `from pylab import *`
2908 in addition to module imports.
2909 welcome_message : deprecated
2910 This argument is ignored, no welcome message will be displayed.
2860 """
2911 """
2861 from IPython.core.pylabtools import mpl_runner, backends
2912 from IPython.core.pylabtools import import_pylab
2913
2914 gui, backend = self.enable_matplotlib(gui)
2915
2862 # We want to prevent the loading of pylab to pollute the user's
2916 # We want to prevent the loading of pylab to pollute the user's
2863 # namespace as shown by the %who* magics, so we execute the activation
2917 # namespace as shown by the %who* magics, so we execute the activation
2864 # code in an empty namespace, and we update *both* user_ns and
2918 # code in an empty namespace, and we update *both* user_ns and
2865 # user_ns_hidden with this information.
2919 # user_ns_hidden with this information.
2866 ns = {}
2920 ns = {}
2867 try:
2921 import_pylab(ns, import_all)
2868 gui = pylab_activate(ns, gui, import_all, self, welcome_message=welcome_message)
2922 # warn about clobbered names
2869 except KeyError:
2923 ignored = set(["__builtins__"])
2870 error("Backend '%s' not supported. Supported backends are: %s"
2924 both = set(ns).intersection(self.user_ns).difference(ignored)
2871 % (gui, " ".join(sorted(backends.keys()))))
2925 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
2872 return
2873 except ImportError:
2874 error("pylab mode doesn't work as matplotlib could not be found." + \
2875 "\nIs it installed on the system?")
2876 return
2877 self.user_ns.update(ns)
2926 self.user_ns.update(ns)
2878 self.user_ns_hidden.update(ns)
2927 self.user_ns_hidden.update(ns)
2879 # Now we must activate the gui pylab wants to use, and fix %run to take
2928 return gui, backend, clobbered
2880 # plot updates into account
2881 self.enable_gui(gui)
2882 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2883 mpl_runner(self.safe_execfile)
2884
2929
2885 #-------------------------------------------------------------------------
2930 #-------------------------------------------------------------------------
2886 # Utilities
2931 # Utilities
2887 #-------------------------------------------------------------------------
2932 #-------------------------------------------------------------------------
2888
2933
2889 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2934 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2890 """Expand python variables in a string.
2935 """Expand python variables in a string.
2891
2936
2892 The depth argument indicates how many frames above the caller should
2937 The depth argument indicates how many frames above the caller should
2893 be walked to look for the local namespace where to expand variables.
2938 be walked to look for the local namespace where to expand variables.
2894
2939
2895 The global namespace for expansion is always the user's interactive
2940 The global namespace for expansion is always the user's interactive
2896 namespace.
2941 namespace.
2897 """
2942 """
2898 ns = self.user_ns.copy()
2943 ns = self.user_ns.copy()
2899 ns.update(sys._getframe(depth+1).f_locals)
2944 ns.update(sys._getframe(depth+1).f_locals)
2900 try:
2945 try:
2901 # We have to use .vformat() here, because 'self' is a valid and common
2946 # We have to use .vformat() here, because 'self' is a valid and common
2902 # name, and expanding **ns for .format() would make it collide with
2947 # name, and expanding **ns for .format() would make it collide with
2903 # the 'self' argument of the method.
2948 # the 'self' argument of the method.
2904 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
2949 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
2905 except Exception:
2950 except Exception:
2906 # if formatter couldn't format, just let it go untransformed
2951 # if formatter couldn't format, just let it go untransformed
2907 pass
2952 pass
2908 return cmd
2953 return cmd
2909
2954
2910 def mktempfile(self, data=None, prefix='ipython_edit_'):
2955 def mktempfile(self, data=None, prefix='ipython_edit_'):
2911 """Make a new tempfile and return its filename.
2956 """Make a new tempfile and return its filename.
2912
2957
2913 This makes a call to tempfile.mktemp, but it registers the created
2958 This makes a call to tempfile.mktemp, but it registers the created
2914 filename internally so ipython cleans it up at exit time.
2959 filename internally so ipython cleans it up at exit time.
2915
2960
2916 Optional inputs:
2961 Optional inputs:
2917
2962
2918 - data(None): if data is given, it gets written out to the temp file
2963 - data(None): if data is given, it gets written out to the temp file
2919 immediately, and the file is closed again."""
2964 immediately, and the file is closed again."""
2920
2965
2921 filename = tempfile.mktemp('.py', prefix)
2966 filename = tempfile.mktemp('.py', prefix)
2922 self.tempfiles.append(filename)
2967 self.tempfiles.append(filename)
2923
2968
2924 if data:
2969 if data:
2925 tmp_file = open(filename,'w')
2970 tmp_file = open(filename,'w')
2926 tmp_file.write(data)
2971 tmp_file.write(data)
2927 tmp_file.close()
2972 tmp_file.close()
2928 return filename
2973 return filename
2929
2974
2930 # TODO: This should be removed when Term is refactored.
2975 # TODO: This should be removed when Term is refactored.
2931 def write(self,data):
2976 def write(self,data):
2932 """Write a string to the default output"""
2977 """Write a string to the default output"""
2933 io.stdout.write(data)
2978 io.stdout.write(data)
2934
2979
2935 # TODO: This should be removed when Term is refactored.
2980 # TODO: This should be removed when Term is refactored.
2936 def write_err(self,data):
2981 def write_err(self,data):
2937 """Write a string to the default error output"""
2982 """Write a string to the default error output"""
2938 io.stderr.write(data)
2983 io.stderr.write(data)
2939
2984
2940 def ask_yes_no(self, prompt, default=None):
2985 def ask_yes_no(self, prompt, default=None):
2941 if self.quiet:
2986 if self.quiet:
2942 return True
2987 return True
2943 return ask_yes_no(prompt,default)
2988 return ask_yes_no(prompt,default)
2944
2989
2945 def show_usage(self):
2990 def show_usage(self):
2946 """Show a usage message"""
2991 """Show a usage message"""
2947 page.page(IPython.core.usage.interactive_usage)
2992 page.page(IPython.core.usage.interactive_usage)
2948
2993
2949 def extract_input_lines(self, range_str, raw=False):
2994 def extract_input_lines(self, range_str, raw=False):
2950 """Return as a string a set of input history slices.
2995 """Return as a string a set of input history slices.
2951
2996
2952 Parameters
2997 Parameters
2953 ----------
2998 ----------
2954 range_str : string
2999 range_str : string
2955 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3000 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
2956 since this function is for use by magic functions which get their
3001 since this function is for use by magic functions which get their
2957 arguments as strings. The number before the / is the session
3002 arguments as strings. The number before the / is the session
2958 number: ~n goes n back from the current session.
3003 number: ~n goes n back from the current session.
2959
3004
2960 Optional Parameters:
3005 Optional Parameters:
2961 - raw(False): by default, the processed input is used. If this is
3006 - raw(False): by default, the processed input is used. If this is
2962 true, the raw input history is used instead.
3007 true, the raw input history is used instead.
2963
3008
2964 Note that slices can be called with two notations:
3009 Note that slices can be called with two notations:
2965
3010
2966 N:M -> standard python form, means including items N...(M-1).
3011 N:M -> standard python form, means including items N...(M-1).
2967
3012
2968 N-M -> include items N..M (closed endpoint)."""
3013 N-M -> include items N..M (closed endpoint)."""
2969 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3014 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
2970 return "\n".join(x for _, _, x in lines)
3015 return "\n".join(x for _, _, x in lines)
2971
3016
2972 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True):
3017 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True):
2973 """Get a code string from history, file, url, or a string or macro.
3018 """Get a code string from history, file, url, or a string or macro.
2974
3019
2975 This is mainly used by magic functions.
3020 This is mainly used by magic functions.
2976
3021
2977 Parameters
3022 Parameters
2978 ----------
3023 ----------
2979
3024
2980 target : str
3025 target : str
2981
3026
2982 A string specifying code to retrieve. This will be tried respectively
3027 A string specifying code to retrieve. This will be tried respectively
2983 as: ranges of input history (see %history for syntax), url,
3028 as: ranges of input history (see %history for syntax), url,
2984 correspnding .py file, filename, or an expression evaluating to a
3029 correspnding .py file, filename, or an expression evaluating to a
2985 string or Macro in the user namespace.
3030 string or Macro in the user namespace.
2986
3031
2987 raw : bool
3032 raw : bool
2988 If true (default), retrieve raw history. Has no effect on the other
3033 If true (default), retrieve raw history. Has no effect on the other
2989 retrieval mechanisms.
3034 retrieval mechanisms.
2990
3035
2991 py_only : bool (default False)
3036 py_only : bool (default False)
2992 Only try to fetch python code, do not try alternative methods to decode file
3037 Only try to fetch python code, do not try alternative methods to decode file
2993 if unicode fails.
3038 if unicode fails.
2994
3039
2995 Returns
3040 Returns
2996 -------
3041 -------
2997 A string of code.
3042 A string of code.
2998
3043
2999 ValueError is raised if nothing is found, and TypeError if it evaluates
3044 ValueError is raised if nothing is found, and TypeError if it evaluates
3000 to an object of another type. In each case, .args[0] is a printable
3045 to an object of another type. In each case, .args[0] is a printable
3001 message.
3046 message.
3002 """
3047 """
3003 code = self.extract_input_lines(target, raw=raw) # Grab history
3048 code = self.extract_input_lines(target, raw=raw) # Grab history
3004 if code:
3049 if code:
3005 return code
3050 return code
3006 utarget = unquote_filename(target)
3051 utarget = unquote_filename(target)
3007 try:
3052 try:
3008 if utarget.startswith(('http://', 'https://')):
3053 if utarget.startswith(('http://', 'https://')):
3009 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3054 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3010 except UnicodeDecodeError:
3055 except UnicodeDecodeError:
3011 if not py_only :
3056 if not py_only :
3012 from urllib import urlopen # Deferred import
3057 from urllib import urlopen # Deferred import
3013 response = urlopen(target)
3058 response = urlopen(target)
3014 return response.read().decode('latin1')
3059 return response.read().decode('latin1')
3015 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3060 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3016
3061
3017 potential_target = [target]
3062 potential_target = [target]
3018 try :
3063 try :
3019 potential_target.insert(0,get_py_filename(target))
3064 potential_target.insert(0,get_py_filename(target))
3020 except IOError:
3065 except IOError:
3021 pass
3066 pass
3022
3067
3023 for tgt in potential_target :
3068 for tgt in potential_target :
3024 if os.path.isfile(tgt): # Read file
3069 if os.path.isfile(tgt): # Read file
3025 try :
3070 try :
3026 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3071 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3027 except UnicodeDecodeError :
3072 except UnicodeDecodeError :
3028 if not py_only :
3073 if not py_only :
3029 with io_open(tgt,'r', encoding='latin1') as f :
3074 with io_open(tgt,'r', encoding='latin1') as f :
3030 return f.read()
3075 return f.read()
3031 raise ValueError(("'%s' seem to be unreadable.") % target)
3076 raise ValueError(("'%s' seem to be unreadable.") % target)
3032 elif os.path.isdir(os.path.expanduser(tgt)):
3077 elif os.path.isdir(os.path.expanduser(tgt)):
3033 raise ValueError("'%s' is a directory, not a regular file." % target)
3078 raise ValueError("'%s' is a directory, not a regular file." % target)
3034
3079
3035 try: # User namespace
3080 try: # User namespace
3036 codeobj = eval(target, self.user_ns)
3081 codeobj = eval(target, self.user_ns)
3037 except Exception:
3082 except Exception:
3038 raise ValueError(("'%s' was not found in history, as a file, url, "
3083 raise ValueError(("'%s' was not found in history, as a file, url, "
3039 "nor in the user namespace.") % target)
3084 "nor in the user namespace.") % target)
3040 if isinstance(codeobj, basestring):
3085 if isinstance(codeobj, basestring):
3041 return codeobj
3086 return codeobj
3042 elif isinstance(codeobj, Macro):
3087 elif isinstance(codeobj, Macro):
3043 return codeobj.value
3088 return codeobj.value
3044
3089
3045 raise TypeError("%s is neither a string nor a macro." % target,
3090 raise TypeError("%s is neither a string nor a macro." % target,
3046 codeobj)
3091 codeobj)
3047
3092
3048 #-------------------------------------------------------------------------
3093 #-------------------------------------------------------------------------
3049 # Things related to IPython exiting
3094 # Things related to IPython exiting
3050 #-------------------------------------------------------------------------
3095 #-------------------------------------------------------------------------
3051 def atexit_operations(self):
3096 def atexit_operations(self):
3052 """This will be executed at the time of exit.
3097 """This will be executed at the time of exit.
3053
3098
3054 Cleanup operations and saving of persistent data that is done
3099 Cleanup operations and saving of persistent data that is done
3055 unconditionally by IPython should be performed here.
3100 unconditionally by IPython should be performed here.
3056
3101
3057 For things that may depend on startup flags or platform specifics (such
3102 For things that may depend on startup flags or platform specifics (such
3058 as having readline or not), register a separate atexit function in the
3103 as having readline or not), register a separate atexit function in the
3059 code that has the appropriate information, rather than trying to
3104 code that has the appropriate information, rather than trying to
3060 clutter
3105 clutter
3061 """
3106 """
3062 # Close the history session (this stores the end time and line count)
3107 # Close the history session (this stores the end time and line count)
3063 # this must be *before* the tempfile cleanup, in case of temporary
3108 # this must be *before* the tempfile cleanup, in case of temporary
3064 # history db
3109 # history db
3065 self.history_manager.end_session()
3110 self.history_manager.end_session()
3066
3111
3067 # Cleanup all tempfiles left around
3112 # Cleanup all tempfiles left around
3068 for tfile in self.tempfiles:
3113 for tfile in self.tempfiles:
3069 try:
3114 try:
3070 os.unlink(tfile)
3115 os.unlink(tfile)
3071 except OSError:
3116 except OSError:
3072 pass
3117 pass
3073
3118
3074 # Clear all user namespaces to release all references cleanly.
3119 # Clear all user namespaces to release all references cleanly.
3075 self.reset(new_session=False)
3120 self.reset(new_session=False)
3076
3121
3077 # Run user hooks
3122 # Run user hooks
3078 self.hooks.shutdown_hook()
3123 self.hooks.shutdown_hook()
3079
3124
3080 def cleanup(self):
3125 def cleanup(self):
3081 self.restore_sys_module_state()
3126 self.restore_sys_module_state()
3082
3127
3083
3128
3084 class InteractiveShellABC(object):
3129 class InteractiveShellABC(object):
3085 """An abstract base class for InteractiveShell."""
3130 """An abstract base class for InteractiveShell."""
3086 __metaclass__ = abc.ABCMeta
3131 __metaclass__ = abc.ABCMeta
3087
3132
3088 InteractiveShellABC.register(InteractiveShell)
3133 InteractiveShellABC.register(InteractiveShell)
@@ -1,88 +1,141 b''
1 """Implementation of magic functions for matplotlib/pylab support.
1 """Implementation of magic functions for matplotlib/pylab support.
2 """
2 """
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (c) 2012 The IPython Development Team.
4 # Copyright (c) 2012 The IPython Development Team.
5 #
5 #
6 # Distributed under the terms of the Modified BSD License.
6 # Distributed under the terms of the Modified BSD License.
7 #
7 #
8 # The full license is in the file COPYING.txt, distributed with this software.
8 # The full license is in the file COPYING.txt, distributed with this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
14
15 # Our own packages
15 # Our own packages
16 from IPython.config.application import Application
16 from IPython.config.application import Application
17 from IPython.core import magic_arguments
17 from IPython.core.magic import Magics, magics_class, line_magic
18 from IPython.core.magic import Magics, magics_class, line_magic
18 from IPython.testing.skipdoctest import skip_doctest
19 from IPython.testing.skipdoctest import skip_doctest
20 from IPython.utils.warn import warn
21 from IPython.core.pylabtools import backends
19
22
20 #-----------------------------------------------------------------------------
23 #-----------------------------------------------------------------------------
21 # Magic implementation classes
24 # Magic implementation classes
22 #-----------------------------------------------------------------------------
25 #-----------------------------------------------------------------------------
23
26
27 magic_gui_arg = magic_arguments.argument(
28 'gui', nargs='?',
29 help="""Name of the matplotlib backend to use %s.
30 If given, the corresponding matplotlib backend is used,
31 otherwise it will be matplotlib's default
32 (which you can set in your matplotlib config file).
33 """ % str(tuple(sorted(backends.keys())))
34 )
35
36
24 @magics_class
37 @magics_class
25 class PylabMagics(Magics):
38 class PylabMagics(Magics):
26 """Magics related to matplotlib's pylab support"""
39 """Magics related to matplotlib's pylab support"""
27
40
28 @skip_doctest
41 @skip_doctest
29 @line_magic
42 @line_magic
30 def pylab(self, parameter_s=''):
43 @magic_arguments.magic_arguments()
31 """Load numpy and matplotlib to work interactively.
44 @magic_gui_arg
45 def matplotlib(self, line=''):
46 """Set up matplotlib to work interactively.
32
47
33 %pylab [GUINAME]
48 This function lets you activate matplotlib interactive support
34
49 at any point during an IPython session.
35 This function lets you activate pylab (matplotlib, numpy and
50 It does not import anything into the interactive namespace.
36 interactive support) at any point during an IPython session.
37
38 It will import at the top level numpy as np, pyplot as plt, matplotlib,
39 pylab and mlab, as well as all names from numpy and pylab.
40
51
41 If you are using the inline matplotlib backend for embedded figures,
52 If you are using the inline matplotlib backend for embedded figures,
42 you can adjust its behavior via the %config magic::
53 you can adjust its behavior via the %config magic::
43
54
44 # enable SVG figures, necessary for SVG+XHTML export in the qtconsole
55 # enable SVG figures, necessary for SVG+XHTML export in the qtconsole
45 In [1]: %config InlineBackend.figure_format = 'svg'
56 In [1]: %config InlineBackend.figure_format = 'svg'
46
57
47 # change the behavior of closing all figures at the end of each
58 # change the behavior of closing all figures at the end of each
48 # execution (cell), or allowing reuse of active figures across
59 # execution (cell), or allowing reuse of active figures across
49 # cells:
60 # cells:
50 In [2]: %config InlineBackend.close_figures = False
61 In [2]: %config InlineBackend.close_figures = False
51
62
52 Parameters
53 ----------
54 guiname : optional
55 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk',
56 'osx' or 'tk'). If given, the corresponding Matplotlib backend is
57 used, otherwise matplotlib's default (which you can override in your
58 matplotlib config file) is used.
59
60 Examples
63 Examples
61 --------
64 --------
62 In this case, where the MPL default is TkAgg::
65 In this case, where the MPL default is TkAgg::
63
66
64 In [2]: %pylab
67 In [2]: %matplotlib
65
68 Using matplotlib backend: TkAgg
66 Welcome to pylab, a matplotlib-based Python environment.
67 Backend in use: TkAgg
68 For more information, type 'help(pylab)'.
69
69
70 But you can explicitly request a different backend::
70 But you can explicitly request a different backend::
71
71
72 In [3]: %pylab qt
72 In [3]: %matplotlib qt
73 """
74 args = magic_arguments.parse_argstring(self.matplotlib, line)
75 gui, backend = self.shell.enable_matplotlib(args.gui)
76 self._show_matplotlib_backend(args.gui, backend)
73
77
74 Welcome to pylab, a matplotlib-based Python environment.
78 @skip_doctest
75 Backend in use: Qt4Agg
79 @line_magic
76 For more information, type 'help(pylab)'.
80 @magic_arguments.magic_arguments()
81 @magic_arguments.argument(
82 '--no-import-all', action='store_true', default=None,
83 help="""Prevent IPython from performing ``import *`` into the interactive namespace.
84
85 The names that will still be added to the namespace if this flag is given::
86
87 numpy
88 matplotlib
89 np (numpy alias)
90 plt (matplotlib.pyplot alias)
91 pylab (from matplotlib)
92 pyplot (from matplotlib)
93 mlab (from matplotlib)
94 display (from IPython)
95 figsize (from IPython)
96 getfigs (from IPython)
97
98 You can govern the default behavior with the
99 InteractiveShellApp.pylab_import_all configurable.
77 """
100 """
101 )
102 @magic_gui_arg
103 def pylab(self, line=''):
104 """Load numpy and matplotlib to work interactively.
105
106 This function lets you activate pylab (matplotlib, numpy and
107 interactive support) at any point during an IPython session.
108
109 It will import at the top level numpy as np, pyplot as plt, matplotlib,
110 pylab and mlab, as well as all names from numpy and pylab.
78
111
112 See the %matplotlib magic for more details.
113 """
114 args = magic_arguments.parse_argstring(self.pylab, line)
115 if args.no_import_all is None:
116 # get default from Application
79 if Application.initialized():
117 if Application.initialized():
80 app = Application.instance()
118 app = Application.instance()
81 try:
119 try:
82 import_all_status = app.pylab_import_all
120 import_all = app.pylab_import_all
83 except AttributeError:
121 except AttributeError:
84 import_all_status = True
122 import_all = True
85 else:
123 else:
86 import_all_status = True
124 # nothing specified, no app - default True
125 import_all = True
126 else:
127 # invert no-import flag
128 import_all = not args.no_import_all
129
130 gui, backend, clobbered = self.shell.enable_pylab(args.gui, import_all=import_all)
131 self._show_matplotlib_backend(args.gui, backend)
132 if clobbered:
133 warn("pylab import has clobbered these variables: %s" % clobbered +
134 "\n`%pylab --no-import-all` prevents importing * from pylab and numpy"
135 )
136
137 def _show_matplotlib_backend(self, gui, backend):
138 """show matplotlib message backend message"""
139 if not gui or gui == 'auto':
140 print ("using matplotlib backend: %s" % backend)
87
141
88 self.shell.enable_pylab(parameter_s, import_all=import_all_status, welcome_message=True)
@@ -1,385 +1,333 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Pylab (matplotlib) support utilities.
2 """Pylab (matplotlib) support utilities.
3
3
4 Authors
4 Authors
5 -------
5 -------
6
6
7 * Fernando Perez.
7 * Fernando Perez.
8 * Brian Granger
8 * Brian Granger
9 """
9 """
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Copyright (C) 2009 The IPython Development Team
12 # Copyright (C) 2009 The IPython Development Team
13 #
13 #
14 # Distributed under the terms of the BSD License. The full license is in
14 # Distributed under the terms of the BSD License. The full license is in
15 # the file COPYING, distributed as part of this software.
15 # the file COPYING, distributed as part of this software.
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19 # Imports
19 # Imports
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21
21
22 import sys
22 import sys
23 from io import BytesIO
23 from io import BytesIO
24
24
25 from IPython.core.display import _pngxy
25 from IPython.core.display import _pngxy
26 from IPython.utils.decorators import flag_calls
26 from IPython.utils.decorators import flag_calls
27
27
28 # If user specifies a GUI, that dictates the backend, otherwise we read the
28 # If user specifies a GUI, that dictates the backend, otherwise we read the
29 # user's mpl default from the mpl rc structure
29 # user's mpl default from the mpl rc structure
30 backends = {'tk': 'TkAgg',
30 backends = {'tk': 'TkAgg',
31 'gtk': 'GTKAgg',
31 'gtk': 'GTKAgg',
32 'wx': 'WXAgg',
32 'wx': 'WXAgg',
33 'qt': 'Qt4Agg', # qt3 not supported
33 'qt': 'Qt4Agg', # qt3 not supported
34 'qt4': 'Qt4Agg',
34 'qt4': 'Qt4Agg',
35 'osx': 'MacOSX',
35 'osx': 'MacOSX',
36 'inline' : 'module://IPython.kernel.zmq.pylab.backend_inline'}
36 'inline' : 'module://IPython.kernel.zmq.pylab.backend_inline'}
37
37
38 # We also need a reverse backends2guis mapping that will properly choose which
38 # We also need a reverse backends2guis mapping that will properly choose which
39 # GUI support to activate based on the desired matplotlib backend. For the
39 # GUI support to activate based on the desired matplotlib backend. For the
40 # most part it's just a reverse of the above dict, but we also need to add a
40 # most part it's just a reverse of the above dict, but we also need to add a
41 # few others that map to the same GUI manually:
41 # few others that map to the same GUI manually:
42 backend2gui = dict(zip(backends.values(), backends.keys()))
42 backend2gui = dict(zip(backends.values(), backends.keys()))
43 # In the reverse mapping, there are a few extra valid matplotlib backends that
43 # In the reverse mapping, there are a few extra valid matplotlib backends that
44 # map to the same GUI support
44 # map to the same GUI support
45 backend2gui['GTK'] = backend2gui['GTKCairo'] = 'gtk'
45 backend2gui['GTK'] = backend2gui['GTKCairo'] = 'gtk'
46 backend2gui['WX'] = 'wx'
46 backend2gui['WX'] = 'wx'
47 backend2gui['CocoaAgg'] = 'osx'
47 backend2gui['CocoaAgg'] = 'osx'
48
48
49 #-----------------------------------------------------------------------------
49 #-----------------------------------------------------------------------------
50 # Matplotlib utilities
50 # Matplotlib utilities
51 #-----------------------------------------------------------------------------
51 #-----------------------------------------------------------------------------
52
52
53
53
54 def getfigs(*fig_nums):
54 def getfigs(*fig_nums):
55 """Get a list of matplotlib figures by figure numbers.
55 """Get a list of matplotlib figures by figure numbers.
56
56
57 If no arguments are given, all available figures are returned. If the
57 If no arguments are given, all available figures are returned. If the
58 argument list contains references to invalid figures, a warning is printed
58 argument list contains references to invalid figures, a warning is printed
59 but the function continues pasting further figures.
59 but the function continues pasting further figures.
60
60
61 Parameters
61 Parameters
62 ----------
62 ----------
63 figs : tuple
63 figs : tuple
64 A tuple of ints giving the figure numbers of the figures to return.
64 A tuple of ints giving the figure numbers of the figures to return.
65 """
65 """
66 from matplotlib._pylab_helpers import Gcf
66 from matplotlib._pylab_helpers import Gcf
67 if not fig_nums:
67 if not fig_nums:
68 fig_managers = Gcf.get_all_fig_managers()
68 fig_managers = Gcf.get_all_fig_managers()
69 return [fm.canvas.figure for fm in fig_managers]
69 return [fm.canvas.figure for fm in fig_managers]
70 else:
70 else:
71 figs = []
71 figs = []
72 for num in fig_nums:
72 for num in fig_nums:
73 f = Gcf.figs.get(num)
73 f = Gcf.figs.get(num)
74 if f is None:
74 if f is None:
75 print('Warning: figure %s not available.' % num)
75 print('Warning: figure %s not available.' % num)
76 else:
76 else:
77 figs.append(f.canvas.figure)
77 figs.append(f.canvas.figure)
78 return figs
78 return figs
79
79
80
80
81 def figsize(sizex, sizey):
81 def figsize(sizex, sizey):
82 """Set the default figure size to be [sizex, sizey].
82 """Set the default figure size to be [sizex, sizey].
83
83
84 This is just an easy to remember, convenience wrapper that sets::
84 This is just an easy to remember, convenience wrapper that sets::
85
85
86 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
86 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
87 """
87 """
88 import matplotlib
88 import matplotlib
89 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
89 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
90
90
91
91
92 def print_figure(fig, fmt='png'):
92 def print_figure(fig, fmt='png'):
93 """Convert a figure to svg or png for inline display."""
93 """Convert a figure to svg or png for inline display."""
94 from matplotlib import rcParams
94 from matplotlib import rcParams
95 # When there's an empty figure, we shouldn't return anything, otherwise we
95 # When there's an empty figure, we shouldn't return anything, otherwise we
96 # get big blank areas in the qt console.
96 # get big blank areas in the qt console.
97 if not fig.axes and not fig.lines:
97 if not fig.axes and not fig.lines:
98 return
98 return
99
99
100 fc = fig.get_facecolor()
100 fc = fig.get_facecolor()
101 ec = fig.get_edgecolor()
101 ec = fig.get_edgecolor()
102 bytes_io = BytesIO()
102 bytes_io = BytesIO()
103 dpi = rcParams['savefig.dpi']
103 dpi = rcParams['savefig.dpi']
104 if fmt == 'retina':
104 if fmt == 'retina':
105 dpi = dpi * 2
105 dpi = dpi * 2
106 fmt = 'png'
106 fmt = 'png'
107 fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight',
107 fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight',
108 facecolor=fc, edgecolor=ec, dpi=dpi)
108 facecolor=fc, edgecolor=ec, dpi=dpi)
109 data = bytes_io.getvalue()
109 data = bytes_io.getvalue()
110 return data
110 return data
111
111
112 def retina_figure(fig):
112 def retina_figure(fig):
113 """format a figure as a pixel-doubled (retina) PNG"""
113 """format a figure as a pixel-doubled (retina) PNG"""
114 pngdata = print_figure(fig, fmt='retina')
114 pngdata = print_figure(fig, fmt='retina')
115 w, h = _pngxy(pngdata)
115 w, h = _pngxy(pngdata)
116 metadata = dict(width=w//2, height=h//2)
116 metadata = dict(width=w//2, height=h//2)
117 return pngdata, metadata
117 return pngdata, metadata
118
118
119 # We need a little factory function here to create the closure where
119 # We need a little factory function here to create the closure where
120 # safe_execfile can live.
120 # safe_execfile can live.
121 def mpl_runner(safe_execfile):
121 def mpl_runner(safe_execfile):
122 """Factory to return a matplotlib-enabled runner for %run.
122 """Factory to return a matplotlib-enabled runner for %run.
123
123
124 Parameters
124 Parameters
125 ----------
125 ----------
126 safe_execfile : function
126 safe_execfile : function
127 This must be a function with the same interface as the
127 This must be a function with the same interface as the
128 :meth:`safe_execfile` method of IPython.
128 :meth:`safe_execfile` method of IPython.
129
129
130 Returns
130 Returns
131 -------
131 -------
132 A function suitable for use as the ``runner`` argument of the %run magic
132 A function suitable for use as the ``runner`` argument of the %run magic
133 function.
133 function.
134 """
134 """
135
135
136 def mpl_execfile(fname,*where,**kw):
136 def mpl_execfile(fname,*where,**kw):
137 """matplotlib-aware wrapper around safe_execfile.
137 """matplotlib-aware wrapper around safe_execfile.
138
138
139 Its interface is identical to that of the :func:`execfile` builtin.
139 Its interface is identical to that of the :func:`execfile` builtin.
140
140
141 This is ultimately a call to execfile(), but wrapped in safeties to
141 This is ultimately a call to execfile(), but wrapped in safeties to
142 properly handle interactive rendering."""
142 properly handle interactive rendering."""
143
143
144 import matplotlib
144 import matplotlib
145 import matplotlib.pylab as pylab
145 import matplotlib.pylab as pylab
146
146
147 #print '*** Matplotlib runner ***' # dbg
147 #print '*** Matplotlib runner ***' # dbg
148 # turn off rendering until end of script
148 # turn off rendering until end of script
149 is_interactive = matplotlib.rcParams['interactive']
149 is_interactive = matplotlib.rcParams['interactive']
150 matplotlib.interactive(False)
150 matplotlib.interactive(False)
151 safe_execfile(fname,*where,**kw)
151 safe_execfile(fname,*where,**kw)
152 matplotlib.interactive(is_interactive)
152 matplotlib.interactive(is_interactive)
153 # make rendering call now, if the user tried to do it
153 # make rendering call now, if the user tried to do it
154 if pylab.draw_if_interactive.called:
154 if pylab.draw_if_interactive.called:
155 pylab.draw()
155 pylab.draw()
156 pylab.draw_if_interactive.called = False
156 pylab.draw_if_interactive.called = False
157
157
158 return mpl_execfile
158 return mpl_execfile
159
159
160
160
161 def select_figure_format(shell, fmt):
161 def select_figure_format(shell, fmt):
162 """Select figure format for inline backend, can be 'png', 'retina', or 'svg'.
162 """Select figure format for inline backend, can be 'png', 'retina', or 'svg'.
163
163
164 Using this method ensures only one figure format is active at a time.
164 Using this method ensures only one figure format is active at a time.
165 """
165 """
166 from matplotlib.figure import Figure
166 from matplotlib.figure import Figure
167 from IPython.kernel.zmq.pylab import backend_inline
167 from IPython.kernel.zmq.pylab import backend_inline
168
168
169 svg_formatter = shell.display_formatter.formatters['image/svg+xml']
169 svg_formatter = shell.display_formatter.formatters['image/svg+xml']
170 png_formatter = shell.display_formatter.formatters['image/png']
170 png_formatter = shell.display_formatter.formatters['image/png']
171
171
172 if fmt == 'png':
172 if fmt == 'png':
173 svg_formatter.type_printers.pop(Figure, None)
173 svg_formatter.type_printers.pop(Figure, None)
174 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png'))
174 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png'))
175 elif fmt in ('png2x', 'retina'):
175 elif fmt in ('png2x', 'retina'):
176 svg_formatter.type_printers.pop(Figure, None)
176 svg_formatter.type_printers.pop(Figure, None)
177 png_formatter.for_type(Figure, retina_figure)
177 png_formatter.for_type(Figure, retina_figure)
178 elif fmt == 'svg':
178 elif fmt == 'svg':
179 png_formatter.type_printers.pop(Figure, None)
179 png_formatter.type_printers.pop(Figure, None)
180 svg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'svg'))
180 svg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'svg'))
181 else:
181 else:
182 raise ValueError("supported formats are: 'png', 'retina', 'svg', not %r" % fmt)
182 raise ValueError("supported formats are: 'png', 'retina', 'svg', not %r" % fmt)
183
183
184 # set the format to be used in the backend()
184 # set the format to be used in the backend()
185 backend_inline._figure_format = fmt
185 backend_inline._figure_format = fmt
186
186
187 #-----------------------------------------------------------------------------
187 #-----------------------------------------------------------------------------
188 # Code for initializing matplotlib and importing pylab
188 # Code for initializing matplotlib and importing pylab
189 #-----------------------------------------------------------------------------
189 #-----------------------------------------------------------------------------
190
190
191
191
192 def find_gui_and_backend(gui=None, gui_select=None):
192 def find_gui_and_backend(gui=None, gui_select=None):
193 """Given a gui string return the gui and mpl backend.
193 """Given a gui string return the gui and mpl backend.
194
194
195 Parameters
195 Parameters
196 ----------
196 ----------
197 gui : str
197 gui : str
198 Can be one of ('tk','gtk','wx','qt','qt4','inline').
198 Can be one of ('tk','gtk','wx','qt','qt4','inline').
199 gui_select : str
199 gui_select : str
200 Can be one of ('tk','gtk','wx','qt','qt4','inline').
200 Can be one of ('tk','gtk','wx','qt','qt4','inline').
201 This is any gui already selected by the shell.
201 This is any gui already selected by the shell.
202
202
203 Returns
203 Returns
204 -------
204 -------
205 A tuple of (gui, backend) where backend is one of ('TkAgg','GTKAgg',
205 A tuple of (gui, backend) where backend is one of ('TkAgg','GTKAgg',
206 'WXAgg','Qt4Agg','module://IPython.kernel.zmq.pylab.backend_inline').
206 'WXAgg','Qt4Agg','module://IPython.kernel.zmq.pylab.backend_inline').
207 """
207 """
208
208
209 import matplotlib
209 import matplotlib
210
210
211 if gui and gui != 'auto':
211 if gui and gui != 'auto':
212 # select backend based on requested gui
212 # select backend based on requested gui
213 backend = backends[gui]
213 backend = backends[gui]
214 else:
214 else:
215 backend = matplotlib.rcParams['backend']
215 backend = matplotlib.rcParams['backend']
216 # In this case, we need to find what the appropriate gui selection call
216 # In this case, we need to find what the appropriate gui selection call
217 # should be for IPython, so we can activate inputhook accordingly
217 # should be for IPython, so we can activate inputhook accordingly
218 gui = backend2gui.get(backend, None)
218 gui = backend2gui.get(backend, None)
219
219
220 # If we have already had a gui active, we need it and inline are the
220 # If we have already had a gui active, we need it and inline are the
221 # ones allowed.
221 # ones allowed.
222 if gui_select and gui != gui_select:
222 if gui_select and gui != gui_select:
223 gui = gui_select
223 gui = gui_select
224 backend = backends[gui]
224 backend = backends[gui]
225
225
226 return gui, backend
226 return gui, backend
227
227
228
228
229 def activate_matplotlib(backend):
229 def activate_matplotlib(backend):
230 """Activate the given backend and set interactive to True."""
230 """Activate the given backend and set interactive to True."""
231
231
232 import matplotlib
232 import matplotlib
233 matplotlib.interactive(True)
233 matplotlib.interactive(True)
234
234
235 # Matplotlib had a bug where even switch_backend could not force
235 # Matplotlib had a bug where even switch_backend could not force
236 # the rcParam to update. This needs to be set *before* the module
236 # the rcParam to update. This needs to be set *before* the module
237 # magic of switch_backend().
237 # magic of switch_backend().
238 matplotlib.rcParams['backend'] = backend
238 matplotlib.rcParams['backend'] = backend
239
239
240 import matplotlib.pyplot
240 import matplotlib.pyplot
241 matplotlib.pyplot.switch_backend(backend)
241 matplotlib.pyplot.switch_backend(backend)
242
242
243 # This must be imported last in the matplotlib series, after
243 # This must be imported last in the matplotlib series, after
244 # backend/interactivity choices have been made
244 # backend/interactivity choices have been made
245 import matplotlib.pylab as pylab
245 import matplotlib.pylab as pylab
246
246
247 pylab.show._needmain = False
247 pylab.show._needmain = False
248 # We need to detect at runtime whether show() is called by the user.
248 # We need to detect at runtime whether show() is called by the user.
249 # For this, we wrap it into a decorator which adds a 'called' flag.
249 # For this, we wrap it into a decorator which adds a 'called' flag.
250 pylab.draw_if_interactive = flag_calls(pylab.draw_if_interactive)
250 pylab.draw_if_interactive = flag_calls(pylab.draw_if_interactive)
251
251
252
252
253 def import_pylab(user_ns, import_all=True):
253 def import_pylab(user_ns, import_all=True):
254 """Import the standard pylab symbols into user_ns."""
254 """Populate the namespace with pylab-related values.
255
256 Imports matplotlib, pylab, numpy, and everything from pylab and numpy.
257
258 Also imports a few names from IPython (figsize, display, getfigs)
259
260 """
255
261
256 # Import numpy as np/pyplot as plt are conventions we're trying to
262 # Import numpy as np/pyplot as plt are conventions we're trying to
257 # somewhat standardize on. Making them available to users by default
263 # somewhat standardize on. Making them available to users by default
258 # will greatly help this.
264 # will greatly help this.
259 s = ("import numpy\n"
265 s = ("import numpy\n"
260 "import matplotlib\n"
266 "import matplotlib\n"
261 "from matplotlib import pylab, mlab, pyplot\n"
267 "from matplotlib import pylab, mlab, pyplot\n"
262 "np = numpy\n"
268 "np = numpy\n"
263 "plt = pyplot\n"
269 "plt = pyplot\n"
264 )
270 )
265 exec s in user_ns
271 exec s in user_ns
266
272
267 if import_all:
273 if import_all:
268 s = ("from matplotlib.pylab import *\n"
274 s = ("from matplotlib.pylab import *\n"
269 "from numpy import *\n")
275 "from numpy import *\n")
270 exec s in user_ns
276 exec s in user_ns
271
277
278 # IPython symbols to add
279 user_ns['figsize'] = figsize
280 from IPython.core.display import display
281 # Add display and getfigs to the user's namespace
282 user_ns['display'] = display
283 user_ns['getfigs'] = getfigs
284
272
285
273 def configure_inline_support(shell, backend, user_ns=None):
286 def configure_inline_support(shell, backend):
274 """Configure an IPython shell object for matplotlib use.
287 """Configure an IPython shell object for matplotlib use.
275
288
276 Parameters
289 Parameters
277 ----------
290 ----------
278 shell : InteractiveShell instance
291 shell : InteractiveShell instance
279
292
280 backend : matplotlib backend
293 backend : matplotlib backend
281
282 user_ns : dict
283 A namespace where all configured variables will be placed. If not given,
284 the `user_ns` attribute of the shell object is used.
285 """
294 """
286 # If using our svg payload backend, register the post-execution
295 # If using our svg payload backend, register the post-execution
287 # function that will pick up the results for display. This can only be
296 # function that will pick up the results for display. This can only be
288 # done with access to the real shell object.
297 # done with access to the real shell object.
289
298
290 # Note: if we can't load the inline backend, then there's no point
299 # Note: if we can't load the inline backend, then there's no point
291 # continuing (such as in terminal-only shells in environments without
300 # continuing (such as in terminal-only shells in environments without
292 # zeromq available).
301 # zeromq available).
293 try:
302 try:
294 from IPython.kernel.zmq.pylab.backend_inline import InlineBackend
303 from IPython.kernel.zmq.pylab.backend_inline import InlineBackend
295 except ImportError:
304 except ImportError:
296 return
305 return
297 from matplotlib import pyplot
306 from matplotlib import pyplot
298
307
299 user_ns = shell.user_ns if user_ns is None else user_ns
300
301 cfg = InlineBackend.instance(parent=shell)
308 cfg = InlineBackend.instance(parent=shell)
302 cfg.shell = shell
309 cfg.shell = shell
303 if cfg not in shell.configurables:
310 if cfg not in shell.configurables:
304 shell.configurables.append(cfg)
311 shell.configurables.append(cfg)
305
312
306 if backend == backends['inline']:
313 if backend == backends['inline']:
307 from IPython.kernel.zmq.pylab.backend_inline import flush_figures
314 from IPython.kernel.zmq.pylab.backend_inline import flush_figures
308 shell.register_post_execute(flush_figures)
315 shell.register_post_execute(flush_figures)
309
316
310 # Save rcParams that will be overwrittern
317 # Save rcParams that will be overwrittern
311 shell._saved_rcParams = dict()
318 shell._saved_rcParams = dict()
312 for k in cfg.rc:
319 for k in cfg.rc:
313 shell._saved_rcParams[k] = pyplot.rcParams[k]
320 shell._saved_rcParams[k] = pyplot.rcParams[k]
314 # load inline_rc
321 # load inline_rc
315 pyplot.rcParams.update(cfg.rc)
322 pyplot.rcParams.update(cfg.rc)
316 # Add 'figsize' to pyplot and to the user's namespace
317 user_ns['figsize'] = pyplot.figsize = figsize
318 else:
323 else:
319 from IPython.kernel.zmq.pylab.backend_inline import flush_figures
324 from IPython.kernel.zmq.pylab.backend_inline import flush_figures
320 if flush_figures in shell._post_execute:
325 if flush_figures in shell._post_execute:
321 shell._post_execute.pop(flush_figures)
326 shell._post_execute.pop(flush_figures)
322 if hasattr(shell, '_saved_rcParams'):
327 if hasattr(shell, '_saved_rcParams'):
323 pyplot.rcParams.update(shell._saved_rcParams)
328 pyplot.rcParams.update(shell._saved_rcParams)
324 del shell._saved_rcParams
329 del shell._saved_rcParams
325
330
326 # Setup the default figure format
331 # Setup the default figure format
327 fmt = cfg.figure_format
332 select_figure_format(shell, cfg.figure_format)
328 select_figure_format(shell, fmt)
329
330 # The old pastefig function has been replaced by display
331 from IPython.core.display import display
332 # Add display and getfigs to the user's namespace
333 user_ns['display'] = display
334 user_ns['getfigs'] = getfigs
335
336
337 def pylab_activate(user_ns, gui=None, import_all=True, shell=None, welcome_message=False):
338 """Activate pylab mode in the user's namespace.
339
340 Loads and initializes numpy, matplotlib and friends for interactive use.
341
342 Parameters
343 ----------
344 user_ns : dict
345 Namespace where the imports will occur.
346
347 gui : optional, string
348 A valid gui name following the conventions of the %gui magic.
349
350 import_all : optional, boolean
351 If true, an 'import *' is done from numpy and pylab.
352
353 welcome_message : optional, boolean
354 If true, print a welcome message about pylab, which includes the backend
355 being used.
356
333
357 Returns
358 -------
359 The actual gui used (if not given as input, it was obtained from matplotlib
360 itself, and will be needed next to configure IPython's gui integration.
361 """
362 pylab_gui_select = shell.pylab_gui_select if shell is not None else None
363 # Try to find the appropriate gui and backend for the settings
364 gui, backend = find_gui_and_backend(gui, pylab_gui_select)
365 if shell is not None and gui != 'inline':
366 # If we have our first gui selection, store it
367 if pylab_gui_select is None:
368 shell.pylab_gui_select = gui
369 # Otherwise if they are different
370 elif gui != pylab_gui_select:
371 print ('Warning: Cannot change to a different GUI toolkit: %s.'
372 ' Using %s instead.' % (gui, pylab_gui_select))
373 gui, backend = find_gui_and_backend(pylab_gui_select)
374 activate_matplotlib(backend)
375 import_pylab(user_ns, import_all)
376 if shell is not None:
377 configure_inline_support(shell, backend, user_ns)
378 if welcome_message:
379 print """
380 Welcome to pylab, a matplotlib-based Python environment [backend: %s].
381 For more information, type 'help(pylab)'.""" % backend
382 # flush stdout, just to be safe
383 sys.stdout.flush()
384
385 return gui
@@ -1,366 +1,371 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 A mixin for :class:`~IPython.core.application.Application` classes that
3 A mixin for :class:`~IPython.core.application.Application` classes that
4 launch InteractiveShell instances, load extensions, etc.
4 launch InteractiveShell instances, load extensions, etc.
5
5
6 Authors
6 Authors
7 -------
7 -------
8
8
9 * Min Ragan-Kelley
9 * Min Ragan-Kelley
10 """
10 """
11
11
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 # Copyright (C) 2008-2011 The IPython Development Team
13 # Copyright (C) 2008-2011 The IPython Development Team
14 #
14 #
15 # Distributed under the terms of the BSD License. The full license is in
15 # Distributed under the terms of the BSD License. The full license is in
16 # the file COPYING, distributed as part of this software.
16 # the file COPYING, distributed as part of this software.
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 #-----------------------------------------------------------------------------
19 #-----------------------------------------------------------------------------
20 # Imports
20 # Imports
21 #-----------------------------------------------------------------------------
21 #-----------------------------------------------------------------------------
22
22
23 from __future__ import absolute_import
23 from __future__ import absolute_import
24
24
25 import glob
25 import glob
26 import os
26 import os
27 import sys
27 import sys
28
28
29 from IPython.config.application import boolean_flag
29 from IPython.config.application import boolean_flag
30 from IPython.config.configurable import Configurable
30 from IPython.config.configurable import Configurable
31 from IPython.config.loader import Config
31 from IPython.config.loader import Config
32 from IPython.core import pylabtools
32 from IPython.core import pylabtools
33 from IPython.utils import py3compat
33 from IPython.utils import py3compat
34 from IPython.utils.contexts import preserve_keys
34 from IPython.utils.contexts import preserve_keys
35 from IPython.utils.path import filefind
35 from IPython.utils.path import filefind
36 from IPython.utils.traitlets import (
36 from IPython.utils.traitlets import (
37 Unicode, Instance, List, Bool, CaselessStrEnum
37 Unicode, Instance, List, Bool, CaselessStrEnum
38 )
38 )
39
39
40 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
41 # Aliases and Flags
41 # Aliases and Flags
42 #-----------------------------------------------------------------------------
42 #-----------------------------------------------------------------------------
43
43
44 shell_flags = {}
44 shell_flags = {}
45
45
46 addflag = lambda *args: shell_flags.update(boolean_flag(*args))
46 addflag = lambda *args: shell_flags.update(boolean_flag(*args))
47 addflag('autoindent', 'InteractiveShell.autoindent',
47 addflag('autoindent', 'InteractiveShell.autoindent',
48 'Turn on autoindenting.', 'Turn off autoindenting.'
48 'Turn on autoindenting.', 'Turn off autoindenting.'
49 )
49 )
50 addflag('automagic', 'InteractiveShell.automagic',
50 addflag('automagic', 'InteractiveShell.automagic',
51 """Turn on the auto calling of magic commands. Type %%magic at the
51 """Turn on the auto calling of magic commands. Type %%magic at the
52 IPython prompt for more information.""",
52 IPython prompt for more information.""",
53 'Turn off the auto calling of magic commands.'
53 'Turn off the auto calling of magic commands.'
54 )
54 )
55 addflag('pdb', 'InteractiveShell.pdb',
55 addflag('pdb', 'InteractiveShell.pdb',
56 "Enable auto calling the pdb debugger after every exception.",
56 "Enable auto calling the pdb debugger after every exception.",
57 "Disable auto calling the pdb debugger after every exception."
57 "Disable auto calling the pdb debugger after every exception."
58 )
58 )
59 # pydb flag doesn't do any config, as core.debugger switches on import,
59 # pydb flag doesn't do any config, as core.debugger switches on import,
60 # which is before parsing. This just allows the flag to be passed.
60 # which is before parsing. This just allows the flag to be passed.
61 shell_flags.update(dict(
61 shell_flags.update(dict(
62 pydb = ({},
62 pydb = ({},
63 """Use the third party 'pydb' package as debugger, instead of pdb.
63 """Use the third party 'pydb' package as debugger, instead of pdb.
64 Requires that pydb is installed."""
64 Requires that pydb is installed."""
65 )
65 )
66 ))
66 ))
67 addflag('pprint', 'PlainTextFormatter.pprint',
67 addflag('pprint', 'PlainTextFormatter.pprint',
68 "Enable auto pretty printing of results.",
68 "Enable auto pretty printing of results.",
69 "Disable auto auto pretty printing of results."
69 "Disable auto auto pretty printing of results."
70 )
70 )
71 addflag('color-info', 'InteractiveShell.color_info',
71 addflag('color-info', 'InteractiveShell.color_info',
72 """IPython can display information about objects via a set of func-
72 """IPython can display information about objects via a set of func-
73 tions, and optionally can use colors for this, syntax highlighting
73 tions, and optionally can use colors for this, syntax highlighting
74 source code and various other elements. However, because this
74 source code and various other elements. However, because this
75 information is passed through a pager (like 'less') and many pagers get
75 information is passed through a pager (like 'less') and many pagers get
76 confused with color codes, this option is off by default. You can test
76 confused with color codes, this option is off by default. You can test
77 it and turn it on permanently in your ipython_config.py file if it
77 it and turn it on permanently in your ipython_config.py file if it
78 works for you. Test it and turn it on permanently if it works with
78 works for you. Test it and turn it on permanently if it works with
79 your system. The magic function %%color_info allows you to toggle this
79 your system. The magic function %%color_info allows you to toggle this
80 interactively for testing.""",
80 interactively for testing.""",
81 "Disable using colors for info related things."
81 "Disable using colors for info related things."
82 )
82 )
83 addflag('deep-reload', 'InteractiveShell.deep_reload',
83 addflag('deep-reload', 'InteractiveShell.deep_reload',
84 """Enable deep (recursive) reloading by default. IPython can use the
84 """Enable deep (recursive) reloading by default. IPython can use the
85 deep_reload module which reloads changes in modules recursively (it
85 deep_reload module which reloads changes in modules recursively (it
86 replaces the reload() function, so you don't need to change anything to
86 replaces the reload() function, so you don't need to change anything to
87 use it). deep_reload() forces a full reload of modules whose code may
87 use it). deep_reload() forces a full reload of modules whose code may
88 have changed, which the default reload() function does not. When
88 have changed, which the default reload() function does not. When
89 deep_reload is off, IPython will use the normal reload(), but
89 deep_reload is off, IPython will use the normal reload(), but
90 deep_reload will still be available as dreload(). This feature is off
90 deep_reload will still be available as dreload(). This feature is off
91 by default [which means that you have both normal reload() and
91 by default [which means that you have both normal reload() and
92 dreload()].""",
92 dreload()].""",
93 "Disable deep (recursive) reloading by default."
93 "Disable deep (recursive) reloading by default."
94 )
94 )
95 nosep_config = Config()
95 nosep_config = Config()
96 nosep_config.InteractiveShell.separate_in = ''
96 nosep_config.InteractiveShell.separate_in = ''
97 nosep_config.InteractiveShell.separate_out = ''
97 nosep_config.InteractiveShell.separate_out = ''
98 nosep_config.InteractiveShell.separate_out2 = ''
98 nosep_config.InteractiveShell.separate_out2 = ''
99
99
100 shell_flags['nosep']=(nosep_config, "Eliminate all spacing between prompts.")
100 shell_flags['nosep']=(nosep_config, "Eliminate all spacing between prompts.")
101 shell_flags['pylab'] = (
101 shell_flags['pylab'] = (
102 {'InteractiveShellApp' : {'pylab' : 'auto'}},
102 {'InteractiveShellApp' : {'pylab' : 'auto'}},
103 """Pre-load matplotlib and numpy for interactive use with
103 """Pre-load matplotlib and numpy for interactive use with
104 the default matplotlib backend."""
104 the default matplotlib backend."""
105 )
105 )
106
106
107 # it's possible we don't want short aliases for *all* of these:
107 # it's possible we don't want short aliases for *all* of these:
108 shell_aliases = dict(
108 shell_aliases = dict(
109 autocall='InteractiveShell.autocall',
109 autocall='InteractiveShell.autocall',
110 colors='InteractiveShell.colors',
110 colors='InteractiveShell.colors',
111 logfile='InteractiveShell.logfile',
111 logfile='InteractiveShell.logfile',
112 logappend='InteractiveShell.logappend',
112 logappend='InteractiveShell.logappend',
113 c='InteractiveShellApp.code_to_run',
113 c='InteractiveShellApp.code_to_run',
114 m='InteractiveShellApp.module_to_run',
114 m='InteractiveShellApp.module_to_run',
115 ext='InteractiveShellApp.extra_extension',
115 ext='InteractiveShellApp.extra_extension',
116 gui='InteractiveShellApp.gui',
116 gui='InteractiveShellApp.gui',
117 pylab='InteractiveShellApp.pylab',
117 pylab='InteractiveShellApp.pylab',
118 )
118 )
119 shell_aliases['cache-size'] = 'InteractiveShell.cache_size'
119 shell_aliases['cache-size'] = 'InteractiveShell.cache_size'
120
120
121 #-----------------------------------------------------------------------------
121 #-----------------------------------------------------------------------------
122 # Main classes and functions
122 # Main classes and functions
123 #-----------------------------------------------------------------------------
123 #-----------------------------------------------------------------------------
124
124
125 class InteractiveShellApp(Configurable):
125 class InteractiveShellApp(Configurable):
126 """A Mixin for applications that start InteractiveShell instances.
126 """A Mixin for applications that start InteractiveShell instances.
127
127
128 Provides configurables for loading extensions and executing files
128 Provides configurables for loading extensions and executing files
129 as part of configuring a Shell environment.
129 as part of configuring a Shell environment.
130
130
131 The following methods should be called by the :meth:`initialize` method
131 The following methods should be called by the :meth:`initialize` method
132 of the subclass:
132 of the subclass:
133
133
134 - :meth:`init_path`
134 - :meth:`init_path`
135 - :meth:`init_shell` (to be implemented by the subclass)
135 - :meth:`init_shell` (to be implemented by the subclass)
136 - :meth:`init_gui_pylab`
136 - :meth:`init_gui_pylab`
137 - :meth:`init_extensions`
137 - :meth:`init_extensions`
138 - :meth:`init_code`
138 - :meth:`init_code`
139 """
139 """
140 extensions = List(Unicode, config=True,
140 extensions = List(Unicode, config=True,
141 help="A list of dotted module names of IPython extensions to load."
141 help="A list of dotted module names of IPython extensions to load."
142 )
142 )
143 extra_extension = Unicode('', config=True,
143 extra_extension = Unicode('', config=True,
144 help="dotted module name of an IPython extension to load."
144 help="dotted module name of an IPython extension to load."
145 )
145 )
146 def _extra_extension_changed(self, name, old, new):
146 def _extra_extension_changed(self, name, old, new):
147 if new:
147 if new:
148 # add to self.extensions
148 # add to self.extensions
149 self.extensions.append(new)
149 self.extensions.append(new)
150
150
151 # Extensions that are always loaded (not configurable)
151 # Extensions that are always loaded (not configurable)
152 default_extensions = List(Unicode, [u'storemagic'], config=False)
152 default_extensions = List(Unicode, [u'storemagic'], config=False)
153
153
154 exec_files = List(Unicode, config=True,
154 exec_files = List(Unicode, config=True,
155 help="""List of files to run at IPython startup."""
155 help="""List of files to run at IPython startup."""
156 )
156 )
157 file_to_run = Unicode('', config=True,
157 file_to_run = Unicode('', config=True,
158 help="""A file to be run""")
158 help="""A file to be run""")
159
159
160 exec_lines = List(Unicode, config=True,
160 exec_lines = List(Unicode, config=True,
161 help="""lines of code to run at IPython startup."""
161 help="""lines of code to run at IPython startup."""
162 )
162 )
163 code_to_run = Unicode('', config=True,
163 code_to_run = Unicode('', config=True,
164 help="Execute the given command string."
164 help="Execute the given command string."
165 )
165 )
166 module_to_run = Unicode('', config=True,
166 module_to_run = Unicode('', config=True,
167 help="Run the module as a script."
167 help="Run the module as a script."
168 )
168 )
169 gui = CaselessStrEnum(('qt', 'wx', 'gtk', 'glut', 'pyglet', 'osx'), config=True,
169 gui = CaselessStrEnum(('qt', 'wx', 'gtk', 'glut', 'pyglet', 'osx'), config=True,
170 help="Enable GUI event loop integration ('qt', 'wx', 'gtk', 'glut', 'pyglet', 'osx')."
170 help="Enable GUI event loop integration ('qt', 'wx', 'gtk', 'glut', 'pyglet', 'osx')."
171 )
171 )
172 pylab = CaselessStrEnum(['tk', 'qt', 'wx', 'gtk', 'osx', 'inline', 'auto'],
172 pylab = CaselessStrEnum(['tk', 'qt', 'wx', 'gtk', 'osx', 'inline', 'auto'],
173 config=True,
173 config=True,
174 help="""Pre-load matplotlib and numpy for interactive use,
174 help="""Pre-load matplotlib and numpy for interactive use,
175 selecting a particular matplotlib backend and loop integration.
175 selecting a particular matplotlib backend and loop integration.
176 """
176 """
177 )
177 )
178 pylab_import_all = Bool(True, config=True,
178 pylab_import_all = Bool(True, config=True,
179 help="""If true, an 'import *' is done from numpy and pylab,
179 help="""If true, IPython will populate the user namespace with numpy, pylab, etc.
180 when using pylab"""
180 and an 'import *' is done from numpy and pylab, when using pylab mode.
181
182 When False, pylab mode should not import any names into the user namespace.
183 """
181 )
184 )
182 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
185 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
183
186
184 def init_path(self):
187 def init_path(self):
185 """Add current working directory, '', to sys.path"""
188 """Add current working directory, '', to sys.path"""
186 if sys.path[0] != '':
189 if sys.path[0] != '':
187 sys.path.insert(0, '')
190 sys.path.insert(0, '')
188
191
189 def init_shell(self):
192 def init_shell(self):
190 raise NotImplementedError("Override in subclasses")
193 raise NotImplementedError("Override in subclasses")
191
194
192 def init_gui_pylab(self):
195 def init_gui_pylab(self):
193 """Enable GUI event loop integration, taking pylab into account."""
196 """Enable GUI event loop integration, taking pylab into account."""
194 if self.gui or self.pylab:
197 if self.gui or self.pylab:
195 shell = self.shell
198 shell = self.shell
196 try:
199 try:
197 if self.pylab:
200 if self.pylab:
198 gui, backend = pylabtools.find_gui_and_backend(self.pylab)
201 gui, backend = pylabtools.find_gui_and_backend(self.pylab)
199 self.log.info("Enabling GUI event loop integration, "
202 self.log.info("Enabling GUI event loop integration, "
200 "toolkit=%s, pylab=%s" % (gui, self.pylab))
203 "toolkit=%s, pylab=%s" % (gui, self.pylab))
201 shell.enable_pylab(gui, import_all=self.pylab_import_all, welcome_message=True)
204 if self.pylab == "auto":
205 print ("using matplotlib backend: %s" % backend)
206 shell.enable_pylab(self.pylab, import_all=self.pylab_import_all)
202 else:
207 else:
203 self.log.info("Enabling GUI event loop integration, "
208 self.log.info("Enabling GUI event loop integration, "
204 "toolkit=%s" % self.gui)
209 "toolkit=%s" % self.gui)
205 shell.enable_gui(self.gui)
210 shell.enable_gui(self.gui)
206 except ImportError:
211 except ImportError:
207 self.log.warn("pylab mode doesn't work as matplotlib could not be found." + \
212 self.log.warn("pylab mode doesn't work as matplotlib could not be found." + \
208 "\nIs it installed on the system?")
213 "\nIs it installed on the system?")
209 self.shell.showtraceback()
214 self.shell.showtraceback()
210 except Exception:
215 except Exception:
211 self.log.warn("GUI event loop or pylab initialization failed")
216 self.log.warn("GUI event loop or pylab initialization failed")
212 self.shell.showtraceback()
217 self.shell.showtraceback()
213
218
214 def init_extensions(self):
219 def init_extensions(self):
215 """Load all IPython extensions in IPythonApp.extensions.
220 """Load all IPython extensions in IPythonApp.extensions.
216
221
217 This uses the :meth:`ExtensionManager.load_extensions` to load all
222 This uses the :meth:`ExtensionManager.load_extensions` to load all
218 the extensions listed in ``self.extensions``.
223 the extensions listed in ``self.extensions``.
219 """
224 """
220 try:
225 try:
221 self.log.debug("Loading IPython extensions...")
226 self.log.debug("Loading IPython extensions...")
222 extensions = self.default_extensions + self.extensions
227 extensions = self.default_extensions + self.extensions
223 for ext in extensions:
228 for ext in extensions:
224 try:
229 try:
225 self.log.info("Loading IPython extension: %s" % ext)
230 self.log.info("Loading IPython extension: %s" % ext)
226 self.shell.extension_manager.load_extension(ext)
231 self.shell.extension_manager.load_extension(ext)
227 except:
232 except:
228 self.log.warn("Error in loading extension: %s" % ext +
233 self.log.warn("Error in loading extension: %s" % ext +
229 "\nCheck your config files in %s" % self.profile_dir.location
234 "\nCheck your config files in %s" % self.profile_dir.location
230 )
235 )
231 self.shell.showtraceback()
236 self.shell.showtraceback()
232 except:
237 except:
233 self.log.warn("Unknown error in loading extensions:")
238 self.log.warn("Unknown error in loading extensions:")
234 self.shell.showtraceback()
239 self.shell.showtraceback()
235
240
236 def init_code(self):
241 def init_code(self):
237 """run the pre-flight code, specified via exec_lines"""
242 """run the pre-flight code, specified via exec_lines"""
238 self._run_startup_files()
243 self._run_startup_files()
239 self._run_exec_lines()
244 self._run_exec_lines()
240 self._run_exec_files()
245 self._run_exec_files()
241 self._run_cmd_line_code()
246 self._run_cmd_line_code()
242 self._run_module()
247 self._run_module()
243
248
244 # flush output, so itwon't be attached to the first cell
249 # flush output, so itwon't be attached to the first cell
245 sys.stdout.flush()
250 sys.stdout.flush()
246 sys.stderr.flush()
251 sys.stderr.flush()
247
252
248 # Hide variables defined here from %who etc.
253 # Hide variables defined here from %who etc.
249 self.shell.user_ns_hidden.update(self.shell.user_ns)
254 self.shell.user_ns_hidden.update(self.shell.user_ns)
250
255
251 def _run_exec_lines(self):
256 def _run_exec_lines(self):
252 """Run lines of code in IPythonApp.exec_lines in the user's namespace."""
257 """Run lines of code in IPythonApp.exec_lines in the user's namespace."""
253 if not self.exec_lines:
258 if not self.exec_lines:
254 return
259 return
255 try:
260 try:
256 self.log.debug("Running code from IPythonApp.exec_lines...")
261 self.log.debug("Running code from IPythonApp.exec_lines...")
257 for line in self.exec_lines:
262 for line in self.exec_lines:
258 try:
263 try:
259 self.log.info("Running code in user namespace: %s" %
264 self.log.info("Running code in user namespace: %s" %
260 line)
265 line)
261 self.shell.run_cell(line, store_history=False)
266 self.shell.run_cell(line, store_history=False)
262 except:
267 except:
263 self.log.warn("Error in executing line in user "
268 self.log.warn("Error in executing line in user "
264 "namespace: %s" % line)
269 "namespace: %s" % line)
265 self.shell.showtraceback()
270 self.shell.showtraceback()
266 except:
271 except:
267 self.log.warn("Unknown error in handling IPythonApp.exec_lines:")
272 self.log.warn("Unknown error in handling IPythonApp.exec_lines:")
268 self.shell.showtraceback()
273 self.shell.showtraceback()
269
274
270 def _exec_file(self, fname):
275 def _exec_file(self, fname):
271 try:
276 try:
272 full_filename = filefind(fname, [u'.', self.ipython_dir])
277 full_filename = filefind(fname, [u'.', self.ipython_dir])
273 except IOError as e:
278 except IOError as e:
274 self.log.warn("File not found: %r"%fname)
279 self.log.warn("File not found: %r"%fname)
275 return
280 return
276 # Make sure that the running script gets a proper sys.argv as if it
281 # Make sure that the running script gets a proper sys.argv as if it
277 # were run from a system shell.
282 # were run from a system shell.
278 save_argv = sys.argv
283 save_argv = sys.argv
279 sys.argv = [full_filename] + self.extra_args[1:]
284 sys.argv = [full_filename] + self.extra_args[1:]
280 # protect sys.argv from potential unicode strings on Python 2:
285 # protect sys.argv from potential unicode strings on Python 2:
281 if not py3compat.PY3:
286 if not py3compat.PY3:
282 sys.argv = [ py3compat.cast_bytes(a) for a in sys.argv ]
287 sys.argv = [ py3compat.cast_bytes(a) for a in sys.argv ]
283 try:
288 try:
284 if os.path.isfile(full_filename):
289 if os.path.isfile(full_filename):
285 self.log.info("Running file in user namespace: %s" %
290 self.log.info("Running file in user namespace: %s" %
286 full_filename)
291 full_filename)
287 # Ensure that __file__ is always defined to match Python
292 # Ensure that __file__ is always defined to match Python
288 # behavior.
293 # behavior.
289 with preserve_keys(self.shell.user_ns, '__file__'):
294 with preserve_keys(self.shell.user_ns, '__file__'):
290 self.shell.user_ns['__file__'] = fname
295 self.shell.user_ns['__file__'] = fname
291 if full_filename.endswith('.ipy'):
296 if full_filename.endswith('.ipy'):
292 self.shell.safe_execfile_ipy(full_filename)
297 self.shell.safe_execfile_ipy(full_filename)
293 else:
298 else:
294 # default to python, even without extension
299 # default to python, even without extension
295 self.shell.safe_execfile(full_filename,
300 self.shell.safe_execfile(full_filename,
296 self.shell.user_ns)
301 self.shell.user_ns)
297 finally:
302 finally:
298 sys.argv = save_argv
303 sys.argv = save_argv
299
304
300 def _run_startup_files(self):
305 def _run_startup_files(self):
301 """Run files from profile startup directory"""
306 """Run files from profile startup directory"""
302 startup_dir = self.profile_dir.startup_dir
307 startup_dir = self.profile_dir.startup_dir
303 startup_files = []
308 startup_files = []
304 if os.environ.get('PYTHONSTARTUP', False):
309 if os.environ.get('PYTHONSTARTUP', False):
305 startup_files.append(os.environ['PYTHONSTARTUP'])
310 startup_files.append(os.environ['PYTHONSTARTUP'])
306 startup_files += glob.glob(os.path.join(startup_dir, '*.py'))
311 startup_files += glob.glob(os.path.join(startup_dir, '*.py'))
307 startup_files += glob.glob(os.path.join(startup_dir, '*.ipy'))
312 startup_files += glob.glob(os.path.join(startup_dir, '*.ipy'))
308 if not startup_files:
313 if not startup_files:
309 return
314 return
310
315
311 self.log.debug("Running startup files from %s...", startup_dir)
316 self.log.debug("Running startup files from %s...", startup_dir)
312 try:
317 try:
313 for fname in sorted(startup_files):
318 for fname in sorted(startup_files):
314 self._exec_file(fname)
319 self._exec_file(fname)
315 except:
320 except:
316 self.log.warn("Unknown error in handling startup files:")
321 self.log.warn("Unknown error in handling startup files:")
317 self.shell.showtraceback()
322 self.shell.showtraceback()
318
323
319 def _run_exec_files(self):
324 def _run_exec_files(self):
320 """Run files from IPythonApp.exec_files"""
325 """Run files from IPythonApp.exec_files"""
321 if not self.exec_files:
326 if not self.exec_files:
322 return
327 return
323
328
324 self.log.debug("Running files in IPythonApp.exec_files...")
329 self.log.debug("Running files in IPythonApp.exec_files...")
325 try:
330 try:
326 for fname in self.exec_files:
331 for fname in self.exec_files:
327 self._exec_file(fname)
332 self._exec_file(fname)
328 except:
333 except:
329 self.log.warn("Unknown error in handling IPythonApp.exec_files:")
334 self.log.warn("Unknown error in handling IPythonApp.exec_files:")
330 self.shell.showtraceback()
335 self.shell.showtraceback()
331
336
332 def _run_cmd_line_code(self):
337 def _run_cmd_line_code(self):
333 """Run code or file specified at the command-line"""
338 """Run code or file specified at the command-line"""
334 if self.code_to_run:
339 if self.code_to_run:
335 line = self.code_to_run
340 line = self.code_to_run
336 try:
341 try:
337 self.log.info("Running code given at command line (c=): %s" %
342 self.log.info("Running code given at command line (c=): %s" %
338 line)
343 line)
339 self.shell.run_cell(line, store_history=False)
344 self.shell.run_cell(line, store_history=False)
340 except:
345 except:
341 self.log.warn("Error in executing line in user namespace: %s" %
346 self.log.warn("Error in executing line in user namespace: %s" %
342 line)
347 line)
343 self.shell.showtraceback()
348 self.shell.showtraceback()
344
349
345 # Like Python itself, ignore the second if the first of these is present
350 # Like Python itself, ignore the second if the first of these is present
346 elif self.file_to_run:
351 elif self.file_to_run:
347 fname = self.file_to_run
352 fname = self.file_to_run
348 try:
353 try:
349 self._exec_file(fname)
354 self._exec_file(fname)
350 except:
355 except:
351 self.log.warn("Error in executing file in user namespace: %s" %
356 self.log.warn("Error in executing file in user namespace: %s" %
352 fname)
357 fname)
353 self.shell.showtraceback()
358 self.shell.showtraceback()
354
359
355 def _run_module(self):
360 def _run_module(self):
356 """Run module specified at the command-line."""
361 """Run module specified at the command-line."""
357 if self.module_to_run:
362 if self.module_to_run:
358 # Make sure that the module gets a proper sys.argv as if it were
363 # Make sure that the module gets a proper sys.argv as if it were
359 # run using `python -m`.
364 # run using `python -m`.
360 save_argv = sys.argv
365 save_argv = sys.argv
361 sys.argv = [sys.executable] + self.extra_args
366 sys.argv = [sys.executable] + self.extra_args
362 try:
367 try:
363 self.shell.safe_run_module(self.module_to_run,
368 self.shell.safe_run_module(self.module_to_run,
364 self.shell.user_ns)
369 self.shell.user_ns)
365 finally:
370 finally:
366 sys.argv = save_argv
371 sys.argv = save_argv
@@ -1,139 +1,140 b''
1 """Tests for pylab tools module.
1 """Tests for pylab tools module.
2 """
2 """
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (c) 2011, the IPython Development Team.
4 # Copyright (c) 2011, the IPython Development Team.
5 #
5 #
6 # Distributed under the terms of the Modified BSD License.
6 # Distributed under the terms of the Modified BSD License.
7 #
7 #
8 # The full license is in the file COPYING.txt, distributed with this software.
8 # The full license is in the file COPYING.txt, distributed with this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 from __future__ import print_function
14 from __future__ import print_function
15
15
16 # Stdlib imports
16 # Stdlib imports
17
17
18 # Third-party imports
18 # Third-party imports
19 import matplotlib; matplotlib.use('Agg')
19 import matplotlib; matplotlib.use('Agg')
20 import nose.tools as nt
20 import nose.tools as nt
21
21
22 from matplotlib import pyplot as plt
22 from matplotlib import pyplot as plt
23 import numpy as np
23 import numpy as np
24
24
25 # Our own imports
25 # Our own imports
26 from IPython.core.interactiveshell import InteractiveShell
26 from IPython.testing import decorators as dec
27 from IPython.testing import decorators as dec
27 from .. import pylabtools as pt
28 from .. import pylabtools as pt
28
29
29 #-----------------------------------------------------------------------------
30 #-----------------------------------------------------------------------------
30 # Globals and constants
31 # Globals and constants
31 #-----------------------------------------------------------------------------
32 #-----------------------------------------------------------------------------
32
33
33 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
34 # Local utilities
35 # Local utilities
35 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
36
37
37 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
38 # Classes and functions
39 # Classes and functions
39 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
40
41
41 @dec.parametric
42 @dec.parametric
42 def test_figure_to_svg():
43 def test_figure_to_svg():
43 # simple empty-figure test
44 # simple empty-figure test
44 fig = plt.figure()
45 fig = plt.figure()
45 yield nt.assert_equal(pt.print_figure(fig, 'svg'), None)
46 yield nt.assert_equal(pt.print_figure(fig, 'svg'), None)
46
47
47 plt.close('all')
48 plt.close('all')
48
49
49 # simple check for at least svg-looking output
50 # simple check for at least svg-looking output
50 fig = plt.figure()
51 fig = plt.figure()
51 ax = fig.add_subplot(1,1,1)
52 ax = fig.add_subplot(1,1,1)
52 ax.plot([1,2,3])
53 ax.plot([1,2,3])
53 plt.draw()
54 plt.draw()
54 svg = pt.print_figure(fig, 'svg')[:100].lower()
55 svg = pt.print_figure(fig, 'svg')[:100].lower()
55 yield nt.assert_true('doctype svg' in svg)
56 yield nt.assert_true('doctype svg' in svg)
56
57
57
58
58 def test_import_pylab():
59 def test_import_pylab():
59 ip = get_ipython()
60 ip = get_ipython()
60 ns = {}
61 ns = {}
61 pt.import_pylab(ns, import_all=False)
62 pt.import_pylab(ns, import_all=False)
62 nt.assert_true('plt' in ns)
63 nt.assert_true('plt' in ns)
63 nt.assert_equal(ns['np'], np)
64 nt.assert_equal(ns['np'], np)
64
65
65
66 class TestPylabSwitch(object):
66 class TestPylabSwitch(object):
67 class Shell(object):
67 class Shell(InteractiveShell):
68 pylab_gui_select = None
68 def enable_gui(self, gui):
69 pass
69
70
70 def setup(self):
71 def setup(self):
71 import matplotlib
72 import matplotlib
72 def act_mpl(backend):
73 def act_mpl(backend):
73 matplotlib.rcParams['backend'] = backend
74 matplotlib.rcParams['backend'] = backend
74
75
75 # Save rcParams since they get modified
76 # Save rcParams since they get modified
76 self._saved_rcParams = matplotlib.rcParams
77 self._saved_rcParams = matplotlib.rcParams
77 matplotlib.rcParams = dict(backend='Qt4Agg')
78 matplotlib.rcParams = dict(backend='Qt4Agg')
78
79
79 # Mock out functions
80 # Mock out functions
80 self._save_am = pt.activate_matplotlib
81 self._save_am = pt.activate_matplotlib
81 pt.activate_matplotlib = act_mpl
82 pt.activate_matplotlib = act_mpl
82 self._save_ip = pt.import_pylab
83 self._save_ip = pt.import_pylab
83 pt.import_pylab = lambda *a,**kw:None
84 pt.import_pylab = lambda *a,**kw:None
84 self._save_cis = pt.configure_inline_support
85 self._save_cis = pt.configure_inline_support
85 pt.configure_inline_support = lambda *a,**kw:None
86 pt.configure_inline_support = lambda *a,**kw:None
86
87
87 def teardown(self):
88 def teardown(self):
88 pt.activate_matplotlib = self._save_am
89 pt.activate_matplotlib = self._save_am
89 pt.import_pylab = self._save_ip
90 pt.import_pylab = self._save_ip
90 pt.configure_inline_support = self._save_cis
91 pt.configure_inline_support = self._save_cis
91 import matplotlib
92 import matplotlib
92 matplotlib.rcParams = self._saved_rcParams
93 matplotlib.rcParams = self._saved_rcParams
93
94
94 def test_qt(self):
95 def test_qt(self):
95 s = self.Shell()
96 s = self.Shell()
96 gui = pt.pylab_activate(dict(), None, False, s)
97 gui, backend = s.enable_matplotlib(None)
97 nt.assert_equal(gui, 'qt')
98 nt.assert_equal(gui, 'qt')
98 nt.assert_equal(s.pylab_gui_select, 'qt')
99 nt.assert_equal(s.pylab_gui_select, 'qt')
99
100
100 gui = pt.pylab_activate(dict(), 'inline', False, s)
101 gui, backend = s.enable_matplotlib('inline')
101 nt.assert_equal(gui, 'inline')
102 nt.assert_equal(gui, 'inline')
102 nt.assert_equal(s.pylab_gui_select, 'qt')
103 nt.assert_equal(s.pylab_gui_select, 'qt')
103
104
104 gui = pt.pylab_activate(dict(), 'qt', False, s)
105 gui, backend = s.enable_matplotlib('qt')
105 nt.assert_equal(gui, 'qt')
106 nt.assert_equal(gui, 'qt')
106 nt.assert_equal(s.pylab_gui_select, 'qt')
107 nt.assert_equal(s.pylab_gui_select, 'qt')
107
108
108 gui = pt.pylab_activate(dict(), 'inline', False, s)
109 gui, backend = s.enable_matplotlib('inline')
109 nt.assert_equal(gui, 'inline')
110 nt.assert_equal(gui, 'inline')
110 nt.assert_equal(s.pylab_gui_select, 'qt')
111 nt.assert_equal(s.pylab_gui_select, 'qt')
111
112
112 gui = pt.pylab_activate(dict(), None, False, s)
113 gui, backend = s.enable_matplotlib()
113 nt.assert_equal(gui, 'qt')
114 nt.assert_equal(gui, 'qt')
114 nt.assert_equal(s.pylab_gui_select, 'qt')
115 nt.assert_equal(s.pylab_gui_select, 'qt')
115
116
116 def test_inline(self):
117 def test_inline(self):
117 s = self.Shell()
118 s = self.Shell()
118 gui = pt.pylab_activate(dict(), 'inline', False, s)
119 gui, backend = s.enable_matplotlib('inline')
119 nt.assert_equal(gui, 'inline')
120 nt.assert_equal(gui, 'inline')
120 nt.assert_equal(s.pylab_gui_select, None)
121 nt.assert_equal(s.pylab_gui_select, None)
121
122
122 gui = pt.pylab_activate(dict(), 'inline', False, s)
123 gui, backend = s.enable_matplotlib('inline')
123 nt.assert_equal(gui, 'inline')
124 nt.assert_equal(gui, 'inline')
124 nt.assert_equal(s.pylab_gui_select, None)
125 nt.assert_equal(s.pylab_gui_select, None)
125
126
126 gui = pt.pylab_activate(dict(), 'qt', False, s)
127 gui, backend = s.enable_matplotlib('qt')
127 nt.assert_equal(gui, 'qt')
128 nt.assert_equal(gui, 'qt')
128 nt.assert_equal(s.pylab_gui_select, 'qt')
129 nt.assert_equal(s.pylab_gui_select, 'qt')
129
130
130 def test_qt_gtk(self):
131 def test_qt_gtk(self):
131 s = self.Shell()
132 s = self.Shell()
132 gui = pt.pylab_activate(dict(), 'qt', False, s)
133 gui, backend = s.enable_matplotlib('qt')
133 nt.assert_equal(gui, 'qt')
134 nt.assert_equal(gui, 'qt')
134 nt.assert_equal(s.pylab_gui_select, 'qt')
135 nt.assert_equal(s.pylab_gui_select, 'qt')
135
136
136 gui = pt.pylab_activate(dict(), 'gtk', False, s)
137 gui, backend = s.enable_matplotlib('gtk')
137 nt.assert_equal(gui, 'qt')
138 nt.assert_equal(gui, 'qt')
138 nt.assert_equal(s.pylab_gui_select, 'qt')
139 nt.assert_equal(s.pylab_gui_select, 'qt')
139
140
@@ -1,178 +1,182 b''
1 """An in-process kernel"""
1 """An in-process kernel"""
2
2
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (C) 2012 The IPython Development Team
4 # Copyright (C) 2012 The IPython Development Team
5 #
5 #
6 # Distributed under the terms of the BSD License. The full license is in
6 # Distributed under the terms of the BSD License. The full license is in
7 # the file COPYING, distributed as part of this software.
7 # the file COPYING, distributed as part of this software.
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9
9
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Imports
11 # Imports
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 # Standard library imports
14 # Standard library imports
15 from contextlib import contextmanager
15 from contextlib import contextmanager
16 import logging
16 import logging
17 import sys
17 import sys
18
18
19 # Local imports
19 # Local imports
20 from IPython.core.interactiveshell import InteractiveShellABC
20 from IPython.core.interactiveshell import InteractiveShellABC
21 from IPython.utils.jsonutil import json_clean
21 from IPython.utils.jsonutil import json_clean
22 from IPython.utils.traitlets import Any, Enum, Instance, List, Type
22 from IPython.utils.traitlets import Any, Enum, Instance, List, Type
23 from IPython.kernel.zmq.ipkernel import Kernel
23 from IPython.kernel.zmq.ipkernel import Kernel
24 from IPython.kernel.zmq.zmqshell import ZMQInteractiveShell
24 from IPython.kernel.zmq.zmqshell import ZMQInteractiveShell
25
25
26 from .socket import DummySocket
26 from .socket import DummySocket
27
27
28 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
29 # Main kernel class
29 # Main kernel class
30 #-----------------------------------------------------------------------------
30 #-----------------------------------------------------------------------------
31
31
32 class InProcessKernel(Kernel):
32 class InProcessKernel(Kernel):
33
33
34 #-------------------------------------------------------------------------
34 #-------------------------------------------------------------------------
35 # InProcessKernel interface
35 # InProcessKernel interface
36 #-------------------------------------------------------------------------
36 #-------------------------------------------------------------------------
37
37
38 # The frontends connected to this kernel.
38 # The frontends connected to this kernel.
39 frontends = List(
39 frontends = List(
40 Instance('IPython.kernel.inprocess.client.InProcessKernelClient')
40 Instance('IPython.kernel.inprocess.client.InProcessKernelClient')
41 )
41 )
42
42
43 # The GUI environment that the kernel is running under. This need not be
43 # The GUI environment that the kernel is running under. This need not be
44 # specified for the normal operation for the kernel, but is required for
44 # specified for the normal operation for the kernel, but is required for
45 # IPython's GUI support (including pylab). The default is 'inline' because
45 # IPython's GUI support (including pylab). The default is 'inline' because
46 # it is safe under all GUI toolkits.
46 # it is safe under all GUI toolkits.
47 gui = Enum(('tk', 'gtk', 'wx', 'qt', 'qt4', 'inline'),
47 gui = Enum(('tk', 'gtk', 'wx', 'qt', 'qt4', 'inline'),
48 default_value='inline')
48 default_value='inline')
49
49
50 raw_input_str = Any()
50 raw_input_str = Any()
51 stdout = Any()
51 stdout = Any()
52 stderr = Any()
52 stderr = Any()
53
53
54 #-------------------------------------------------------------------------
54 #-------------------------------------------------------------------------
55 # Kernel interface
55 # Kernel interface
56 #-------------------------------------------------------------------------
56 #-------------------------------------------------------------------------
57
57
58 shell_class = Type()
58 shell_class = Type()
59 shell_streams = List()
59 shell_streams = List()
60 control_stream = Any()
60 control_stream = Any()
61 iopub_socket = Instance(DummySocket, ())
61 iopub_socket = Instance(DummySocket, ())
62 stdin_socket = Instance(DummySocket, ())
62 stdin_socket = Instance(DummySocket, ())
63
63
64 def __init__(self, **traits):
64 def __init__(self, **traits):
65 # When an InteractiveShell is instantiated by our base class, it binds
65 # When an InteractiveShell is instantiated by our base class, it binds
66 # the current values of sys.stdout and sys.stderr.
66 # the current values of sys.stdout and sys.stderr.
67 with self._redirected_io():
67 with self._redirected_io():
68 super(InProcessKernel, self).__init__(**traits)
68 super(InProcessKernel, self).__init__(**traits)
69
69
70 self.iopub_socket.on_trait_change(self._io_dispatch, 'message_sent')
70 self.iopub_socket.on_trait_change(self._io_dispatch, 'message_sent')
71 self.shell.kernel = self
71 self.shell.kernel = self
72
72
73 def execute_request(self, stream, ident, parent):
73 def execute_request(self, stream, ident, parent):
74 """ Override for temporary IO redirection. """
74 """ Override for temporary IO redirection. """
75 with self._redirected_io():
75 with self._redirected_io():
76 super(InProcessKernel, self).execute_request(stream, ident, parent)
76 super(InProcessKernel, self).execute_request(stream, ident, parent)
77
77
78 def start(self):
78 def start(self):
79 """ Override registration of dispatchers for streams. """
79 """ Override registration of dispatchers for streams. """
80 self.shell.exit_now = False
80 self.shell.exit_now = False
81
81
82 def _abort_queue(self, stream):
82 def _abort_queue(self, stream):
83 """ The in-process kernel doesn't abort requests. """
83 """ The in-process kernel doesn't abort requests. """
84 pass
84 pass
85
85
86 def _raw_input(self, prompt, ident, parent):
86 def _raw_input(self, prompt, ident, parent):
87 # Flush output before making the request.
87 # Flush output before making the request.
88 self.raw_input_str = None
88 self.raw_input_str = None
89 sys.stderr.flush()
89 sys.stderr.flush()
90 sys.stdout.flush()
90 sys.stdout.flush()
91
91
92 # Send the input request.
92 # Send the input request.
93 content = json_clean(dict(prompt=prompt))
93 content = json_clean(dict(prompt=prompt))
94 msg = self.session.msg(u'input_request', content, parent)
94 msg = self.session.msg(u'input_request', content, parent)
95 for frontend in self.frontends:
95 for frontend in self.frontends:
96 if frontend.session.session == parent['header']['session']:
96 if frontend.session.session == parent['header']['session']:
97 frontend.stdin_channel.call_handlers(msg)
97 frontend.stdin_channel.call_handlers(msg)
98 break
98 break
99 else:
99 else:
100 logging.error('No frontend found for raw_input request')
100 logging.error('No frontend found for raw_input request')
101 return str()
101 return str()
102
102
103 # Await a response.
103 # Await a response.
104 while self.raw_input_str is None:
104 while self.raw_input_str is None:
105 frontend.stdin_channel.process_events()
105 frontend.stdin_channel.process_events()
106 return self.raw_input_str
106 return self.raw_input_str
107
107
108 #-------------------------------------------------------------------------
108 #-------------------------------------------------------------------------
109 # Protected interface
109 # Protected interface
110 #-------------------------------------------------------------------------
110 #-------------------------------------------------------------------------
111
111
112 @contextmanager
112 @contextmanager
113 def _redirected_io(self):
113 def _redirected_io(self):
114 """ Temporarily redirect IO to the kernel.
114 """ Temporarily redirect IO to the kernel.
115 """
115 """
116 sys_stdout, sys_stderr = sys.stdout, sys.stderr
116 sys_stdout, sys_stderr = sys.stdout, sys.stderr
117 sys.stdout, sys.stderr = self.stdout, self.stderr
117 sys.stdout, sys.stderr = self.stdout, self.stderr
118 yield
118 yield
119 sys.stdout, sys.stderr = sys_stdout, sys_stderr
119 sys.stdout, sys.stderr = sys_stdout, sys_stderr
120
120
121 #------ Trait change handlers --------------------------------------------
121 #------ Trait change handlers --------------------------------------------
122
122
123 def _io_dispatch(self):
123 def _io_dispatch(self):
124 """ Called when a message is sent to the IO socket.
124 """ Called when a message is sent to the IO socket.
125 """
125 """
126 ident, msg = self.session.recv(self.iopub_socket, copy=False)
126 ident, msg = self.session.recv(self.iopub_socket, copy=False)
127 for frontend in self.frontends:
127 for frontend in self.frontends:
128 frontend.iopub_channel.call_handlers(msg)
128 frontend.iopub_channel.call_handlers(msg)
129
129
130 #------ Trait initializers -----------------------------------------------
130 #------ Trait initializers -----------------------------------------------
131
131
132 def _log_default(self):
132 def _log_default(self):
133 return logging.getLogger(__name__)
133 return logging.getLogger(__name__)
134
134
135 def _session_default(self):
135 def _session_default(self):
136 from IPython.kernel.zmq.session import Session
136 from IPython.kernel.zmq.session import Session
137 return Session(parent=self)
137 return Session(parent=self)
138
138
139 def _shell_class_default(self):
139 def _shell_class_default(self):
140 return InProcessInteractiveShell
140 return InProcessInteractiveShell
141
141
142 def _stdout_default(self):
142 def _stdout_default(self):
143 from IPython.kernel.zmq.iostream import OutStream
143 from IPython.kernel.zmq.iostream import OutStream
144 return OutStream(self.session, self.iopub_socket, u'stdout', pipe=False)
144 return OutStream(self.session, self.iopub_socket, u'stdout', pipe=False)
145
145
146 def _stderr_default(self):
146 def _stderr_default(self):
147 from IPython.kernel.zmq.iostream import OutStream
147 from IPython.kernel.zmq.iostream import OutStream
148 return OutStream(self.session, self.iopub_socket, u'stderr', pipe=False)
148 return OutStream(self.session, self.iopub_socket, u'stderr', pipe=False)
149
149
150 #-----------------------------------------------------------------------------
150 #-----------------------------------------------------------------------------
151 # Interactive shell subclass
151 # Interactive shell subclass
152 #-----------------------------------------------------------------------------
152 #-----------------------------------------------------------------------------
153
153
154 class InProcessInteractiveShell(ZMQInteractiveShell):
154 class InProcessInteractiveShell(ZMQInteractiveShell):
155
155
156 kernel = Instance('IPython.kernel.inprocess.ipkernel.InProcessKernel')
156 kernel = Instance('IPython.kernel.inprocess.ipkernel.InProcessKernel')
157
157
158 #-------------------------------------------------------------------------
158 #-------------------------------------------------------------------------
159 # InteractiveShell interface
159 # InteractiveShell interface
160 #-------------------------------------------------------------------------
160 #-------------------------------------------------------------------------
161
161
162 def enable_gui(self, gui=None):
162 def enable_gui(self, gui=None):
163 """ Enable GUI integration for the kernel.
163 """Enable GUI integration for the kernel."""
164 """
165 from IPython.kernel.zmq.eventloops import enable_gui
164 from IPython.kernel.zmq.eventloops import enable_gui
166 if not gui:
165 if not gui:
167 gui = self.kernel.gui
166 gui = self.kernel.gui
168 enable_gui(gui, kernel=self.kernel)
167 return enable_gui(gui, kernel=self.kernel)
168
169 def enable_matplotlib(self, gui=None):
170 """Enable matplotlib integration for the kernel."""
171 if not gui:
172 gui = self.kernel.gui
173 return super(InProcessInteractiveShell, self).enable_matplotlib(gui)
169
174
170 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
175 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
171 """ Activate pylab support at runtime.
176 """Activate pylab support at runtime."""
172 """
173 if not gui:
177 if not gui:
174 gui = self.kernel.gui
178 gui = self.kernel.gui
175 super(InProcessInteractiveShell, self).enable_pylab(gui, import_all,
179 return super(InProcessInteractiveShell, self).enable_pylab(gui, import_all,
176 welcome_message)
180 welcome_message)
177
181
178 InteractiveShellABC.register(InProcessInteractiveShell)
182 InteractiveShellABC.register(InProcessInteractiveShell)
@@ -1,91 +1,91 b''
1 #-------------------------------------------------------------------------------
1 #-------------------------------------------------------------------------------
2 # Copyright (C) 2012 The IPython Development Team
2 # Copyright (C) 2012 The IPython Development Team
3 #
3 #
4 # Distributed under the terms of the BSD License. The full license is in
4 # Distributed under the terms of the BSD License. The full license is in
5 # the file COPYING, distributed as part of this software.
5 # the file COPYING, distributed as part of this software.
6 #-------------------------------------------------------------------------------
6 #-------------------------------------------------------------------------------
7
7
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9 # Imports
9 # Imports
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 from __future__ import print_function
11 from __future__ import print_function
12
12
13 # Standard library imports
13 # Standard library imports
14 from StringIO import StringIO
14 from StringIO import StringIO
15 import sys
15 import sys
16 import unittest
16 import unittest
17
17
18 # Local imports
18 # Local imports
19 from IPython.kernel.inprocess.blocking import BlockingInProcessKernelClient
19 from IPython.kernel.inprocess.blocking import BlockingInProcessKernelClient
20 from IPython.kernel.inprocess.manager import InProcessKernelManager
20 from IPython.kernel.inprocess.manager import InProcessKernelManager
21 from IPython.kernel.inprocess.ipkernel import InProcessKernel
21 from IPython.kernel.inprocess.ipkernel import InProcessKernel
22 from IPython.testing.decorators import skipif_not_matplotlib
22 from IPython.testing.decorators import skipif_not_matplotlib
23 from IPython.utils.io import capture_output
23 from IPython.utils.io import capture_output
24 from IPython.utils import py3compat
24 from IPython.utils import py3compat
25
25
26 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
27 # Test case
27 # Test case
28 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
29
29
30 class InProcessKernelTestCase(unittest.TestCase):
30 class InProcessKernelTestCase(unittest.TestCase):
31
31
32 def setUp(self):
32 def setUp(self):
33 self.km = InProcessKernelManager()
33 self.km = InProcessKernelManager()
34 self.km.start_kernel()
34 self.km.start_kernel()
35 self.kc = BlockingInProcessKernelClient(kernel=self.km.kernel)
35 self.kc = BlockingInProcessKernelClient(kernel=self.km.kernel)
36 self.kc.start_channels()
36 self.kc.start_channels()
37
37
38 @skipif_not_matplotlib
38 @skipif_not_matplotlib
39 def test_pylab(self):
39 def test_pylab(self):
40 """ Does pylab work in the in-process kernel?
40 """ Does pylab work in the in-process kernel?
41 """
41 """
42 kc = self.kc
42 kc = self.kc
43 kc.execute('%pylab')
43 kc.execute('%pylab')
44 msg = get_stream_message(kc)
44 msg = get_stream_message(kc)
45 self.assert_('Welcome to pylab' in msg['content']['data'])
45 self.assert_('matplotlib' in msg['content']['data'])
46
46
47 def test_raw_input(self):
47 def test_raw_input(self):
48 """ Does the in-process kernel handle raw_input correctly?
48 """ Does the in-process kernel handle raw_input correctly?
49 """
49 """
50 io = StringIO('foobar\n')
50 io = StringIO('foobar\n')
51 sys_stdin = sys.stdin
51 sys_stdin = sys.stdin
52 sys.stdin = io
52 sys.stdin = io
53 try:
53 try:
54 if py3compat.PY3:
54 if py3compat.PY3:
55 self.kc.execute('x = input()')
55 self.kc.execute('x = input()')
56 else:
56 else:
57 self.kc.execute('x = raw_input()')
57 self.kc.execute('x = raw_input()')
58 finally:
58 finally:
59 sys.stdin = sys_stdin
59 sys.stdin = sys_stdin
60 self.assertEqual(self.km.kernel.shell.user_ns.get('x'), 'foobar')
60 self.assertEqual(self.km.kernel.shell.user_ns.get('x'), 'foobar')
61
61
62 def test_stdout(self):
62 def test_stdout(self):
63 """ Does the in-process kernel correctly capture IO?
63 """ Does the in-process kernel correctly capture IO?
64 """
64 """
65 kernel = InProcessKernel()
65 kernel = InProcessKernel()
66
66
67 with capture_output() as io:
67 with capture_output() as io:
68 kernel.shell.run_cell('print("foo")')
68 kernel.shell.run_cell('print("foo")')
69 self.assertEqual(io.stdout, 'foo\n')
69 self.assertEqual(io.stdout, 'foo\n')
70
70
71 kc = BlockingInProcessKernelClient(kernel=kernel)
71 kc = BlockingInProcessKernelClient(kernel=kernel)
72 kernel.frontends.append(kc)
72 kernel.frontends.append(kc)
73 kc.shell_channel.execute('print("bar")')
73 kc.shell_channel.execute('print("bar")')
74 msg = get_stream_message(kc)
74 msg = get_stream_message(kc)
75 self.assertEqual(msg['content']['data'], 'bar\n')
75 self.assertEqual(msg['content']['data'], 'bar\n')
76
76
77 #-----------------------------------------------------------------------------
77 #-----------------------------------------------------------------------------
78 # Utility functions
78 # Utility functions
79 #-----------------------------------------------------------------------------
79 #-----------------------------------------------------------------------------
80
80
81 def get_stream_message(kernel_client, timeout=5):
81 def get_stream_message(kernel_client, timeout=5):
82 """ Gets a single stream message synchronously from the sub channel.
82 """ Gets a single stream message synchronously from the sub channel.
83 """
83 """
84 while True:
84 while True:
85 msg = kernel_client.get_iopub_msg(timeout=timeout)
85 msg = kernel_client.get_iopub_msg(timeout=timeout)
86 if msg['header']['msg_type'] == 'stream':
86 if msg['header']['msg_type'] == 'stream':
87 return msg
87 return msg
88
88
89
89
90 if __name__ == '__main__':
90 if __name__ == '__main__':
91 unittest.main()
91 unittest.main()
@@ -1,119 +1,117 b''
1 """Test suite for pylab_import_all magic
1 """Test suite for pylab_import_all magic
2 Modified from the irunner module but using regex.
2 Modified from the irunner module but using regex.
3 """
3 """
4 from __future__ import print_function
4 from __future__ import print_function
5
5
6 # Global to make tests extra verbose and help debugging
6 # Global to make tests extra verbose and help debugging
7 VERBOSE = True
7 VERBOSE = True
8
8
9 # stdlib imports
9 # stdlib imports
10 import StringIO
10 import StringIO
11 import sys
11 import sys
12 import unittest
12 import unittest
13 import re
13 import re
14
14
15 # IPython imports
15 # IPython imports
16 from IPython.lib import irunner
16 from IPython.lib import irunner
17 from IPython.testing import decorators
17 from IPython.testing import decorators
18
18
19 def pylab_not_importable():
19 def pylab_not_importable():
20 """Test if importing pylab fails. (For example, when having no display)"""
20 """Test if importing pylab fails. (For example, when having no display)"""
21 try:
21 try:
22 import pylab
22 import pylab
23 return False
23 return False
24 except:
24 except:
25 return True
25 return True
26
26
27 # Testing code begins
27 # Testing code begins
28 class RunnerTestCase(unittest.TestCase):
28 class RunnerTestCase(unittest.TestCase):
29
29
30 def setUp(self):
30 def setUp(self):
31 self.out = StringIO.StringIO()
31 self.out = StringIO.StringIO()
32 #self.out = sys.stdout
32 #self.out = sys.stdout
33
33
34 def _test_runner(self,runner,source,output):
34 def _test_runner(self,runner,source,output):
35 """Test that a given runner's input/output match."""
35 """Test that a given runner's input/output match."""
36
36
37 runner.run_source(source)
37 runner.run_source(source)
38 out = self.out.getvalue()
38 out = self.out.getvalue()
39 #out = ''
39 #out = ''
40 # this output contains nasty \r\n lineends, and the initial ipython
40 # this output contains nasty \r\n lineends, and the initial ipython
41 # banner. clean it up for comparison, removing lines of whitespace
41 # banner. clean it up for comparison, removing lines of whitespace
42 output_l = [l for l in output.splitlines() if l and not l.isspace()]
42 output_l = [l for l in output.splitlines() if l and not l.isspace()]
43 out_l = [l for l in out.splitlines() if l and not l.isspace()]
43 out_l = [l for l in out.splitlines() if l and not l.isspace()]
44 mismatch = 0
44 mismatch = 0
45 if len(output_l) != len(out_l):
45 if len(output_l) != len(out_l):
46 message = ("Mismatch in number of lines\n\n"
46 message = ("Mismatch in number of lines\n\n"
47 "Expected:\n"
47 "Expected:\n"
48 "~~~~~~~~~\n"
48 "~~~~~~~~~\n"
49 "%s\n\n"
49 "%s\n\n"
50 "Got:\n"
50 "Got:\n"
51 "~~~~~~~~~\n"
51 "~~~~~~~~~\n"
52 "%s"
52 "%s"
53 ) % ("\n".join(output_l), "\n".join(out_l))
53 ) % ("\n".join(output_l), "\n".join(out_l))
54 self.fail(message)
54 self.fail(message)
55 for n in range(len(output_l)):
55 for n in range(len(output_l)):
56 # Do a line-by-line comparison
56 # Do a line-by-line comparison
57 ol1 = output_l[n].strip()
57 ol1 = output_l[n].strip()
58 ol2 = out_l[n].strip()
58 ol2 = out_l[n].strip()
59 if not re.match(ol1,ol2):
59 if not re.match(ol1,ol2):
60 mismatch += 1
60 mismatch += 1
61 if VERBOSE:
61 if VERBOSE:
62 print('<<< line %s does not match:' % n)
62 print('<<< line %s does not match:' % n)
63 print(repr(ol1))
63 print(repr(ol1))
64 print(repr(ol2))
64 print(repr(ol2))
65 print('>>>')
65 print('>>>')
66 self.assertTrue(mismatch==0,'Number of mismatched lines: %s' %
66 self.assertTrue(mismatch==0,'Number of mismatched lines: %s' %
67 mismatch)
67 mismatch)
68
68
69 @decorators.skipif_not_matplotlib
69 @decorators.skipif_not_matplotlib
70 @decorators.skipif(pylab_not_importable, "Likely a run without X.")
70 @decorators.skipif(pylab_not_importable, "Likely a run without X.")
71 def test_pylab_import_all_enabled(self):
71 def test_pylab_import_all_enabled(self):
72 "Verify that plot is available when pylab_import_all = True"
72 "Verify that plot is available when pylab_import_all = True"
73 source = """
73 source = """
74 from IPython.config.application import Application
74 from IPython.config.application import Application
75 app = Application.instance()
75 app = Application.instance()
76 app.pylab_import_all = True
76 app.pylab_import_all = True
77 pylab
77 pylab
78 ip=get_ipython()
78 ip=get_ipython()
79 'plot' in ip.user_ns
79 'plot' in ip.user_ns
80 """
80 """
81 output = """
81 output = """
82 In \[1\]: from IPython\.config\.application import Application
82 In \[1\]: from IPython\.config\.application import Application
83 In \[2\]: app = Application\.instance\(\)
83 In \[2\]: app = Application\.instance\(\)
84 In \[3\]: app\.pylab_import_all = True
84 In \[3\]: app\.pylab_import_all = True
85 In \[4\]: pylab
85 In \[4\]: pylab
86 ^Welcome to pylab, a matplotlib-based Python environment
86 ^using matplotlib backend:
87 For more information, type 'help\(pylab\)'\.
88 In \[5\]: ip=get_ipython\(\)
87 In \[5\]: ip=get_ipython\(\)
89 In \[6\]: \'plot\' in ip\.user_ns
88 In \[6\]: \'plot\' in ip\.user_ns
90 Out\[6\]: True
89 Out\[6\]: True
91 """
90 """
92 runner = irunner.IPythonRunner(out=self.out)
91 runner = irunner.IPythonRunner(out=self.out)
93 self._test_runner(runner,source,output)
92 self._test_runner(runner,source,output)
94
93
95 @decorators.skipif_not_matplotlib
94 @decorators.skipif_not_matplotlib
96 @decorators.skipif(pylab_not_importable, "Likely a run without X.")
95 @decorators.skipif(pylab_not_importable, "Likely a run without X.")
97 def test_pylab_import_all_disabled(self):
96 def test_pylab_import_all_disabled(self):
98 "Verify that plot is not available when pylab_import_all = False"
97 "Verify that plot is not available when pylab_import_all = False"
99 source = """
98 source = """
100 from IPython.config.application import Application
99 from IPython.config.application import Application
101 app = Application.instance()
100 app = Application.instance()
102 app.pylab_import_all = False
101 app.pylab_import_all = False
103 pylab
102 pylab
104 ip=get_ipython()
103 ip=get_ipython()
105 'plot' in ip.user_ns
104 'plot' in ip.user_ns
106 """
105 """
107 output = """
106 output = """
108 In \[1\]: from IPython\.config\.application import Application
107 In \[1\]: from IPython\.config\.application import Application
109 In \[2\]: app = Application\.instance\(\)
108 In \[2\]: app = Application\.instance\(\)
110 In \[3\]: app\.pylab_import_all = False
109 In \[3\]: app\.pylab_import_all = False
111 In \[4\]: pylab
110 In \[4\]: pylab
112 ^Welcome to pylab, a matplotlib-based Python environment
111 ^using matplotlib backend:
113 For more information, type 'help\(pylab\)'\.
114 In \[5\]: ip=get_ipython\(\)
112 In \[5\]: ip=get_ipython\(\)
115 In \[6\]: \'plot\' in ip\.user_ns
113 In \[6\]: \'plot\' in ip\.user_ns
116 Out\[6\]: False
114 Out\[6\]: False
117 """
115 """
118 runner = irunner.IPythonRunner(out=self.out)
116 runner = irunner.IPythonRunner(out=self.out)
119 self._test_runner(runner,source,output)
117 self._test_runner(runner,source,output)
@@ -1,54 +1,58 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Decorators that don't go anywhere else.
2 """Decorators that don't go anywhere else.
3
3
4 This module contains misc. decorators that don't really go with another module
4 This module contains misc. decorators that don't really go with another module
5 in :mod:`IPython.utils`. Beore putting something here please see if it should
5 in :mod:`IPython.utils`. Beore putting something here please see if it should
6 go into another topical module in :mod:`IPython.utils`.
6 go into another topical module in :mod:`IPython.utils`.
7 """
7 """
8
8
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10 # Copyright (C) 2008-2011 The IPython Development Team
10 # Copyright (C) 2008-2011 The IPython Development Team
11 #
11 #
12 # Distributed under the terms of the BSD License. The full license is in
12 # Distributed under the terms of the BSD License. The full license is in
13 # the file COPYING, distributed as part of this software.
13 # the file COPYING, distributed as part of this software.
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15
15
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17 # Imports
17 # Imports
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19
19
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21 # Code
21 # Code
22 #-----------------------------------------------------------------------------
22 #-----------------------------------------------------------------------------
23
23
24 def flag_calls(func):
24 def flag_calls(func):
25 """Wrap a function to detect and flag when it gets called.
25 """Wrap a function to detect and flag when it gets called.
26
26
27 This is a decorator which takes a function and wraps it in a function with
27 This is a decorator which takes a function and wraps it in a function with
28 a 'called' attribute. wrapper.called is initialized to False.
28 a 'called' attribute. wrapper.called is initialized to False.
29
29
30 The wrapper.called attribute is set to False right before each call to the
30 The wrapper.called attribute is set to False right before each call to the
31 wrapped function, so if the call fails it remains False. After the call
31 wrapped function, so if the call fails it remains False. After the call
32 completes, wrapper.called is set to True and the output is returned.
32 completes, wrapper.called is set to True and the output is returned.
33
33
34 Testing for truth in wrapper.called allows you to determine if a call to
34 Testing for truth in wrapper.called allows you to determine if a call to
35 func() was attempted and succeeded."""
35 func() was attempted and succeeded."""
36
36
37 # don't wrap twice
38 if hasattr(func, 'called'):
39 return func
40
37 def wrapper(*args,**kw):
41 def wrapper(*args,**kw):
38 wrapper.called = False
42 wrapper.called = False
39 out = func(*args,**kw)
43 out = func(*args,**kw)
40 wrapper.called = True
44 wrapper.called = True
41 return out
45 return out
42
46
43 wrapper.called = False
47 wrapper.called = False
44 wrapper.__doc__ = func.__doc__
48 wrapper.__doc__ = func.__doc__
45 return wrapper
49 return wrapper
46
50
47 def undoc(func):
51 def undoc(func):
48 """Mark a function or class as undocumented.
52 """Mark a function or class as undocumented.
49
53
50 This is found by inspecting the AST, so for now it must be used directly
54 This is found by inspecting the AST, so for now it must be used directly
51 as @undoc, not as e.g. @decorators.undoc
55 as @undoc, not as e.g. @decorators.undoc
52 """
56 """
53 return func
57 return func
54
58
General Comments 0
You need to be logged in to leave comments. Login now