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